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

12

:vimgrep 看起来是一个非常有用的工具。

以下是使用它的方法:

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

:help说你可以使用类似于{file}的通配符来命名当前目录下的文件,例如*.c。但是如果我打开的文件列表很复杂,不想手动输入 {file},而且Vim已经知道这些文件,该怎么办呢?

我想要做的是在以下任何一个列表中运行vimgrep:

  • :args
  • :files
  • :buffers

那么,在 vimgrep 命令中,分别用哪些变量代替{file}来命名这些列表?

5个回答

11

你不能将这些命令的结果捕获到寄存器中(:h :redir),并将其插入回:vimgrep调用中(使用:exe)。

类似这样:

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

注意事项:

  • lh#askvim#Exe只是:redir的包装器;并不复杂。
  • 其中一些结果可能需要进行一些处理(参见添加了方括号的:args)。
  • 有时候会有一个函数恰好返回你想要的东西,例如在:args的情况下使用join(argv(), ' ')
  • 关于:buffers,可能是这样的:

.

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
BuffersList的工作方式正是我想要的。感谢Luc和Zathrus。 - Aaron
这个回答很有帮助,但是<a="grep.vim" rel = "nofollow noreferrer">http://www.vim.org/scripts/script.php?script_id=311">grep.vim</a>是一个vim插件,它使用系统的所有grep程序变体,在默认情况下搜索光标下的单词,并可以搜索文件、参数和打开的缓冲区。 - Aaron
您在 BuffersList 函数定义中有一个拼写错误。您使用了三个 f,而不是两个。由于这只是一个单字符更改,我无法编辑它。顺便说一句,回答得很好。 - Matthew Franglen

7
你可以这样做:
:bufdo vimgrep /pattern/ %

%代表缓冲区名称。


这是一个很棒的一行代码!我简直不敢相信我多年前不知道它。 - Clint Pachl

5
为了在参数列表中进行[vim]grep文件列表,您可以使用##(请参见::help cmdline-special)。
:vimgrep /re/ ##

我不知道有没有类似的缓冲区列表简写方式,但你可以尝试以下方法:

:argdelete ##
:bufdo argadd %

使用##可以在vim中快速转到之前编辑过的文件。或者使用:n打开新文件(会添加到参数列表),而不是使用:e


3
以下是其中一个答案的稍作修改的版本。下面的命令在所有打开的标签页中搜索模式,并将结果记忆在快速修复列表中:
:cex [] | tabdo vimgrepa /pattern/ %

cex []将快速修复列表的内容设置为空列表。您需要首先调用它,因为vimgrepa会累积来自所有选项卡的搜索结果。此外,您可以使用argdobufdowindo替换tabdo

要查看搜索结果,请执行以下操作:

: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后面的单词是搜索模式。如果没有最后一行,则必须以大写形式输入函数名称。


0
非常有用的脚本! 一个小修复:搜索会将其中一个缓冲区找到两次 - 第一次是作为编号缓冲区,第二次是作为缓冲区#0 =>备用缓冲区。 因此,我们应该将行改为“range(1, bufnr('$'))”,以跳过备用缓冲区并仅显示搜索结果一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接