How to edit your configuration

First of all, you need to know how to edit your user configuration, which is defined in your vimrc file. Open your vim and type

:e $HOME/.vimrc

or, if you are on Windows

:e $HOME\_vimrc

This will create your own user configuration file. From now on, you can edit it with

:split $MYVIMRC

See Open vimrc file as a reference.

Autosource config on exit

Here it is the first line you are going to add to your vimrc.

" autosource config on exit
au BufLeave $MYVIMRC :source $MYVIMRC

So new configuration will be sourced when you finish editing and close the file (a.k.a. ZZ command).

See also Keep your vimrc file clean.

Survival kit

Vim is not vi

set nocompatible    " be iMproved
set wildmenu        " enhanced command-line completion
set laststatus=2    " always show status line
set ruler

Choose a color theme

I use desert here cause is a dark theme I always find by default. However there are better color schemes around: you can install them using Vundle, see Vundle config section.

" if you are using vim from an ssh terminal, probably you should uncomment the line below
" set t_Co=256

colorscheme desert

Indentation and syntax highlight

syntax on         " can't code without
filetype plugin indent on

set autoindent    " always set autoindenting on
set copyindent    " copy the previous indentation on autoindenting
set shiftround    " use multiple of shiftwidth when indenting with '<' and '>'
set showmatch     " set show matching parenthesis

See Programming languages section for specific configuration.

Disable that annoing beep

" disable beeping and flashing
" see
set noerrorbells visualbell t_vb= " don't beep
autocmd GUIEnter * set visualbell t_vb=

Enhanced cursor

set cursorcolumn
set cursorline
"if version >= 703
if exists('+colorcolumn')
  set colorcolumn=80

Use UTF-8 encoding

set encoding=utf8
set termencoding=utf-8
set fileencodings=          " Don't do any encoding conversion
" Fonts, see
set guifontwide=MingLiU:h10 " Display mixed character sets
set guifont=Consolas:h11:cANSI

Nice to have

Enable list

set number        " always show line numbers
set list

" Define characters to show when you show formatting
" stolen from
if &listchars ==# 'eol:$'
  set listchars=tab:>\ ,trail:-,extends:>,precedes:<,nbsp:+
  if &termencoding ==# 'utf-8' || &encoding ==# 'utf-8'
    let &listchars = "tab:\u21e5,trail:\u2423,extends:\u21c9,precedes:\u21c7,nbsp:\u26ad"

" another nice listchars configuration
" set listchars=tab:\|\ ,eol:¬
" set listchars=eol:¬,tab:>-,trail:.,extends:»,precedes:«
" set listchars=tab:\|\ ,eol:¬,trail:-,extends:>,precedes:<,nbsp:+

Set gvim window size

I prefer gvim starts maximized

" See

if has("gui_running")
  " GUI is running or is about to start.
  " Maximize gvim window.
  set lines=999 columns=999


Use F12 to toggle auto-indenting for text paste.

" See
set pastetoggle=<F12> 


set hidden " abandon a buffer when unloaded


set history=1000    " remember more commands and search history
set undolevels=1000 " use many much levels of undo

No shit around

If I am on a single user on a local host it does not make sense to use swap files.

set nobackup
set noswapfile " IMPORTANT: comment this line if you are working on a remote host
set wildignore=*.swp,*.bak,*.pyc,*.class


Easier split navigations

We can use different key mappings for easy navigation between splits to save a keystroke. So instead of CTRL-w then j, use just CTRL-j

nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

More natural split opening

Open new split panes to right and bottom, which feels more natural than default Vim behaviour.

set splitbelow
set splitright
let g:netrw_altv = 1 " when navigating a folder,
                     " hitting <v> opens a window at right side (default is left side)
set smarttab   " insert tabs on the start of a line according to
               "   shiftwidth, not tabstop
set hlsearch   " highlight search terms
set incsearch  " show search matches as you type
set smartcase  " ignore case if search pattern is all lowercase,
               "   case-sensitive otherwise
set ignorecase " ignore case when searching


Vundle config

Vim is great but it gets even better with tons of plugins you can use to make people, including your boss, say:

Hey, what editor are you using?

For plugin management I use Vundle, it works really great.

Installation that is not really straightforward on Windows, see Vundle-for-Windows installation instructions, but it really worth it!

Edit your configuration (see below), launch


and Vundle will manage everything!

" start Vundle config
set nocompatible               " be iMproved
filetype off                   " required!

set rtp+=~/.vim/bundle/vundle/ " Use ~/vimfiles/bundle/vundle if you are on Windows
call vundle#rc()

" let Vundle manage Vundle
" required!
Bundle 'gmarik/vundle'

" my plugin list here
" Bundle 'godlygeek/tabular'
" Bundle 'walm/jshint.vim'
" Bundle 'bling/vim-airline'
" Bundle 'baskerville/bubblegum'
" Bundle 'kchmck/vim-coffee-script'
" Bundle 'AndrewRadev/vim-eco'

syntax enable
filetype plugin indent on " required!
" end Vundle config

After Vundle config you can add plugins configuration directives

" Color schemes (uncomment one of the rows below)
" colorscheme desert
" colorscheme base16-atelierdune
colorscheme bubblegum
" colorscheme base16-tomorrow
" colorscheme base16-greenscreen
" colorscheme base16-eighties

Cool plugins

lean&mean statusline for vim
color schemes for hackers
vim script for text filtering and alignment
vim color scheme based on xoria256
vimscript for gist
fast, as-you-type, fuzzy-search code completion engine
perform all your vim insert mode completions with Tab
a Git wrapper so awesome, it should be illegal
The NERD Tree
a tree explorer plugin for vim
syntax checking hacks for vim
Auto Pairs
insert or delete brackets, parens, quotes in pair

Programming languages


Install Vim plugins for Go.

Note that you need to set the GOROOT environment variable properly.

" See

" On Windows, add environment variable GOROOT=C:\Go
" and add %GOROOT%bin; to your PATH variable
filetype off
filetype plugin indent off
set runtimepath+=$GOROOT/misc/vim
filetype plugin indent on
syntax on

" Format Go source files when they are saved
autocmd FileType go autocmd BufWritePre <buffer> Fmt

" gocode: An autocompletion daemon for the Go programming language
" See and
" Use <C-x><C-o> for autocompletion (omnifunc autocompletion)
Bundle 'Blackrush/vim-gocode'


See also Vim plugins page on Node wiki.

" my JavaScript preferences
autocmd filetype javascript setlocal autoindent
autocmd filetype javascript setlocal expandtab
autocmd filetype javascript setlocal shiftwidth=2
autocmd filetype javascript setlocal tabstop=2


" my Perl preferences
autocmd filetype perl map <F2> :%!perltidy<CR>                    " indent
autocmd filetype perl map <F3> :!prove -l<CR>                     " run tests
autocmd Filetype perl map <F4> :!prove -l --state=save<CR>        " run tests, stateful
autocmd Filetype perl map <F5> :!prove -l --state=save,failed<CR> " run only failed tests
autocmd filetype perl setlocal autoindent
autocmd filetype perl setlocal expandtab
autocmd filetype perl setlocal shiftwidth=4
autocmd filetype perl setlocal tabstop=4

" use perltidy for .pl, .pm, and .t
autocmd BufRead,BufNewFile *.pl setl equalprg=perltidy
autocmd BufRead,BufNewFile *.pm setl equalprg=perltidy
autocmd BufRead,BufNewFile *.t  setl equalprg=perltidy


Install plugins

CoffeeScript support for vim
Eco (embedded coffee-script) support for Vim
au BufRead,BufNewFile *.coffee set filetype=coffee
au BufRead,BufNewFile * set filetype=coffee