在VIM中将搜索结果导入到其他选项卡/窗口/缓冲区

9
我发现了VIM搜索的一个不错特性,即列出所有的搜索结果及相应的行号。
例如:
:g/for.*bar/#

问题:有没有一种“简单”的方法将此内容传输到另一个窗口/选项卡/缓冲区中?

谢谢!


你的意思是“将此列表和数字放入新缓冲区”吗? - romainl
@romaini:确实。例如,将其拆分为两个窗口..可以从中复制内容,并进行滚动查看。目前我可以获取列表,但当我移动时,它就“消失”了。 - ezdazuzena
4个回答

12

我不知道如何将:g/for.*bar/#命令的输出导入到一个新缓冲区中,但我知道如何使用vimgrep获得几乎相同的结果。

尝试一下:

vimgrep "for.*bar" %
:copen

现在你有一个包含所有搜索结果的缓冲区,你甚至可以使用:cn:cp在它们之间导航。

查看:help quickfix


看起来这就是我要找的。您能否友好地解释一下“%”的作用?'copen'到底意味着什么,我的意思是,vimgrep的结果去哪了? - ezdazuzena
1
@ezdazuzena 确定的,% 只是在命令模式下被替换为当前文件的路径。 - Benj
关于我的问题的第二部分,我在这里找到了答案:http://blogs.gurulabs.com/stuart/archives/2006/08/vimgrep-copen.html。谢谢。 - ezdazuzena
快速修复窗口非常方便。如果您经常使用快速修复窗口,我建议为:cnext:cprev创建映射。我个人建议使用Tim Pope的unimpaired.vim插件(https://github.com/tpope/vim-unimpaired)。它提供了`]q`、`[q`和其他一些映射来移动快速修复列表。 - Peter Rincker
如果有人想知道,您可以在命令模式下使用 vimgrep。输入以下命令::vimgrep "for.*bar" % - liammulh

4

我不知道如何将输出直接重定向到缓冲区,但是您可以使用redir将其发送到寄存器,然后将该寄存器粘贴到新缓冲区。

:redir @a
:g/for.*bar/#
:redir END
:enew
:put! a
#(在:g之后)表示每个结果的行号。 您也可以将其发送到文件中。
:redir > file
:g/for.*bar/#
:redir END
:e file

请参见:help :redir以获取更多信息。

2
... 然后寄存器就可以被:put! a到新缓冲区中。 - Ingo Karkat
1
#在搜索末尾是什么意思?此外,这会包括行号吗?(我猜不会)你知道是否有任何方法可以使用此方法获取行号吗?如果能够以与s//p相同的方式执行g/some_pattern/get_ln() the_math/p,那么这将变得有些琐碎,但我找不到任何方法来实现。 - Christian Reall-Fluharty
1
@christianreallfluharty:给:global的哈希命令(#)会在匹配项前加上行号。 - Thor

1

针对被接受的答案进行补充:我做了一个映射,可以使用\ss(显示搜索)直接在快速修复窗口中打开最后一次搜索结果,将其添加到您的 .vimrc 文件中:

" show last search results on the quickfix window at windows bottom
nnoremap <silent><leader>ss :vimgrep /<C-r>\// % <CR> :botright copen <CR>

BR


0

虽然时间有点晚了,但是我采用了一种不同的方法,使用cword创建映射,然后将内容发送到缓冲区。对于我的工作流程来说,这是最有帮助的方式。

" Search for the word under the cursor in the entire file and take all lines and put them into a new vsplit buffer
noremap <leader>* :redir @s<CR>:silent g/^R^W/p<CR>:redir END<CR>:botright vnew<CR>:silent put s<CR>:nohlsearch<CR>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接