See maketecheasier cheatsheet and the scaron.info blog and learnbyexample.github.io
Normal Mode
hjkl -- left down up right
gg -- start of buffer
G -- end of buffer
GG -- start of file
^ -- beginning of line (first nonempty char)
0 -- start of line (character 0)
$ -- end of line
( -- one sentence forward
) -- one sentence backward
{ -- one para back
} -- one para forward
[[ -- previous section
]] -- next section
[] -- end of previous section
][ -- end of next section
w -- forward one word, alphanumeric
W -- forward one wird, delimited by whitespace
given 1,2,3,4 5,6,7,8 w will to from 1 to 2 to 3... W will go from 1,2 to 5,6
b -- back one word alphanumeric
B -- back one word whitespace
i -- insert text at cursor
I -- insert at start of line
o -- insert text in new line below current
O -- insert text in new line above current
a -- append text (after cursor)
A -- append to end of line
x -- delete char under cursor
X -- delete char before cursor
dd -- delete current line
D -- delete from cursor to end of line
p -- paste below current line (see registers, e.g. "qp pastes from register q)
P -- paste above current line
y -- yank (copy to register)
dw dW -- delete word
d<dirn> -- delete from current to wherever <dirn> takes us
(deleting lines in case of j, but chars in case of h)
r -- replace char under cursor
3r -- replace three chars starting with one under cursor
cc -- change current line
ce -- change from cursor to end of word
ci" -- change between "..."
ci< -- change between <...>
c0 -- change from start of line to cursor
c$ -- change from cursor to end of line
G~<dir> -- toggle uppercase and lowercase
G~~ -- for current line
gU<dir> -- uppercase
gUU -- for current line
guu -- lowercase
ciw -- change current word
ci" -- change inside ".."
ci' -- change inside '..'
ci( -- change inside (..) similarly for [..], <..> and {..} (respects nesting)
Xi( -- similar for other actions (e.g. yi{ yanks everything between {..}
yip -- yank entire block or para (e.g. a class {...} or function in C)
caw -- change word including following whitespace
ca{ -- change contents of (..) including the parens
"xyy -- copy current line into register x
"x<cmd> -- use register x rather than default register for <cmd>
'''
## undo/redo
'''
u -- undo
<C=r> -- redo
:earlier 1m -- go back 1 minute in history of document
:later 1m -- go forward 1 minute in history of document
text manipulation
gq -- wrap selected lines (by inserting newlines)
see :set textwidth=60
< -- unindent
> -- indent
gg=G -- autoindent document
>% -- indent entire code block
<% -- unindent entire code block
<at -- unindent <tag>..</tag> delimited block
>at -- indent tag delimited block
TODO
<ib
>ib
macros
qa -- start recording macro a
@a -- execute macro a
@@ -- execute last executed macro
searching
/pat -- search forward for pat
?pat -- search backward for pat
* -- search forward for next occurrence of exact word under cursor
g* -- search forward for next word containing the word under the cursor
gd -- go to local variable definition
gD -- go to global variable definition
n -- next match when searching
N -- previous match when searching
s/pat/rep/gc -- replace all, confirming
ranges
:s/pat/rep -- replace first occurrence of pat with rep -- current line
:s/pat/rep/ -- same as above
:s/pat/rep/g -- replace all occurrences
:s/pat/rep/i -- case insensitive
:s/pat/rep/gi -- combines above
:%s/pat/rep -- apply to all lines
:2,6s/... -- apply to lines 2..6
:m,ns/... -- apply to lines from m to n (s/ can be any action)
:.,$s/... -- apply to lines from current to end
:m,$s/... -- apply to lines from m to end
:1,ns/... -- apply to lines from 1 to n
:-3s/... -- apply to 3rd line before current
:-3,+3s/... -- apply to lines from 3rd before to 3rd after (be careful about off-by-ones)
:1,$s/... -- equivalent to :%s/...
regex match ranges
g/flibble/s/mr/lord -- s/mr/lord on lines matching pattern 'flibbble'
g!/script/d -- delete all lines not matching pattern 'script'
bookmarks
mx -- set bookmark x (in range [a-zA-Z])
:marks -- list bookmarks
`x -- jump to bookmark x
numerical prefix
2x -- delete 2 chars
3j -- go up 3 lines
dd -- delete current line
f" -- forward to next "
F> -- bacwards to previous >
"qyy -- yank into register q
"app -- paste from register a
: -- : command
<C-w>s -- split horizontally into upper and lower windows, same buffer in each, top buffer selected
<C-w>v -- split vertically into left and right windows, same buffer in each, left buffer selected
Insert Mode
<C-w> -- delete from cursor to start of current word
<C-u> -- delete from cursor to start of line, preserving indent
<C-n> -- autocomplete word (next)
<C-p> -- autocomplete word (prev)
<C-y> -- select word to autocomplete (i.e.y to accept autocompletion)
<C-e> -- cancel autocompletion
<C-x><C-l> -- line autocompletion
<C-o> -- execute single normal mode command and return to insert mode
<C-t> -- indent current line
<C-d> -- unindent current line
0<C-d> -- delete all indentation on current line
<C-r>% -- insert current filename
<C-r>a -- paste contents of register a
<C-r><C-r>a -- as <C-r>a but e.g. backspaces are inserted as literal ^H's
rather than interpreting them as if typed
note :set paste and :set nopaste — nopaste mode autoindents as if you were typing the
characters pasted — paste mode doesn't autoindent,and just dumps the text into the buffer.
<C=v>x -- insert literal (e.g. <C-v><enter> inserts ^M)
<C-l>Ye -- for inserting digraphs (use Xcompose instead if you can)
:digraphs -- list of digraphs
Colon commands
File and buffer commands
:w -- save file
:w filename -- write buffer to filename, will refuse to overwrite
:w! filename -- write buffer to filename, overwriting a preexisting file
:w !command -- pipe buffer into command
:e filename -- open filename in current buffer
:r filename -- paste contents of filename below current line
:vsplit filename -- split vertically, current buffer on right, load filename into left
:split filename -- split horizontally, current buffer below, load filename above
:wq -- save and close buffer, exiting if last buffer
:q! -- close current buffer without saving, even if modified
:n -- open next file (specified on command line)
ZZ -- write if modified and quit
ZQ -- quit without writing
:sav -- save as
:saveas -- idem
:clo -- close current pane
:close -- close current pane
Editing commands
:sort -- sort selected lines
:sort u -- sort selected lines, removing duplicates (u is for unique, as in sort|uniq)
Visual keys
From normal mode
v -- character by character
<S-v> -- line by line
<C-v> -- select column/rectangle
then in visual mode
hjkl -- move end of selection
v etc -- exit visual mode (press the same combo as for current visual mode)
Visual commands
:'<,'> -- do something to the currently selected lines
:'<,'>s/hello/world -- including partially touched files
:'<,'>d -- such as regex search/replace or delete
:'<.'>w filename -- write selected lines to filename
:'<,'>w !command -- pipe selected lines to command
Tabs
:tabe filename -- open filename in new tab
:tabn -- next tab
:tabp -- previous tab
:tabc -- close tab
:tabo -- close all inactive tabs in buffer
Split
:split filename -- split horizontally
:sp -- shorthand for :split
:vsplit filename -- idem for vertical split
:vsp
:ls -- list all open buffers
<C-w>S -- split, same buffers
<C-w>V -- vsplit
<C-w><C-w> -- switch buffers
<C-w><dirn> -- move to buffer in direction given by hjkl (or cursor keys)
Buffer
:bn -- next buffer
:bp -- previous buffer