如何将所有匹配的行放入一个缓冲区?

时间:2009-09-25 01:12:04

标签: vim

如何将所有匹配的线条拉入缓冲区?

给出如下文件:

match 1
skip
skip
match 2
match 3
skip

我希望能够发出命令将所有与模式匹配的行(/ ^匹配/用于此示例)放入单个缓冲区中,以便我可以将其放入另一个文档或摘要或其他任何内容。 / p>

该命令应该在缓冲区中结束:

match 1
match 2
match 3

我的第一个想法是尝试:

:g/^match/y

但我刚拿到最后一场比赛。这是有道理的,因为:g命令有效地为每个匹配行重复y

也许有办法将缓冲附加到缓冲区而不是覆盖它。我找不到了。

3 个答案:

答案 0 :(得分:82)

:g/^match/yank A

这会运行全局命令来抽取匹配^match的任何行并将其放入寄存器a。因为a是大写的,而不是仅仅将寄存器设置为值,它将附加到它。由于全局命令针对所有匹配行运行命令,因此您将获得彼此附加的所有行。

这意味着您可能希望在开始之前将寄存器重置为空字符串::let @a=""

当然,你可以将它与任何命名的寄存器一起使用。

答案 1 :(得分:13)

:help registers
:help quote_alpha

指定大写字母作为注册名称,以便附加到:yank A

答案 2 :(得分:8)

哦,我刚刚在评论之后意识到将匹配的行放入临时缓冲区很容易......

:r !grep "pattern" file.txt

一旦你放弃寻找它们,最简单的解决方案就来了。 :)