如何在vimgrep中排除文件模式?

34

我经常在vim中使用vimgrep进行搜索。我有以下映射:

map <leader>s :execute "noautocmd vimgrep /\\<" . expand("<cword>") . "\\>/gj **/*.*" <Bar> 
cw<CR> 5
问题是有一些临时子文件夹(如obj,objd),我不想搜索它们。如何排除与给定模式匹配的子文件夹。例如,具有前缀“objd”的子文件夹不应包括在搜索中。
解决方案:您可以使用`-notlike`运算符和通配符来排除特定模式的子文件夹。例如,以下命令将在当前目录中搜索所有子文件夹,但排除以"objd"为前缀的子文件夹:
``` Get-ChildItem -Directory -Recurse -Exclude "objd*" ```

我没有找到任何与vimgrep相关的选项。现在我使用grep代替。 - Morgan Cheng
你可以使用grep代替vimgrep。这里讲解了如何使用名为MyGrep的脚本。 - user754501
5个回答

39

从Vim 7.3.570版本开始,你可以使用wildignore来排除vimgrep中的模式。

例如,要忽略objd子文件夹:


:set wildignore+=objd/**

通过用逗号分隔模式,可以添加其他的排除项:

:set wildignore+=objd/**,obj/**,*.tmp,test.c

请查看Vim的帮助文档以了解更多细节。

:help wildignore

1
这似乎没有任何效果。我已经执行了 :set wildignore+=node_modules/**,.git/**,但我的搜索仍然在 node_modules 和 .git 中查找结果。vim --version | grep wildignore 告诉我我的 vim 已经编译支持 wig,所以我不确定出了什么问题。 - James M. Lay
啊,算了吧。我的Macbook的shell显然不支持**扩展。在其他shell中,您可能需要在使用此类双星扩展之前执行shopt -s globstar - James M. Lay
我希望这个能够工作,但是很遗憾对我来说并没有。我在Ubuntu上运行Vim 8版本。我已经在vimrc中添加了set wildignore+=node_modules/**,.git/**,但是当我输入e **/foo <tab>时,它仍然会搜索当前目录下的node_modules - papiro
2
wildignore+=/node_modules/* 似乎在我的机器上(Windows)可以工作。 - sotto
适用于ArchLinux:+1 - D.B.K

21

正如http://vimcasts.org/blog/2013/03/combining-vimgrep-with-git-ls-files/所示,你可以选择包含要搜索的文件而不是排除文件。 因此,您可以使用以下方法在Git跟踪的文件中搜索:

:noautocmd vimgrep /{pattern}/gj `git ls-files`

以此方法,您不会搜索在.gitignore中声明的文件。


我使用得如此频繁,已经为此创建了一个命令,因此我只需要

:Sch {pattern}

我通过在我的 .vimrc 文件中添加以下行来完成此操作

command -nargs=1 Sch noautocmd vimgrep /<args>/gj `git ls-files` | cw

12

你可以尝试使用ack代替。它与vim很好地集成,并有很多选项可用于执行你想要的操作。

Github上有几个ack-vim集成。例如:这里


1
第二个 Github 存储库不再可用。 - Al.G.

2
例如在Ubuntu中只需执行以下命令:
sudo apt-get install ack-grep

sudo ln -s /usr/bin/ack-grep /usr/bin/ack

然后安装 http://www.vim.org/scripts/script.php?script_id=2572

现在将下一行添加到您的 .vimrc 文件中

noremap <C-f> :copen<CR>:Ack --ignore-dir #first_ignore_dir# --ignore-dir #second_ignore_dir# -ai 
  • 通过 Ctrl+F 打开它的搜索框,尽情享受吧

0
似乎还忽略根目录下的node_modules文件夹,以及子目录中的node_modules
set wildignore+=*/node_modules/**

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