Use ag in ctrlp + vim

Richard picture Richard · Aug 17, 2013 · Viewed 13k times · Source

I want to use ag (silver searcher) with ctrlp and vim. I have this in my .vimrc:

if executable("ag")
    set grepprg=ag\ --nogroup\ --nocolor
    let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
endif

let g:ctrlp_show_hidden = 1

set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*/.tmp/*,*/.sass-cache/*,*/node_modules/*,*.keep,*.DS_Store,*/.git/*

I want ctrlp to include hidden files but those are hidden. If I add -u to the ag command it shows all hidden files but doesn't respect the wildignore or .gitignore. Is it possible to make it respect these?

Answer

mcanfield picture mcanfield · Sep 3, 2013

If you are using a custom finder via ctrlp_user_command several options, including ctrlp_show_hidden ctrlp_custom_ignore and vim's wildignore patterns, are not used by CtrlP (see documentation).

g:ctrlp_show_hidden

...

Note: does not apply when a command defined with |g:ctrlp_user_command| is being used.

g:ctrlp_custom_ignore

...

Note #1: by default, |wildignore| and |g:ctrlp_custom_ignore| only apply when |globpath()| is used to scan for files, thus these options do not apply when a command defined with |g:ctrlp_user_command| is being used.

So you are left at the mercy of your searching tool, in this case, ag. Fortunately you can do a couple things that should give you the behavior you want.

To get your hidden dotfiles to appear, but still respect ignore files, use the --hidden option for ag:

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'

Now for defining patterns to ignore, you can use ag's own ignore file .agignore. This can be a per directory or a global one that ag will check on each run. You place that in your home dir ~/.agignore.

I understand it can be nice to have vims wildignore take care of patterns, but with .agignore you get the bonus of those restrictions when using ag from the cli. If you want to search all files just use the ag -u command you mentioned to bypass any ignore files.

As a final tidbit, there is a Dictionary format you can use to define g:ctrlp_user_command which contains an ignore key that will make CtrlP use wildignore patterns. However, I've never tried this and the documentation points out a potential performance hit. You might try this method if you don't like my other proposed solution (see documentation).

Note #3: unless the |Dictionary| format is used and 'ignore' is defined and set to 1, the |wildignore| and |g:ctrlp_custom_ignore| options do not apply when these custom commands are being used. When not present, 'ignore' is set to 0 by default to retain the performance advantage of using external commands.