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

Vim 如何将所有匹配的行拉入一个缓冲区?,vim,Vim,如何将所有匹配的行拉入缓冲区 给定如下文件: match 1 skip skip match 2 match 3 skip 我希望能够发出一个命令,将与模式匹配的所有行(本例中为“/^match/”)拉入一个缓冲区,以便将其放入另一个文档或摘要或其他任何内容中 该命令应在缓冲区中结束: match 1 match 2 match 3 我的第一个想法是尝试: :g/^match/y 但我刚刚得到最后一场比赛。这是有意义的,因为:g命令有效地为每个匹配行重复y 也许有一种方法可以向缓冲区追加一

如何将所有匹配的行拉入缓冲区

给定如下文件:

match 1
skip
skip
match 2
match 3
skip
我希望能够发出一个命令,将与模式匹配的所有行(本例中为“/^match/”)拉入一个缓冲区,以便将其放入另一个文档或摘要或其他任何内容中

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

match 1
match 2
match 3
我的第一个想法是尝试:

:g/^match/y
但我刚刚得到最后一场比赛。这是有意义的,因为:g命令有效地为每个匹配行重复
y

也许有一种方法可以向缓冲区追加一个yank,而不是覆盖它。我找不到它

:help registers
:help quote_alpha

指定一个大写字母作为注册名称以便附加到它,如
:yank a

:g/^match/yank a

这将运行global命令来拖动与
^match
匹配的任何行,并将其放入寄存器
a
。因为
a
是大写的,所以它将附加到寄存器中,而不仅仅是将寄存器设置为值。由于global命令针对所有匹配的行运行该命令,因此,您将获得所有相互追加的行

这意味着您可能希望在开始之前将寄存器重置为空字符串:
:let@a=”“
qaq
(即录制空宏)

当然,您可以将其用于任何命名寄存器



哦,在上面的评论之后,我才意识到,将匹配行拉入临时缓冲区很容易

:r!grep“pattern”file.txt


一旦你放弃寻找,最简单的解决方案就会出现。:)

这里隐含的是不能附加到未命名的缓冲区,至少不能在单个命令中附加。您可能还需要先清除缓冲区::如果您优化了按键笔划,就让@a=”“作为提示。通过记录空宏qaq.@J.A.taucett未命名寄存器,而不是缓冲区,可以更快地清除寄存器。另外,您还可以这样做():
:%g/regexp/let@“=@”.getline('.')
。它将行连接在一起,尽管可能有一种解决方法。如果有人想知道-运行
:h multi-repeat
查看
:g
命令的文档,我整天都在做这类事情,并找到我想要的解决方案。我先执行
qaq
,然后执行
:g/pattern/normal“AY
(之前没有注意到:yank命令),然后转到我的缓冲区并粘贴它。没有直接重定向到缓冲区的直接方法吗?(之前我一直在做
:redir@a
:g/pattern/
:redir END
,所以这肯定是朝着正确的方向迈出的一步,但我只想要一步。更多。步骤…-)我想我可以很容易地写一个函数……我对这个问题投了赞成票,因为它对我很有用,并且投票关闭它,因为这是我看到的唯一一个说“这应该在superuser.com上”的方式。这是一个很好的问题,但我认为这是正确的位置。很抱歉“关闭”“投票是投票移动的唯一方式。@纳坦隆,我相信这个问题早在超级用户之前就出现了。不过,可能应该进行迁移。
:调用setreg('a',system('grep“pattern”file.txt'))
或者简单地调用
:let@a=system('grep“pattern”file.txt')
,如果您想将它放在寄存器中。更通用的解决方案可以对当前缓冲区的文件名使用
展开('%')
,例如
:let@a=system('grep“pattern”')。展开('%'))
仅此技巧无法回答问题。您需要做的不是
:g/^match/“Ay
(如所述)。例如
:g/^match/normal”Ayy
:g/^match/yank A