:vimgrep
看起来非常有用。
以下是如何使用它:
:vim[grep][!] /{pattern}/[g][j] {file} ...
:help
表示你可以用{file}
来为当前目录命名*.c
。我可能已经用一个足够复杂的文件列表启动了Vim,我不想为{file}
手动输入它,而且Vim已经知道这些文件是什么了。
我想做的是vimgrep,而不是:
:args
:files
:buffers
我将使用哪些变量代替{file}
来命名vimgrep
命令中的任何列表?
答案 0 :(得分:11)
您无法将这些命令中的结果捕获到寄存器(:h :redir
)中,并将其重新插入:vimgrep
调用(使用:exe
)。
类似的东西:
:exe "vimgrep/pattern/ " . lh#askvim#Exe(':args')
注意:
:redir
的封套;没什么好复杂的:args
)join(argv(), ' ')
案例中的:args
function BuffersList()
let all = range(0, bufnr('$'))
let res = []
for b in all
if buflisted(b)
call add(res, bufname(b))
endif
endfor
return res
endfunction
:exe 'vimgrep/pattern/ '.join(BuffersList(),' ')
答案 1 :(得分:5)
你可以这样做:
:bufdo vimgrep /pattern/ %
%替换缓冲区名称。
答案 2 :(得分:3)
以下是其中一个答案的略微改进版本。以下命令在所有打开的选项卡中搜索模式,并在quickfix列表中记住结果:
:cex [] | tabdo vimgrepa /pattern/ %
cex []
将quickfix列表的内容设置为空列表。您需要先调用它,因为vimgrepa
会累积所有标签的搜索结果。此外,您可以将tabdo
替换为argdo
,bufdo
和windo
。
要查看搜索结果,请执行:
:cope
但是,此方法有限制:它只能搜索已经分配了文件名的选项卡(%
不会在新选项卡中展开。)
修改强>
您也可以在~/.vimrc
中将命令快捷方式转换为函数:
function TS(text)
exe "cex [] | tabdo vimgrepa /" . a:text . "/ %"
endfunction
command -nargs=1 TS call TS(<q-args>)
cnoreabbrev ts TS
使用最后一行,您可以像这样调用您的函数:
:ts from game import
ts
之后的单词是搜索模式。如果没有最后一行,则必须以大写形式键入函数名称。
答案 3 :(得分:2)
要[vim] grep参数列表中的文件列表,您可以使用##
(参见:help cmdline-special
)。
:vimgrep /re/ ##
我不知道缓冲区列表的类似简写,但你可以做类似的事情:
:argdelete ##
:bufdo argadd %
...然后使用##
。或者使用:n
打开新文件(将添加到arg列表中)而不是:e
。