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

hmae6n7t  于 5个月前  发布在  其他
关注(0)|答案(5)|浏览(82)
:vimgrep [search text] %

字符串
和copen给予缓冲区中所有[搜索文本]的列表。
有没有一种方法可以在结果中包括每一行之前和之后的行,有一个匹配?我在寻找折叠来实现这一点,但还没有弄清楚,但.

h9a6wy2h

h9a6wy2h1#

这里有一些类似的东西::g/[search text]/-1,+1nu,它将显示[search text]上下的上下文,沿着显示该行的行号。你可以使用:lnum快速跳转到那里,其中lnum是行号。一般来说,我不会这样做-我只会在quickfix列表上按回车键跳转并查看结果。

9vw9lbht

9vw9lbht2#

为了出现在quickfix窗口中,:vimgrep也需要匹配上下文行,在搜索正则表达式中建立“上下匹配”是很困难的,而且你仍然没有折叠。
如果使用:grep而不是:vimgrep,可以指定上下文(-C NUM),但这也不会自动折叠。
另一个选择是对quickfix结果进行后处理(通过:autocmd QuickFixCmdPost),但是获取和折叠这些行并不是小事。
到目前为止,我看到的最接近的解决方案是Folding with Regular Expression Vim Tips Wiki页面上描述的fold表达式。这仅适用于当前缓冲区,但它可以快速设置并启用(一级或二级)上下文折叠。

b4lqfgs4

b4lqfgs43#

foldutil插件可以折叠缓冲区,只留下与搜索模式匹配的区域展开。
一般来说,它非常灵活,能够以各种方式折叠东西。您的特定用例将像这样工作:

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

字符串
比如说,

:FoldNonMatching \<function\> 3


请务必阅读文档以了解插件可以提供的所有功能。

pb3skfrl

pb3skfrl4#

要在单独的窗口中显示搜索和上下文,您可以执行以下操作:

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

字符串
如果你不想看到:grep打开的第一个窗口,你可以使用:silent grep [...]
你不会有折叠,但否则它会做的工作!

7jmck4yq

7jmck4yq5#

不需要外部grep,你可以用:cdo:nu[mber]:p[rint]打印两行上下文,如下所示:

:vimgrep "search pattern" %|cdo -2,+2print

字符串
如果结果位于文件的开头或结尾,您将看到E16: Invalid range: -2,+2print . To ignore invalid lines and print whatever's available:

:vimgrep "search pattern" *|cdo execute max([1, (line('.') - 2)]) . ',' . min([line('$'), (line('.') + 2)]) 'print'

附加参考信息

Vimgrep多行匹配

vimgrep多行匹配很简单,

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

对于转义,完整的命令是:

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


但是the quickfix list will not display multi-line entries,这是个死胡同。

相关问题