11

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

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

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

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

4

2 回答 2

17

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

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

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

:set wildignore=*.dll,*.exe
于 2013-09-24T09:39:23.207 回答
1

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

: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 ( http://vimcasts.org/episodes/meet-the-arglist/ )。


这种方法的优点:

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

wildignore正如@Ingo-karat 指出的那样,您仍然应该仔细填写,因为wildignore很多程序都在使用它。


如何进一步改进

而不是vimgrep,也许您可​​以直接使用gr并且您可以通过 直接为其提供-lI参数greprg。但是,我还没有尝试过。

于 2018-06-01T23:37:23.173 回答