Boost your Vim autocompletion with YouCompleteMe and Jedi (on a CentOS system)

Recently, Steve Francia’s Vim Distribution (aka vim-spf13) brought a new life to my aging vimrc dotfile. It bundles most of the popular plugins that makes you life as a programmer easier (Syntastics, ctrlp, …). The only thing missing to make it into a good IDE is a completion plugin for C and C++. In this brief blog entry, I’ll show you how to install YouCompleteMe on CentOS and improve your Vim experience.

As I said, this small howto will walk you through installing YouCompleteMe and Jedi on a CentOS 6.3 system. YouCompleteMe will offer C/C++ autocompletion based on the suggestion provided by clang. The YoucCompleteMe plugin website offers a great deal of information on how to install the plugin and its dependencies.

On most distros, you’ll install this plugin in a breeze. Other distros, like CentOS will make you life tougher. Because I found it to complete, I was compelled to write this documentation page. I will mostly focus on fixing these two main issues:

  • installing YouCompleteMe on vim-spf13 will conflict with existing (now redundant) plugins shipped with vim-spf13
  • breathing a new life into [CentOS] by installing new version of the [Vim] and clang

Assumption

  • you are running on CentOS 6.3
  • you are using vim-spf13 and know how to configure it
  • you are willing to spend half an hour for installing a Vim plugin

Dependencies

You need cmake28 to compile the plugin. Install it is as easy as:

sudo yum install -y cmake28

Upgrading Vim

The version of Vim shipped with CentOS at the time of the writing of this entry is 7.2.xxx, whereas vim-spf13 requires the 7.3.xxx branch and YouCompleteMe requires at least Vim 7.3.584.

Before anything else, you need to install a newer version of Vim. In my case, I installed the source RPM of Vim in the latest Fedora and compiled it. You can find a slightly modified source RPM. Install this archive with rpm -i and build the packages from the source using rpmbuild -bb vim.spec (this file should be in your SPEC subdirectory of the rpmbuild directory, which should be located in your home by default).

For more information, you can look at the dedicated CentOS page.

Preparation work

This plugin WILL conflict with other plugins part of the vim-spf13 default distribution. They should be disabled first, add the following lines to your ~/.vimrc.local:

UnBundle 'Shougo/neocomplcache'
UnBundle 'pythoncomplete'

Now, you need to tell Vim to actually removes both packages:

vim -c ':BundleClean!'

Also, you should undo some default binding of vim-spf13 so that they don’t conflict with YouCompleteMe later on. Again, edit your ~/.vimrc.local and add the following lines:

iunmap <expr><s-CR>
iunmap <expr><CR>
iunmap <expr><BS>
iunmap <expr><C-y>

Installing the plugins

Add the following line to you ~/.vimrc.bundles.local

Bundle 'Valloric/YouCompleteMe'
Bundle 'davidhalter/jedi'

Now ask Vim to install these packages:

    vim -c ':BundleInstall'

The YouCompleteMe plugin installation is not complete just yet. It needs you to compile things, and that where it gets hairy on CentOS (because the clang version shipped with the system is too old).

Installing clang locally

In order to get YouCompleteMe to work, a recent version of clang is required. While you can build from source, I preferred to save some time and downloaded a version that was built for my system. Ryan Prichard hosts built version for for a lot of systems that are not pre-packaged in the clang website (many thanks to him!). You can download an archive on his project’s website. In my case, I downloaded the x86_64 version.

I extracted the tarball in a ~/tools directory (located in my home). If this directory does not exists, you can create it with:

	mkdir ~/tools

Then I did the following to build the plugin:

mkdir ~/.vim/bundle/YouCompleteMe/ycm_build
cd ~/.vim/bundle/YouCompleteMe/ycm_build
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/tools/clang-3.2-1-x86_64-linux/lib
cmake28 -G "Unix Makefiles" \
        -DPATH_TO_LLVM_ROOT=~/tools/clang-3.2-1-x86_64-linux/ . ~/.vim/bundle/YouCompleteMe/cpp
make

If everything goes fine, the make command completes. One last step remains, if you don’t want to have to overload the LD_LIBRARY_PATH variable each time you use the plugin. You need to copy the libllvm.so file in a path where the plugin can always find it. In my case, I did the following:

cp tools/clang-3.2-1-x86_64-linux/lib/libLLVM-3.2svn.so ~/.vim/bundle/YouCompleteMe/python

You’re all set, but don’t forget to read the YouCompleteMe manual, or else you might omit to create a .ycm_extra_conf.py in you C/C++ project directory and think the plugin is malfunctioning.