VIM:将多个不连续的文本块拖入寄存器

ffl*_*ing 3 vim regex

我有一些文本行遵循某种模式,而另一些则不遵循某种模式。我想复制遵循此模式的行,然后将它们复制/拉入寄存器,以便我可以像其他地方一样粘贴它们。

例子:

def function_1(param1,param2):
    // do something1
    // do something2
    // do something3
    return

def function_Nullify(param=None):
    // does nothing
    pass
Run Code Online (Sandbox Code Playgroud)

现在我基本上想选择匹配的行def.*$,复制并粘贴它们。

所以输出看起来像这样:

def function_1(param1,param2):
def function_Nullify(param=None):
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以在 vim 中做到这一点。

像将匹配的正则表达式行复制到寄存器“m”之类的东西。然后我就可以在需要的地方执行“mp”。


我知道像 sed、awk 或 grep 这样带有一些重定向运算符的东西可能更适合这项任务,但我想知道是否可以使用 vim 来完成此任务。

FDi*_*off 6

您可以使用"Myy(大写字母 M)追加到寄存器 m 中。这允许您编写一个全局命令来提取所有匹配的行def.*$并将所有行提取到 m 寄存器中。然后你所要做的就是粘贴 m 寄存器来获取内容"mp

:g/def.*$/normal "Myy
Run Code Online (Sandbox Code Playgroud)

上面的全局命令告诉您找到与模式匹配的所有行def.*$并在正常模式下执行该命令"Myy

然而这有一个问题。如果启动时 m 寄存器不为空,会发生什么情况。好吧,您最终会得到上次放入寄存器的内容以及您附加的所有内容。

要清空寄存器,您可以使用将寄存器设置为空字符串。

:let @m=''
Run Code Online (Sandbox Code Playgroud)

所以在 vim 中你可以输入

:let @m=''
:g/def.*$/normal "Myy
Run Code Online (Sandbox Code Playgroud)

将所有匹配的内容def.*$拉入 m 寄存器。

  • 更短的替代方案:`:g/def.*$/y M`。 (5认同)