Making Unite.vim use the project root directory

2014-10-31

I've been using vim for quite a while now - I think it's about 3 years . Over the short 3 year journey, I've built up a pretty massive vimrc file[1] which I add & tweak almost every day. Over the past week I decided to make the switch over to Unite.vim[2], but coming from ctrlp[3], I wasn't satisfied with the default behaviour.

1: a pretty massive vimrc file

2: Unite.vim

3: ctrlp

Problem

There are plenty of ctrlp snippets out there which approximate ctrlp's behaviour, but one thing they don't focus on is ctrlp's ability to find your project root and search within its context. For me, this functionality was what took ctrlp from an amazing vim plugin, to something that made massive improvements to the speed of navigation, and ultimately, my productivity.

Solution

So I set about finding out how to make unite use the project root when doing it's ctrlp-like fuzzy search.

I came across a vim project called vim-projectroot[1]. vim-projectroot allows you to retrieve the root path of a project. It does this by detecting common files/directories within a project root, such as .git directories.

1: vim-projectroot

So it became clear the solution was to stick them together!

" Build the ctrlp function, using projectroot to define the
" working directory.
function! Unite_ctrlp()
  execute ':Unite  -buffer-name=files -start-insert buffer file_rec/async:'.ProjectRootGuess().'/'
endfunction

nnoremap <C-P> :call Unite_ctrlp()<cr>

This method executes Unite.vim with the common "ctrlp" settings, but ensuring we use the Project Root.