Getting Fuzzy with CtrlP and Vim

Ever since I started using Vim, I've been looking for ways to improve my workflow. It wasn't until recently that I've felt my use of it had stagnated. I knew there were better ways in doing a lot of things but I never took the time to look into it.

I write text in a variety of languages such as: Javascript, PHP, Bash, CSS, Markdown and sometimes even Ruby. The one thing they all have in common? Vim. Improving how I use Vim will help me edit files more efficiently regardless of the language.

After creating related.vim and writing my previous post, I realized that I didn't know too much about some of the plugins I used. I knew that they were powerful but I had yet to take advantage of that power.

One of the plugins I mentioned was: CtrlP

I was having issues using it because the project I was working in had 15,000+ files but I found a way around it.

Why CtrlP?

First of all, why would I want to use CtrlP? Here's a screenshot of its use in the site's project directory.

CtrlP

As you can see, if I press ctrl + p and start typing gru, I can start looking for any files in my project, fuzzily. I dunno about you, but I tend to move between files constantly. CtrlP makes it that much easier. Finding a file by typing a few characters saves an immense amount of time. And as they say, time is money.

What about command-t?

There's another plugin called command-t that does a similar thing that was even named after the macro used in TextMate.

There are a few reasons I chose ctrlp over command-t:

  1. ctrlp is faster
  2. ctrlp seems like the more active project
  3. ctrlp is written in vimscript, while command-t requires and invokes ruby (see reason #1)
  4. ctrlp is more easily managed using vundle or pathogen

Workflow improvements

My original workflow consisted of using find + grep to look for a file and then copy/paste it into my terminal to edit.

Now it's just a matter of pressing ctrl + p and typing a few characters.

Not only is there a lot less typing, I don't have to reach for my mouse. No mouse. Mouse is bad. And! I'm still in vim. Ready to edit the next piece of text. Or whatever.

About that issue...

I mentioned that issue of ctrlp being kind of hard to use when the project was huge. You know: 15,000+ files, nested in a folder structure over 9 folders deep... This caused the fuzzy matching to hit the wrong files even when I was typing the entire filename.

Ironically, I saw a Destroy All Software screencast where Gary Bernhardt was using command-t to navigate a file system and I noticed he was searching only in the directories he wanted (ie. the controllers directory in a Rails app) by passing in the directory he wanted into the command.

Well, it turns out CtrlP can do that. It's the second thing that the documentation mentions. RTFM. Problem solved.

A few other useful things

Here are some relevant settings from my .vimrc and what they do:

" Set no max file limit
let g:ctrlp_max_files = 0
" Search from current directory instead of project root
let g:ctrlp_working_path_mode = 0

" Ignore these directories
set wildignore+=*/out/**
set wildignore+=*/vendor/**

" Search in certain directories a large project (hardcoded for now)
cnoremap %proj <c-r>=expand('~/Projects/some-project')<cr>
" ga = go api
map <Leader>ga :CtrlP %proj/api/<cr>
" gf = go frontend
map <Leader>gf :CtrlP %proj/some/long/path/to/frontend/code/<cr>
..
- Forgot to the commands I use

When CtrlP is open, you have several options to deal with the file:

  • f5 will clear the CtrlP cache (useful if you add new files during the session)
  • ctrl + v will open the file in a vsplit
  • ctrl + x will open the file in a split

Enjoy!

I've barely touched any of the more advanced features of CtrlP and I'm already seeing significant gains. Who needs a TextMate or Sublime Text license just so they can use cmd + t for a fast fuzzy search? Not me!

My thanks to Kien Nguyen for creating this plugin and saving the time of many developers all over the world!

CtrlP Resources

  Vim