在Vim中保存“所有打开缓冲区列表”的变量?

时间:2008-11-07 06:13:48

标签: vim

:vimgrep看起来非常有用。

以下是如何使用它:

:vim[grep][!] /{pattern}/[g][j] {file} ... 

:help表示你可以用{file}来为当前目录命名*.c。我可能已经用一个足够复杂的文件列表启动了Vim,我不想为{file}手动输入它,而且Vim已经知道这些文件是什么了。

我想做的是vimgrep,而不是:

  • :args
  • :files
  • :buffers

我将使用哪些变量代替{file}来命名vimgrep命令中的任何列表?

4 个答案:

答案 0 :(得分:11)

您无法将这些命令中的结果捕获到寄存器(:h :redir)中,并将其重新插入:vimgrep调用(使用:exe)。

类似的东西:

:exe "vimgrep/pattern/ " . lh#askvim#Exe(':args')

注意:

  • lh#askvim#Exe只是: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替换为argdobufdowindo

要查看搜索结果,请执行:

: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