在缓冲区中搜索并显示“上下文”行

5
:vimgrep [search text] %  

and copen提供了一个清晰的列表,显示缓冲区中所有的[搜索文本]。
有没有一种方法可以在结果中包括每个匹配行之前和之后的行?我正在研究使用折叠来实现这一点,但还没有想出来...


你为什么要这样做?可能有更好的方法。 - doliver
5个回答

4
这里有一个类似的命令::g/[搜索文本]/-1,+1nu,它会显示与该行相邻的上下文以及该行的行号。您可以使用 :lnum(其中 lnum 是行号)快速跳转到该行。一般来说,我不会这样做 - 我会直接在快速修复列表上按“回车”以跳转并查看结果。

2
“nu”在“g/[search text]/-1,+1nu”中代表什么意思? - ITW
根据https://vimhelp.org/repeat.txt.html#%3Ag的说明,`-1,+1nu`是在`g[lobal]`搜索结果上执行的命令。在vim中键入`:help nu可以发现:nu[mber]:print`相同,但会在每行前加上行号。 - undefined

2
为了出现在快速修复窗口中,:vimgrep 也需要匹配上下文行。将“匹配上下文”的功能嵌入搜索正则表达式中会很困难,而且仍然无法折叠。
如果您使用 :grep 而不是 :vimgrep,则可以指定上下文(-C NUM),但这样做不会自动折叠。
另一种选择是通过 :autocmd QuickFixCmdPost 后处理快速修复结果,但获取和折叠这些行并不简单。
到目前为止,我看到的最接近的解决方案是 Folding with Regular Expression Vim Tips Wiki 页面上描述的折叠表达式。这仅适用于当前缓冲区,但设置起来很快,并启用(一两级)上下文折叠。

谢谢,维基页面上的第一个示例解决了问题(在调整foldlevel后)。 - Number8

0

foldutil插件可以折叠缓冲区,只留下与搜索模式匹配的区域展开。

通常情况下,它非常灵活,能够以各种方式折叠内容。您特定的使用情况将按照以下方式进行:

:FoldNonMatching <pattern> <number-of-context-lines>

举个例子,
:FoldNonMatching \<function\> 3

请务必阅读文档,以了解插件所能提供的全部功能。


0

如果您想在单独的窗口中显示带有上下文的搜索结果,可以执行以下操作:

:grep -C 1 MYSEARCH %   # search with 1 line of context
:cw                     # open the quickfix window

如果您不想看到由:grep打开的第一个窗口,可以使用:silent grep [...]

您将没有折叠,但除此之外它会完成工作!


0
不需要外部的grep,你可以使用:cdo:nu[mber]:p[rint]来打印两行上下文,就像这样:
:vimgrep "search pattern" %|cdo -2,+2print

如果结果在文件的开头或结尾,你会看到E16: 无效范围:-2,+2print要忽略无效行并打印可用内容:
:vimgrep "search pattern" *|cdo execute max([1, (line('.') - 2)]) . ',' . min([line('$'), (line('.') + 2)]) 'print'

其他参考信息

这个vim wiki的提示似乎正是我们想要的,但我无法让它工作。也许它只适用于实际的错误消息,而不适用于vimgrep的结果,尽管它们都使用了quickfix列表。https://vim.fandom.com/wiki/Show_entire_multiline_error_in_quickfix vim如何将源代码中的多行匹配转换为quickfix列表中的单行条目。How to make vim parse my multi-line error message for the quickfix window? 如何打印自己的完整quickfix列表,但我不认为这可以修改vimgrep的结果。https://vi.stackexchange.com/questions/10583/how-do-i-write-a-multi-line-message-to-the-quickfix-or-location-list 在quickfix列表中可以进行一些有限的格式设置,例如使用:set conceallevel=2 concealcursor=nc隐藏文件名。How to format Vim quickfix entries?

Vimgrep多行匹配

vimgrep多行匹配非常简单

  • .*匹配整行
  • \n匹配换行符
  • ()?使换行符可选,以防它位于文件的开头或结尾。

转义后的完整命令如下:

:vimgrep "\(.*\n\)\?.*search pattern.*\(\n.*\)\?" *

然而,快速修复列表不会显示多行条目,所以这是个死胡同。

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