仅显示匹配的行?


31

在一个长文件中,我想搜索一个大约匹配200行左右的模式。匹配的行在文件中的随机位置。
当一行匹配时,只有该行本身是相关的,上方或下方均无上下文。

通常,我会使用搜索/和跳过匹配n
但这意味着一次在屏幕上只有一两个相关的行。

在浏览结果行列表时,是否可以隐藏所有不匹配的行?


蛮力方法是删除所有不匹配的行,并在以后撤消该删除。但这在各种方面都是丑陋的,即使它不会以持久的撤消而结束...

Answers:


34
:vimgrep pattern %
:cwin

vimgrep会在当前文件(%)或您指定的任何文件中搜索您的模式。

cwin然后将在您的窗口中打开一个仅显示所需行的缓冲区。您几乎可以在cwin缓冲区中使用任何导航/搜索命令。按回车跳到源文件中光标下方的行。


1
:vimgrep可以缩写为:vim
D. Ben Knoble

我如何再次回到缓冲区?
pasha

还应如何关闭缓冲区?在此先感谢
pasha

从quickfix(窗口)缓冲区中,您可以在任意行上按回车键,以跳至原始缓冲区中的该位置。您可以从任何地方关闭cwindow缓冲区,也可以通过:ccl[ose]通常的方法关闭缓冲区(例如,切换到和:bd)。您可以通过:cw[indow]再次运行来重新打开quickfix缓冲区,它将使用您的上一个vimgrep结果。
Zach Ingbretsen

15

您可以使用列出所有匹配的行

:g/{pattern}

:print可以省略该命令;这是默认设置:g。)


1
这是“原始grep”(g/REgexp/p)...问题是您不能轻易跳到其中一场比赛,尽管...
Martin Tournoij

@Carpetsmoker:你是对的;为此,我有一个插件,请参见其他答案。
Ingo Karkat 2015年

这在许多情况下可能有用。可以将输出重定向到新的缓冲区吗?这样一来,仍然可以突出显示语法。(嗯...这引起了另一个问题,请稍等...)
Volker Siegel

@IngoKarkat是什么意思g。我认为这是一个全球模式。我通常用斜杠进行VI搜索,/pattern这样可以找到所有出现的情况。您可以通过按字母导航到他们n
Alexander Cska

@AlexanderCska:不,它不是搜索的修饰符,而是一个将:g[lobal]模式作为参数的单独命令。您可以在找到所有详细信息:help :global
Ingo Karkat

12

您可以使用foldmethodfoldexpr选项折叠不相关的行。

搜索后,最后的搜索将存储在@/寄存器中。因此,您可以像这样折叠所有不匹配的内容(仅适用于单行匹配):

:setlocal foldexpr=getline(v:lnum)=~@/?0:1 foldmethod=expr

可以在Vim Tips Wiki上找到更高级的方法,例如为可以显示或隐藏的上下文线添加多个级别的折叠,或匹配多行。


好像有set foldlevel=0需要吗?但这也许是默认的。
Volker Siegel

1
是的,默认值为零,但是如果没有默认值,则添加默认值不会有问题。:-)
2015年

但是现在...如何再次将其切换回无任何痕迹?
Volker Siegel

在正常模式下,您可以使用“ zi”来切换折叠状态。
John O'M。

在大多数情况下,我首先:tab sp会在文件上获得新的一次性视图。然后回去就像:close杀死该选项卡一样简单或其他方法。

6

如果顺序无关紧要,则只需移动行即可。

:g/pat/m0

有关更多帮助,请参见:

:h :g
:h :m

1
并且:g/pat/m$(将匹配的行移到末尾)也可以,
Lerner Zhang

6

[d]删除所有不符合模式的行:

:g!/pattern/d

甚至更简单(感谢“ B层”的评论):

:v/pattern/d

是的,但是使用等价:v而不是更为传统:g!。(我不记得上次看到后者使用了,TBH!)
B层

2

如果要列出所有匹配的行(如我的其他答案),然后跳到一个特定的匹配项,我的FindOccurrence插件为此提供[/映射(并[n为最后一个搜索模式,而不是查询一个)。[/pattern列表,例如:g/pattern,但随后询问要跳转到的比赛编号。


0

另一种方法是使用:h :ilist,我用它来获得手册页的概述。结果看起来像这样:

~/find.~
  1:    3 NAME
  2:    6 SYNOPSIS
  3:    9 DESCRIPTION
  4:   18 OPTIONS
  5:   93 EXPRESSION
  6:  779 EXAMPLES
  7:  877 HISTORY
  8:  931 BUGS

这是一个小函数,让您选择按索引转到结果行:

function! s:select_ilist(ilist_result)
  if empty(a:ilist_result) || a:ilist_result =~# '^\_s*Error'
    return
  endif

  let select = input(a:ilist_result . "\ngoto : ")
  if empty(select) | return | endif

  " ilist result starts with '\nfilename\n', filename can be empty
  let lines = split(a:ilist_result[stridx(a:ilist_result, "\n", 1) : ], "\n")
  if select <= 0 || select > len(lines) | return | endif

  exec matchstr(lines[select-1], '^\v\s*\d+\:\s+\zs\d+')
endfunction

可以这样使用:

command! -buffer Section call s:select_ilist(execute('silent! ilist /\v\C^[A-Z][^a-z]+$/'))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.