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
。