Answers:
:vimgrep pattern %
:cwin
vimgrep
会在当前文件(%
)或您指定的任何文件中搜索您的模式。
cwin
然后将在您的窗口中打开一个仅显示所需行的缓冲区。您几乎可以在cwin
缓冲区中使用任何导航/搜索命令。按回车跳到源文件中光标下方的行。
:ccl[ose]
通常的方法关闭缓冲区(例如,切换到和:bd
)。您可以通过:cw[indow]
再次运行来重新打开quickfix缓冲区,它将使用您的上一个vimgrep结果。
您可以使用列出所有匹配的行
:g/{pattern}
(:print
可以省略该命令;这是默认设置:g
。)
g/REgexp/p
)...问题是您不能轻易跳到其中一场比赛,尽管...
g
。我认为这是一个全球模式。我通常用斜杠进行VI搜索,/pattern
这样可以找到所有出现的情况。您可以通过按字母导航到他们n
:g[lobal]
模式作为参数的单独命令。您可以在找到所有详细信息:help :global
。
您可以使用foldmethod
和foldexpr
选项折叠不相关的行。
搜索后,最后的搜索将存储在@/
寄存器中。因此,您可以像这样折叠所有不匹配的内容(仅适用于单行匹配):
:setlocal foldexpr=getline(v:lnum)=~@/?0:1 foldmethod=expr
可以在Vim Tips Wiki上找到更高级的方法,例如为可以显示或隐藏的上下文线添加多个级别的折叠,或匹配多行。
set foldlevel=0
需要吗?但这也许是默认的。
:tab sp
会在文件上获得新的一次性视图。然后回去就像:close
杀死该选项卡一样简单或其他方法。
如果要列出所有匹配的行(如我的其他答案),然后跳到一个特定的匹配项,我的FindOccurrence插件为此提供[/
映射(并[n
为最后一个搜索模式,而不是查询一个)。[/pattern
列表,例如:g/pattern
,但随后询问要跳转到的比赛编号。
另一种方法是使用: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]+$/'))
:vimgrep
可以缩写为:vim