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

dao*_*oad 50 vim

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

给出如下文件:

match 1
skip
skip
match 2
match 3
skip
Run Code Online (Sandbox Code Playgroud)

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

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

match 1
match 2
match 3
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是尝试:

:g/^match/y
Run Code Online (Sandbox Code Playgroud)

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

也许有一种方法可以添加缓冲,而不是覆盖它.我找不到它.

ram*_*ion 88

:g/^match/yank A

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

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

当然,你可以使用任何命名的寄存器.

  • 这里隐含的是一个人不能附加到未命名的缓冲区,至少不能在一个命令中.您可能还需要先清除缓冲区:: let @ a ="" (26认同)
  • 如果您针对击键进行优化,只需提示一下.通过记录空宏qaq,可以更快地完成清除寄存器. (12认同)
  • 如果有人想知道 - 运行 `:h multi-repeat` 查看 `:g` 命令的文档 (4认同)
  • @JAFaucett 未命名 *register*,不是缓冲区。另外,你可以做到([基于这个答案](http://stackoverflow.com/a/18536633/210945)):`:%g/regexp/let @"=@".getline('. ')`。它将线条连接在一起,尽管可能有办法解决这个问题。 (3认同)

Jos*_*Lee 13

:help registers
:help quote_alpha
Run Code Online (Sandbox Code Playgroud)

指定一个大写字母作为寄存器名称,以便附加到它,例如:yank A.

  • 仅此提示不能回答这个问题.而不是`:g/^ match /"Ay`(如提到的那样)你需要做.eg`:g/^ match/normal"Ayy`或`:g/^ match/yank A`. (4认同)

das*_*ang 8

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

:r !grep "pattern" file.txt

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

  • 更通用的解决方案可以使用`expand('%')`作为当前缓冲区的文件名,例如`:let @ a = system('grep"pattern"'.expand('%'))` (2认同)