How to exclude file patterns in vimgrep?
Asked Answered
K

5

34

In vim, I do search with vimgrep frequently. I have mapping like below:

map <leader>s :execute "noautocmd vimgrep /\\<" . expand("<cword>") . "\\>/gj **/*.*" <Bar> 
cw<CR> 5

The problem is that there are some temporary subfolders (like obj, objd) that I don't want to search for. How can I exclude subfolders matching given patterns. For example, subfolders with prefix "objd" should not be included in searching.

Knoll answered 14/12, 2009 at 4:49 Comment(2)
I didn't find any related options for vimgrep. Now I use grep instead.Knoll
You could use grep instead vimgrep. Here explain how to use with script called MyGrepPickard
E
40

As of Vim 7.3.570, you can use wildignore to exclude patterns with vimgrep.

For example, to ignore the objd subfolder:

:set wildignore+=objd/**

Additional exclusions can be added by separating patterns with a comma:

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

See Vim's help documentation for a few more details.

:help wildignore
Estrada answered 18/11, 2013 at 7:9 Comment(5)
This doesn't seem to have any effect. I've done :set wildignore+=node_modules/**,.git/** and yet my searches are still looking through node_modules and .git for results. vim --version | grep wildignore showed me that my vim was compiled with wig support, so I'm not sure what's going on here.Moriyama
Ah, nevermind. My macbook's shell apparently doesn't support the ** expansion. In other shells you may have to do shopt -s globstar before you can use double-star expansions like this.Moriyama
I wish this worked, but alas it doesn't for me. Running Vim version 8 on Ubuntu. Added set wildignore+=node_modules/**,.git/** to vimrc and still e **/foo <tab> still searches through the current directory's node_modules.Methacrylate
wildignore+=*/node_modules/** seems to work on my machine (windows)Midwife
works on archlinux :+1Jarrell
A
21

As showed in http://vimcasts.org/blog/2013/03/combining-vimgrep-with-git-ls-files/ you could instead of exclude files, include the files you want to search. So you can search in the files tracked by Git with

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

In this way you are not searching the files stated in the .gitignore.


I use it so much I created a command for that, so I just need to

:Sch {pattern}

and I did it by adding the following line to my .vimrc

command -nargs=1 Sch noautocmd vimgrep /<args>/gj `git ls-files` | cw
Afteryears answered 31/12, 2019 at 12:18 Comment(0)
B
12

You could try ack instead. It integrates nicely with vim and has lots of options for doing the sort of thing you want to do.

There are several ack-vim integrations on GitHub. For example: here.

Blakeley answered 15/12, 2009 at 16:17 Comment(1)
Second github repository is not available anymore.Millymilman
K
2

For example in Ubuntu just

sudo apt-get install ack-grep

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

then install http://www.vim.org/scripts/script.php?script_id=2572

and now add next line to your .vimrc

noremap <C-f> :copen<CR>:Ack --ignore-dir #first_ignore_dir# --ignore-dir #second_ignore_dir# -ai 
  • its open search frame by Ctr+F, have fun
Kissel answered 26/5, 2013 at 20:58 Comment(0)
P
0

Seem to also ignore node_modules folder on root and if node_modules is in sub directories.

set wildignore+=*/node_modules/**
Porcelain answered 28/8, 2023 at 5:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.