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

Aar*_*ron 9 vim

:vimgrep 看起来真的很有用.

以下是如何使用它:

:vim[grep][!] /{pattern}/[g][j] {file} ... 
Run Code Online (Sandbox Code Playgroud)

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

我想做的是vimgrep任何:

  • :args
  • :files
  • :buffers

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

Luc*_*tte 11

你不能把这些命令中的结果捕获到register(:h :redir)中,然后将其插回到:vimgrepcall(带a :exe)中.

就像是:

:exe "vimgrep/pattern/ " . lh#askvim#Exe(':args')
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 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(),' ')
Run Code Online (Sandbox Code Playgroud)


Jer*_*rub 5

你可以这样做:

:bufdo vimgrep /pattern/ %
Run Code Online (Sandbox Code Playgroud)

%替换缓冲区名称.


Ste*_*eve 5

要 [vim]grep 参数列表中的文件列表,您可以使用##(参见 参考资料:help cmdline-special)。

:vimgrep /re/ ##
Run Code Online (Sandbox Code Playgroud)

我不知道缓冲区列表有类似的简写,但您也许可以执行以下操作:

:argdelete ##
:bufdo argadd %
Run Code Online (Sandbox Code Playgroud)

...然后使用##. 或者使用:n打开新文件(将添加到arg列表中)而不是:e.