Vim - up and running

So you've been using Vim for a while but you feel that you are missing some of the features of modern, hip editors. Or maybe you never used Vim but you're curious to try it out. Either way, this guide will help you get started and by the time we're done you'll have a complete development environment that is accessible anywhere through SSH, quick to start and with a small footprint.

Installing Vim

You need a version of Vim that's at least 7.4. It should also be a full version, not the minimal kind of Vim that Ubuntu ships with by default.

Speaking of Ubuntu, its repos are outdated right now so you should use a PPA like this one. You can use homebrew to install MacVim on OS X. I haven't done this on Windows so you'll have to look into it yourself.

Vim Package Management

I feel that one of the most useful features Linux distros have is the package manager. It allows you to easily look for and install packages that enhance the core functionality of your software. Editors like Sublime Text have this as well with the help of plugins. Guess what, there are package management plugins for Vim too.

We'll be using Vundle. To install it, run this command (you'll need git):

git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

Now that you have Vundle, I suggest having a config file to store the list of packages you want to use. This will become helpful when you want to duplicate the same Vim setup somewhere else.

Make sure you include it into your .vimrc file. You can prepend "source ~/.bundles.vim" to your .vimrc file and all should be well.

After we set up the bundles file, we can install and/or update all the packages in there using this command:

vim -u ~/.bundles.vim +BundleInstall! +q

I usually have an upvim alias for it.

Packages

Let me share a list of packages that I find useful in my Vim setup. You can install all of them using Vundle. I usually keep them in my .bundles.vim file and just run the upvim alias whenever I change something.

CtrlP

Bundle 'kien/ctrlp.vim' link

Provides fuzzy file and symbol matching, similar to what TextMate and Sublime Text have. Really fast.

vim-bad-whitespace

Bundle 'bitc/vim-bad-whitespace' link

Highlights trailing whitespace.

detectindent

Bundle 'ciaranm/detectindent' link

Automatically detects indent settings from files.

NERD Commenter

Bundle 'scrooloose/nerdcommenter' link

Really easy commenting/uncommenting.

NERD Tree

Bundle 'scrooloose/nerdtree' link

Project explorer functionality.

Syntastic

Bundle 'scrooloose/syntastic' link

Syntax checks, linting.

Tagbar

Bundle 'majutsushi/tagbar' link

Displays a sidebar with the symbols in the current file (functions, classes etc.)

Easybuffer

Bundle 'troydm/easybuffer.vim' link

Easy way to see and switch between open buffers (files).

Zenburn

Bundle 'jnurmine/Zenburn' link

The Zenburn color scheme.

Ack.vim

Bundle 'mileszs/ack.vim' link

Friendly way of using ack from
within Vim. You need ack installed to use this.

Vim-powerline

Bundle 'Lokaltog/vim-powerline' link

Smart statusline.

Gundo

Bundle 'Gundo' link

Helps you use the undo tree Vim provides.

YouCompleteMe

Bundle 'Valloric/YouCompleteMe' link

Smart, fast, fuzzy autocompletion engine for Vim. Please check the docs, after installing it with Vundle there are some extra-steps to do.

Tern for Vim

Bundle 'marijnh/tern_for_vim' link

Great autocompletion + "intellisense" support for JS. Please check the docs, after installing it with Vundle there are some extra-steps to do.

Here's my .bundles.vim:

Extra tweaks

All the packages we talked about have great intro pages and documentation, but maybe you don't want to spend so much time on everything. I suggest starting off with my vimrc and change what doesn't fit your preference.

However, there are some settings that I find really useful and I'd like to mention here.

First, you can use Vim's cc functionality to display a column in order to keep your line length in check. I use set cc=80.

You can use Zenburn as your color scheme with colors zenburn.

By default, CtrlP changes your cwd when selecting a new file. You can change this behavior with let g:ctrlp_working_path_mode = ''. Also, I want it to search both among open buffers and files on the HDD, which is why I use let g:ctrlp_cmd = 'CtrlPMixed'. Finally, I really like Sublime's go to symbol keybinding (CTRL+R), so I also use map <C-R> :CtrlPBufTagAll<CR>.

If you choose to install DetectIndent, you need to turn it on:

" first two lines are up to you
let g:detectindent_preferred_expandtab = 1
let g:detectindent_preferred_indent = 4
autocmd BufNewFile,BufReadPost * :DetectIndent
autocmd FileType make setlocal noexpandtab

I bound my leader key to comma: let mapleader = ",". This is useful for me in the NERD Commenter and NERD Tree keybindings:

map <leader>/ <plug>NERDCommenterToggle
imap <leader>/ <Esc><plug>NERDCommenterTogglei

map <leader>n :NERDTreeToggle<CR>
nmap <leader>m :NERDTreeFind<CR>

NERD Commenter lets you comment/uncomment parts of your code and it's compatible with Vim's selection modes. NERD Tree's find functionality helps you locate the current file in the project's tree.

I use F8 to toggle TagBar and bring it in focus:

nmap <F8> :TagbarToggle<CR>
let g:tagbar_autofocus = 1

Last but not least, you might want to check out the Vim Cheatsheet I wrote some time ago.

Good luck!