I’m Paul Herron, a full-stack developer and technical manager.
I focus mainly on back-end development with tools like Symfony
and devops with tools like Docker

Vim cheatsheet

by Paul Herron on 23 March 2014

A couple of weeks ago I wrote about Vim’s modal design, which lets you be quite expressive in issuing commands to the editor. This week, I want to take that further by sharing my Vim cheatsheet.

I built this up slowly over many months of using Vim, and I find the best way to remember this stuff is to just keep it in a plain text file, with indentation to mark the sections. I hope this format is useful if you’re getting into Vim yourself!

Normal mode

This is Vim’s default mode. Typing a letter here doesn’t insert text, but rather lets you navigate and manipulate text in various ways.

gg - beginning of document
G - end of document
	4G - go to line 4
b - beginning of previous word
B - beginnging of previous WORD (like the above except WORD can include punctuation)
w - next word
W - next WORD
e - end of word
E - end of WORD
ge - end of previous word
gE - end of previous WORD
0 - beginning of line
$ - end of line

+ - move down by line beginnings
- - move up by line beginnings

^ - first non-blank character
g_ - last non-blank character
'. - go to last edited line
'' - previous cursor position

gi - go to insert mode on previous cursor position
gx - go to the URL under the cursor
ga - show info about character under cursor
Ctrl-G - show line info

. - repeat previous command

f - find character on line
	3fq - third occurrence of 'q'
F - find character on line, looking backwards
t - go till the specified character
T - go till the specified character, looking backwards
; - repeat last f, F, t or T command
, - repeat last f, F, t or T command, backwards

* - next occurrence of word under cursor
# - previous occurrence of word under cursor

4| - jump to column 4

H - top of screen (high)
M - middle of screen
L - bottom of screen (low)

Ctrl-f - forward one screenful
Ctrl-b - backward one screenful

{ - previous empty line
} - next empty line
% - go to next matching parenthesis
) - next sentence
( - previous sentence
]] - to next section (what a section is depends on the file type)
][ - to next closing brace section
[[ - to previous section
[] - backwards to closing brace section
]m - next method
[m - previous method
]M - end of next method
[M - end of previous method

Ctrl-o - retrace movements in file backwards
Ctrl-i - retract movement in file forwards
Ctrl-u - up half a page
Ctrl-d - down half a page

zz - center screen on cursor
zt - align top of screen with cursor
zb - align bottom of screen with cursor

inplace editing
	r - replace character
	J - join line below to current one

	~ - toggle case
	g~~ - toggle case of line
	g~$ - toggle case until end of line

	Ctrl-A - increment number beneath cursor
	Ctrl-X - decrement number beneath cursor

	== - autoindent
	=% - autoindent within braces

entering insert mode
	i - insert mode
	I - insert at beginning of line
	s - substitute character (deletes the character under the cursor and goes into insert mode)
	S - subsitute line (same as doing cc)
	C - substitute from cursor to end of line
	a - append after cursor
	A - append at end of line
	o - open (append) new line below
	O - open (append) new line above		

	/ - search
		/hello - search for the word 'hello'
			non-greedy match - /http.\{-}

			including line endings
				\n - a newline character (line ending)
				\_s - a whitespace (space or tab) or newline character
				\_^ - the beginning of a line (zero width)
				\_$ - the end of a line (zero width)
				\_. - any character including a newline

	? - search backwards
	n - repeat search
	N - repeat search in opposite direction
	/\v'.+' - search using 'very magic mode', to avoid having to escape common characters
	/\n\zs[a-z0-9] - use \zs flag to crop selection (in this case omitting the \n from the highlighted search result)	

editing window
	q/ - show and edit searches in a buffer
	q: - show and edit history of commands
	q? - show and edit backwards searches

cc - change entire line
dd - delete entire line
	4dk - delete 4 lines upwards
yy - yank line
yw - yank word
"zyy - yank line to buffer z
c - change
p - paste
P - paste before cursor
gp - paste and go to end of text
gP - paste before cursor and go to end of text
x - cut
X - cut before cursor
D - delete till end of line

undo and redo
	u - undo
	U - hard undo (back to states before any edits were made)
	Ctrl-r - redo
	g- - go backwards in history tree
	g+ - go forward in history tree
	:earlier 20s

combining operators, movements and counts
	cw - change word
	ci' - change everything inside quotes
	cib - change everything inside brackets
	ciB - change everything inside braces
	ct_ - change till underscore
	cT_ - change till underscore (backwards)
	cit - change in tag (XML or HTML)

	dk - delete line above
	3dk - delete the 3 lines above

	Ctrl-ww - switch window
	Ctrl-wh - move cursor to left-hand window
	Ctrl-wj - move cursor to upper window
		2 Ctrl-wj - move cursor up 2 windows
	Ctrl-wk - move cursor to upwards window
	Ctrl-wl - move cursor to right-hand window
	Ctrl-t - move cursor to top window
	Ctrl-b - move cursor to bottom window
	Ctrl-wq - quit window

	Ctrl-= - even out window sizes
	Ctrl-- - reduce window size
	Ctrl-+ - increase window size
	z6<CR> - make window 6 lines high

	Ctrl-> - increase window width 
	Ctrl-< - decrease window width

	Ctrl-x - exchange the window with the next one

	Ctrl-H - move window to be left column
	Ctrl-J - move window to be bottom row
	Ctrl-K - move window to be top row
	Ctrl-L - move window to be right column

switching tabs
	Cmd-shift [ - previous tab
	Cmd-shift ] - next tab

q - record macro
	qa - record marcro in register 'a'
	do something special
	press q again to stop recording
	16@a - run the macro 16 times
	"ap - paste the contents of the 'a' macro
	:%normal @b - repeat until end of file
	@@ - repeat last macro

registers (any time you delete or yank text it goes into a register)
	:reg - show contents of registers
	"1p - paste from register 1.
	"+p - paste from system clipboard

	:marks - show marks

	lowercase marks (mark positions and jump around in the current file)
		jump to

	uppercase marks (mark positions and jump around between different files)
		jump to

	:delm - delete a mark

	jumping to marks
		use ` to move position-wise and ' to move line-wise

		`[ - jump to beginning of last yanked or changed text
		`] - jump to end of last yanked or changed text
		`< - jump to beginning of last visual selection
		`> - jump to end of last visual selection

	vim will read a 'tags' file automatically

	Ctrl-] - jump to definition
	Ctrl-t - jump back from definition

	g] - list matching tags

	:tag _initInputField - jump the function definition of _initInputField
	:tag /placeholder - jump to tag matching the text 'placeholder'

	:ptag placeholderUrl - open tag in preview window
	:tselect afterSave - select from multiple matching tags
	:tjump url - jump to unique tag, or list non-unique ones

spell checking
	:set spell
	]s - next spelling mistake
	[s - previous spelling mistake
	z= - bring up list of suggestions for word under cursor
	1z= - replace word with first suggested spelling
	zg - mark word as good in spell list
	zw - mark word as bad in spell list
	zug - undo adding as good
	zuw - undo addings as bad


Insert mode

This is where you actually insert text. You can type i to get into insert mode. Keep in mind that while the commands below are handy, Vim works best when you stay out of insert mode as much as possible. In other words, go into insert mode only to enter text, and get back into normal mode as soon as possible.

3iGo - insert "Go" 3 times
Ctrl-P - autocomplete
Ctrl-X  Ctrl-O - omnicomplete

Ctrl-y - duplicate line above, character-by-character
Ctrl-e - duplicate line below, character-by-character

Ctrl-t - indent line
Ctrl-d - unindent line

Ctrl-r {reg} - insert from register
	Ctrl-r =2+2 - insert '4' from expression register
	Ctrl-r =sqrt(4)

	:help function-list

inserting special characters, digraphs
		Type approximation of the character, e.g.
			a: for ä
			14 for ¼
		:dig to reference these

editing while in insert mode
	Ctrl-w - delete word before cursor
	Ctrl-u - delete line before cursor
	Ctrl-rx - insert contents of register x
	Ctrl-t - increase line indent
	Ctrl-d - decrease line indent

Visual mode

This mode lets you make visual selections of text.

v - start selecting
V - visual line mode (follow with j or k to select up or down)
vib - select visually within brackets
viB - select visually within braces
viW - select visually within word (or URL or filename)
v2ap - select 2 paragraphs visually
gv - previous visual selection

gv - reselect what was previously selected
= - fix indentation on visually selected text

search within visual selection
	make the selection
	hit escape

visual block mode
	move around to make a selection, e.g - j
	I to insert and type something
	esc to exit the mode and insert the characters

	c - change
	d - delete
	o - toggle to opposite

Command line mode

Typing a colon gives you access to many commands.

Ctrl-b - beginning of command line
Ctrl-e - end of command line
Ctrl-w - delete word
Ctrl-r - insert a register
Ctrl-r Ctrl-w - insert word from under cursor
Ctrl-f - edit using normal mode
@: - repeat previous ex command

:cd ~/Projects/myproject
	cd %:h - change to the directory of the current file
:so ~/.vimrc
:sp a.txt - split window and edit a.txt
:vsp b.txt

:enew - edit a new buffer in the current window

:r - read in a file
	:185r read in line 185

:w - write a file
	:w test.txt

:normal - do something as if in normal mode

:put - put results on a new line
	:put =4*2
	:put =system('echo $RANDOM')

set wrap! - toggle line wrapping
set nowrap
set wrap

external command
	:%! markdown - filter buffer via the external 'markdown' command
	:%! tidy - filter buffer via html tidy
	:!wc % - word count

	:15,30d - delete lines 15 - 30
	:15,30m $ - move lines 15 - 30 to the end
	:15,30>> - indent lines 15 - 30

command history
	: and the up key

	use a % sign on the command line to denote the current file
	:! echo %
	:so %

	:! markdown % > %:p:r.html
	:help filename-modifiers

search and replace
	:%s/old/new - search and replace (first occurrence in each line)
	:%s/old/new/g - search and replace globally
	:%s/old/new/gc - search and replace with confirmations
	d/pattern - delete 'pattern'
	:5,12s/old/new/g - search and replace within range
	:%s/\s\+$//e - strip whitespace from ends of lines

	:%s/<br>\n<br>/\r<\/p>\r<p>/g - replace br with p

	:g/test/d - delete all lines that match 'test'
	:g!/test/d - delete all lines that don't match 'test'
	:g/\t/d - delete all lines with a tab
	:g/^$/d - delete blank lines
	:g!/_/d - delete lines without underscores

	replace line breaks
		Where <Ctrl-V><Ctrl-M> means type Ctrl+V then Ctrl+M. 

	:m 12 - move current line to after line 12
	:m 0 - move current line to before first line
	:m $ - move current line to after last line 
	:m7 - move current line to line 7
	:4m7 - move line 4 to line 7
	:4m$ - move line 4 the end of document

	:3co7 - copy line 3 after line 7
	:3t7 - same as above
	:3t. - copy line 3 to after current line

	:sort - sort lines alphabetically
	:retab! - spaces to tabs
	:dig - digraphs
	:color - show current colorscheme

:%TOhtml - generate HTML page that looks like the current view
:w !sudo tee % - write current file with sudo, to avoid file permission error


	:b3 - display buffer 3
	:bn - next buffer
	:bp previous buffer
	Ctrl-6 - switch between recent buffers


	:%bd - delete all buffers

	:bdel galleries <Ctrl-a> - complete all matches

	status column
		h is hidden
		+ means unsaved changes

	:args ~/Dropbox/documents/unix.txt ~/Dropbox/documents/mac.txt
	:args *.txt
	:args `cat table_of_content.txt`
	:args `find  - -type f`

		:args *.txt
		:argdo %s/\a/*/g
		:argdo update

		search and replace
			:args `git grep -l findme`
			:argdo %s/findme/replacement/gc
			:argdo update

grep (search across multiple files)
	:vimgrep /pr( **/*.ctp

quickfix window

	:set ff? - show fileformat
	convert in current buffer
		:setlocal ff=unix

insert special characters
		:%s/Ctrl-v Ctrl-m//g becomes :%s/^M//g

Back to homepage Back to blog listing