如何在几个文件扩展名上使用vimgrep

时间:2013-09-24 09:23:25

标签: vim

所以我正在开发一个包含多种资源的项目:XML,javascript,QML,图像,3D场景。 我经常想在项目中搜索模式。使用vimgrep / mypattern / j **非常长,特别是因为它在二进制文件中搜索。 我可以用

:vimgrep /mypattern/j *.xml
:vimgrepadd /mypattern/j *.js

但我更愿意在一个命令中完成。

另一种看待它的方法:如何防止vimgrep在二进制文件中搜索?

2 个答案:

答案 0 :(得分:14)

您可以将多个文件整数传递给:vimgrep

:vimgrep /mypattern/j *.xml *.js

要排除某些文件,您可以配置'wildignore'选项以排除它们,例如

:set wildignore=*.dll,*.exe

答案 1 :(得分:0)

您可以使用vimfindgrep的组合来执行非常复杂的搜索。这是一个例子:

:vim /pattern/g `find ~ \( -type f -regextype posix-extended -regex '.*js' -exec grep -lI '.*' {} \;`

命令说明:

find ~ \( -type f -regextype posix-extended -regex '.*js'

这使您可以定义开始目录以开始搜索,然后在要搜索的文件名或日期上定义模式。

-type f:定义您应该只查找文件

-regextype posix-extended -regex '.*js':定义您应该搜索与模式.*js匹配的文件名。

-exec grep -lI '.*' {} \;:执行grep命令。这是必需的,因为find命令无法区分二进制文件和文本文件,因为它没有查看文件内部。 grep会查看内部文件。 .*告诉grep任何字符组合都匹配。

-lI:这表示grep查看前几位并确定文件是否为二进制。如果它是二进制文件,它将继续处理,就好像不匹配一样。 -l这里只打印出文件名的名称。

整个命令find ~ \( -type f -regextype posix-extended -regex '.*' -exec grep -lI '.*' {} \;作为argslist传递给vim(ElementTree documentation)。

此方法的优点:

  1. 您不必非常谨慎地定义wildignore以包含所有类型的二进制文件
  2. 您可以将命令保存在已保存的命令中,该命令保存在.viminfo中。通过使用q:,您可以调出以前输入的ex模式命令,然后在缓冲区内搜索以查找此特定命令,只需更改必要的字段
  3. 虽然您可以在终端中执行相同操作,但优点是您有一个已填充的quickfix列表,您可以在:cn
  4. 的quickfix列表中使用
  5. 当您通过多个程序管理命令时,实际执行时间应该低得多,vim将不会搜索大量二进制文件,默认情况下它将被列出,除非列出了每个二进制文件类型。
  6. 您不必在wildignore
  7. 中维护要忽略的大量二进制文件列表

    @ Ingo-karat指出,你仍然应该仔细填写wildignore,因为很多程序都会使用wildignore

    如何进一步改善

    您可以直接使用vimgrep代替gr,也可以通过-lI直接提供greprg参数。但是,我还没有尝试过。