VIM Cheat Sheet.

VI / VIM is a powerful editor and I built this small reference of commands that can be used.

VIM Typically functions in different modes.

Command mode

Possibly the most important thing to know is that when you're in command mode you can't insert text immediately. You first need to issue an insert, append, or open command to insert text.

Visual mode

Visual mode is used for copying and pasting for example.

Insert mode

Insert mode is used to add and append to the file.

Last line mode

You can only get to last line mode from command mode, and you get into last line mode by pressing the colon key.

Cheat Sheet / Commands

:help keyword - open help for keyword

:close - close current pane

:wq or :x or ZZ - write (save) and quit

:q - quit (fails if there are unsaved changes)

:q! or ZQ - quit and throw away unsaved changes

Working files

:e filename - edit another file

:o file - open file

:saveas file - save file as

:w - write (save) the file, but don't exit

:Explore - Directory listing

Cursor Movement

h - move cursor left

j - move cursor down

k - move cursor up

l - move cursor right

H - move to top of screen

M - move to middle of screen

L - move to bottom of screen

w - jump forwards to the start of a word

W - jump forwards to the start of a word (words can contain punctuation)

e - jump forwards to the end of a word

E - jump forwards to the end of a word (words can contain punctuation)

b - jump backwards to the start of a word

B - jump backwards to the start of a word (words can contain punctuation)

0 - jump to the start of the line

^ - jump to the first non

$ - jump to the end of the line

g_ - jump to the last non

gg - go to the first line of the document

G - go to the last line of the document

5G - go to line 5

fx - jump to next occurrence of character x

tx - jump to before next occurrence of character x

} - jump to next paragraph (or function/block, when editing code)

{ - jump to previous paragraph (or function/block, when editing code)

zz - center cursor on screen

Ctrl + b - move back one full screen

Ctrl + f - move forward one full screen

Ctrl + d - move forward 1/2 a screen

Ctrl + u - move back 1/2 a screen

Tip Prefix a cursor movement command with a number to repeat it. For example, 4j moves down 4 lines.

Insert mode

i - insert before the cursor

I - insert at the beginning of the line

a - insert (append) after the cursor

A - insert (append) at the end of the line

o - append (open) a new line below the current line

O - append (open) a new line above the current line

ea - insert (append) at the end of the word

Esc - exit insert mode


r - replace a single character

J - join line below to the current one

cc - change (replace) entire line

cw - change (replace) to the end of the word

c$ - change (replace) to the end of the line

s - delete character and substitute text

S - delete line and substitute text (same as cc)

xp - transpose two letters (delete and paste)

u - undo

Ctrl + r - redo

Marking Text / Visual Mode

v - start visual mode, mark lines, then do a command (like y

V - start linewise visual mode

o - move to other end of marked area

Ctrl + v - start visual block mode

O - move to other corner of block

aw - mark a word

ab - a block with ()

aB - a block with {}

ib - inner block with ()

iB - inner block with {}

Esc - exit visual mode

Visual Commands

> - shift text right

< - shift text left

y - yank (copy) marked text

d - delete marked text

~ - switch case

Cut and Paste

yy - yank (copy) a line

2yy - yank (copy) 2 lines

yw - yank (copy) the characters of the word from the cursor position to the start of the next word

y$ - yank (copy) to end of line

p - put (paste) the clipboard after cursor

P - put (paste) before cursor

dd - delete (cut) a line

2dd - delete (cut) 2 lines

dw - delete (cut) the characters of the word from the cursor position to the start of the next word

D - delete (cut) to the end of the line

d$ - delete (cut) to the end of the line

x - delete (cut) character

Search and replace

/pattern - search for pattern

?pattern - search backward for pattern

vpattern - 'very magic' pattern: non

n - repeat search in same direction

N - repeat search in opposite direction

:%s/old/new/g - replace all old with new throughout file

:%s/old/new/gc - replace all old with new throughout file with confirmations

:noh - remove highlighting of search matches

Multiple Windows

:split filename - split window and load another file

ctrl-w up arrow - move to window above

ctrl-w left arrow - move to window left

ctrl-w up right arrow - move to window right

ctrl-w up down arrow - move to window below

ctrl-w ctrl-w - move cursor to another window (cycle)

ctrl-w_ - maximize current window

ctrl-w= - make all equal size

10 ctrl-w+ - increase window size by 10 lines

:vsplit file - vertical split

:sview file - same as split, but readonly

:hide - close current window

:only - keep only this window open

:ls - show current buffers

:b 2 - open buffer #2 in this window

VIM, Plugins and Python ;-)

VI Improved (VIM) is my editor of choice. I prefer to use this as development and scripting IDE. This is also seems to be the general view of the open-source community. VIM is ubiquitous, fast, and never crashes. And it can do just about anything!

Installing VIM

You require vim compiled with Python support.


apt-get install vim-nox-py2



$ brew update
$ brew install vim


$ sudo port update
$ sudo port install vim +huge +python27

VIM Extensions

VIM has several extension managers, but the one I strongly recommend is Vundle. Think of it as pip for VIM. It makes installing and updating packages trivial.

Install Vundle

$ git clone ~/.vim/bundle/Vundle.vim

This command downloads the Vundle plugin manager and chucks it in your VIM bundles directory. Now you can manage all your extensions from the .vimrc configuration file.

Add the file to your user’s home directory:

$ touch ~/.vimrc

Now set up Vundle in your .vimrc and some extra plugins using:

set nocompatible " be iMproved, required
filetype off     " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'

" Add all your plugins here (note older versions of Vundle used Bundle instead of Plugin)
Plugin 'tmhedberg/SimpylFold'
Plugin 'vim-scripts/indentpython.vim'
Bundle 'Valloric/YouCompleteMe'
Plugin 'scrooloose/syntastic'
Plugin 'nvie/vim-flake8'
Plugin 'jnurmine/Zenburn'
Plugin 'altercation/vim-colors-solarized'
Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required

" Enable folding
set foldmethod=indent
set foldlevel=99
" Enable folding with the spacebar
nnoremap <space> za

map <leader>g  :YcmCompleter GoToDefinitionElseDeclaration<CR>
let g:ycm_autoclose_preview_window_after_insertion=1
let g:ycm_add_preview_to_completeopt=1

set encoding=utf-8

syntax on
set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent
set fileformat=unix
autocmd FileType python set textwidth=79
autocmd FileType sh nnoremap <F5> :!%:p<CR>
autocmd FileType php nnoremap <F5> :!clear & php %:p<CR>
autocmd FileType python nnoremap <F5> :!clear & python %:p<CR>
autocmd FileType python nnoremap <F5> :!clear & python %:p<CR>
autocmd FileType python nnoremap <F6> :!clear & pudb %:p<CR>
autocmd FileType python map <buffer> <F4> :call Flake8()<CR>
autocmd FileType python imap <F3> <Esc>:YcmCompleter GetDoc<CR>i

set nu
set cursorline
highlight LineNr ctermbg=white ctermfg=black
highlight CursorLineNr ctermbg=darkred ctermfg=black
highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

set laststatus=2
hi statusline ctermbg=black ctermfg=grey

let python_highlight_all = 1

if has('gui_running')
    set background=dark
    colorscheme solarized
    colorscheme zenburn

"python with virtualenv support
py << EOF
import os
import sys
if 'VIRTUAL_ENV' in os.environ:
    project_base_dir = os.environ['VIRTUAL_ENV']
    activate_this = os.path.join(project_base_dir, 'bin/')
    execfile(activate_this, dict(__file__=activate_this))

Fire up VIM and run to install all the plugins:


This command tells Vundle to work its magic – downloading all the plugins and installing/updating them for you.

Install YCM - Important for autocomplete

$ cd ~/.vim/bundle/YouCompleteMe
$ ./

That’s it. You’re now set up!!


Short introductions to above plugins installed...


Plugin 'tmhedberg/SimpylFold'

Most “modern” IDEs provide a way to collapse (or fold) methods and classes, showing you just the class/method definition lines instead of all the code. Use <space bar> or za to hide or unhide class cursor is on.


Plugin 'vim-scripts/indentpython.vim'

Autoindent will help but in some cases (like when a function signature spans multiple lines), it doesn’t always do what you want, especially when it comes to conforming to PEP8 standards. To fix that, we can use the indentpython.vim extension


Bundle 'Valloric/YouCompleteMe'

Under the hood YouCompleteMe uses a few different auto-completers (including Jedi for Python), and it needs some C libraries to be installed for it to work correctly. The docs have very good installation instructions so I won’t repeat them here, but be sure you follow them.

Syntax Checking/Highlighting

Plugin 'scrooloose/syntastic'

Plugin 'nvie/vim-flake8'

You can have VIM check your syntax on each save with the syntastic extension including PEP8 checking.

Color Schemes

Plugin 'jnurmine/Zenburn'

Plugin 'altercation/vim-colors-solarized'

Color schemes work in conjunction with the basic color scheme that you are using. Check out solarized for GUI mode, and Zenburn for terminal mode


Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}

Powerline is a status bar that displays things like the current virtualenv, git branch, files being edited, and much more.

It’s written in Python, and it supports a number of other environments like zsh, bash, tmux, and IPython.