所以我正在开发一个包含多种资源的项目:XML、javascript、QML、图像、3D 场景。我经常想在我的项目中搜索模式。使用 vimgrep /mypattern/j ** 很长,特别是因为它在二进制文件中搜索。我可以使用
:vimgrep /mypattern/j *.xml
:vimgrepadd /mypattern/j *.js
但我更愿意在一个命令中完成。
另一种看待它的方式:如何防止 vimgrep 在二进制文件中搜索?
所以我正在开发一个包含多种资源的项目:XML、javascript、QML、图像、3D 场景。我经常想在我的项目中搜索模式。使用 vimgrep /mypattern/j ** 很长,特别是因为它在二进制文件中搜索。我可以使用
:vimgrep /mypattern/j *.xml
:vimgrepadd /mypattern/j *.js
但我更愿意在一个命令中完成。
另一种看待它的方式:如何防止 vimgrep 在二进制文件中搜索?
您可以将多个文件 glob 传递给:vimgrep:
:vimgrep /mypattern/j *.xml *.js
要排除某些文件,您可以配置'wildignore'排除它们的选项,例如
:set wildignore=*.dll,*.exe
您可以使用和的组合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/ )。
wildignore非常小心地定义包含所有类型的二进制文件.viminfo. 通过使用q:,您可以调出先前输入的ex模式命令,然后在缓冲区中搜索以找到此特定命令并只需更改必要的字段:cnwildignorewildignore正如@Ingo-karat 指出的那样,您仍然应该仔细填写,因为wildignore很多程序都在使用它。
而不是vimgrep,也许您可以直接使用gr并且您可以通过 直接为其提供-lI参数greprg。但是,我还没有尝试过。