 
      | :h[elp] keyword | - open help for keyword | 
| :sav[eas] file | - save file as | 
| :clo[se] | - close current pane | 
| :ter[minal] | - open a terminal window | 
| K | - open man page for word under the cursor | 
| qa | - record macro a | 
| q | - stop recording macro | 
| @a | - run macro a | 
| @@ | - rerun last run macro | 
| >> | - indent (move right) line one shiftwidth | 
| q | << - de-indent (move left) line one shiftwidth | 
| >% | - indent a block with () or {} (cursor on brace) | 
| >ib | - indent inner block with () | 
| >at | - indent a block with <> tags | 
| 3== | - re-indent 3 lines | 
| =% | - re-indent a block with () or {} (cursor on brace) | 
| =iB | - re-indent inner block with {} | 
| gg=G | - re-indent entire buffer | 
| ]p | - paste and adjust indent to current line | 
| r | - replace a single character. | 
| R | - replace more than one character, until ESC is pressed. | 
| J | - join line below to the current one with one space in between | 
| gJ | - join line below to the current one without space in between | 
| gwip | - reflow paragraph | 
| g~ | - switch case up to motion | 
| gu | - change to lowercase up to motion | 
| gU | - change to uppercase up to motion | 
| cc | - change (replace) entire line | 
| C | - change (replace) to the end of the line | 
| c$ | - change (replace) to the end of the line | 
| ciw | - change (replace) entire word | 
| cw or ce | - change (replace) to the end of the word | 
| s | - delete character and substitute text | 
| S | - delete line and substitute text (same as cc) | 
| xp | - transpose two letters (delete and paste) | 
| u | - undo | 
| U | - restore (undo) last changed line | 
| Ctrl + r | - redo | 
| . | - repeat last command | 
| 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 | 
| yiw | - yank (copy) word under the cursor | 
| yaw | - yank (copy) word under the cursor and the space after or before it | 
| 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 | 
| diw | - delete (cut) word under the cursor | 
| daw | - delete (cut) word under the cursor and the space after or before it | 
| D | - delete (cut) to the end of the line | 
| d$ | - delete (cut) to the end of the line | 
| x | - delete (cut) character | 
| v | - start visual mode, mark lines, then do a command (like y-yank) | 
| 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 {} | 
| at | - a block with <> tags | 
| ib | - inner block with () | 
| iB | - inner block with {} | 
| it | - inner block with <> tags | 
| Esc | - exit visual mode | 
| recording | 
| > | - shift text right | 
| < | - shift text left | 
| y | - yank (copy) marked text | 
| d | - delete marked text | 
| ~ | - switch case | 
| u | - change marked text to lowercase | 
| U | - change marked text to uppercase | 
| :w | - write (save) the file, but don't exit | 
| :w !sudo tee % | - write out the current file using sudo | 
| :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 | 
| :wqa | - write (save) and quit on all tabs | 
| :reg[isters] | - show registers content | 
| "xy | - yank into register x | 
| "xp | - paste contents of register x | 
| "+y | - yank into the system clipboard register | 
| "+p | - paste from the system clipboard register | 
| /pattern | - search for pattern | 
| ?pattern | - search backward for pattern | 
| \vpattern | - 'very magic' pattern: non-alphanumeric characters are interpreted as special regex symbols (no escaping needed) | 
| 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[lsearch] | - remove highlighting of search matches | 
| 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) | 
| ge | - jump backwards to the end of a word | 
| gE | - jump backwards to the end of a word (words can contain punctuation) | 
| % | - move to matching character (default supported pairs: '()', '{}', '[]' - use :h matchpairs in vim for more info) | 
| 0 | - jump to the start of the line | 
| ^ | - jump to the first non-blank character of the line | 
| $ | - jump to the end of the line | 
| g_ | - jump to the last non-blank character of the line | 
| gg | - go to the first line of the document | 
| G | - go to the last line of the document | 
| 5gg or 5G | - go to line 5 | 
| gd | - move to local declaration | 
| gD | - move to global declaration | 
| fx | - jump to next occurrence of character x | 
| tx | - jump to before next occurrence of character x | 
| Fx | - jump to previous occurence of character x | 
| Tx | - jump to after previous occurence of character x | 
| ; | - repeat previous f, t, F or T movement | 
| , | - repeat previous f, t, F or T movement, backwards | 
| } | - 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 + e | - move screen down one line (without moving cursor) | 
| Ctrl + y | - move screen up one line (without moving cursor) | 
| 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 | 
| 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 | 
| Ctrl + h | - delete the character before the cursor during insert mode | 
| Ctrl + w | - delete word before the cursor during insert mode | 
| Ctrl + j | - begin new line during insert mode | 
| Ctrl + t | - indent (move right) line one shiftwidth during insert mode | 
| Ctrl + d | - de-indent (move left) line one shiftwidth during insert mode | 
| Ctrl + n | - insert (auto-complete) next match before the cursor during insert mode | 
| Ctrl + p | - insert (auto-complete) previous match before the cursor during insert mode | 
| Ctrl + rx | - insert the contents of register x | 
| Ctrl + ox | - Temporarily enter normal mode to issue one normal-mode command x. | 
| Esc | - exit insert mode | 
| 0 | - last yank | 
| " | - unnamed register, last delete or yank | 
| % | - current file name | 
| # | - alternate file name | 
| * | - clipboard contents (X11 primary) | 
| + | - clipboard contents (X11 clipboard) | 
| / | - last search pattern | 
| : | - last command-line | 
| . | - last inserted text | 
| - | - last small (less than a line) delete | 
| = | - expression register | 
| _ | - black hole register | 
| :vim[grep] /pattern/ {`{file}`} | - search for pattern in multiple files | 
| e.g. :vim[grep] /foo/ **/* | |
| :cn[ext] | - jump to the next match | 
| :cp[revious] | - jump to the previous match | 
| :cope[n] | - open a window containing the list of matches | 
| :ccl[ose] | - close the quickfix window | 
| :marks | - list of marks | 
| ma | - set current position for mark A | 
| `a | - jump to position of mark A | 
| y`a | - yank text to position of mark A | 
| `0 | - go to the position where Vim was previously exited | 
| `" | - go to the position when last editing this file | 
| `. | - go to the position of the last change in this file | 
| `` | - go to the position before the last jump | 
| :ju[mps] | - list of jumps | 
| Ctrl + i | - go to newer position in jump list | 
| Ctrl + o | - go to older position in jump list | 
| :changes | - list of changes | 
| g, | - go to newer position in change list | 
| g; | - go to older position in change list | 
| Ctrl + ] | - jump to the tag under cursor | 
| :tabnew | - open a file in a new tab | 
| Ctrl + wT | - move the current split window into its own tab | 
| gt or :tabn[ext] | - move to the next tab | 
| gT or :tabp[revious] | - move to the previous tab | 
| #gt | - move to tab number # | 
| :tabm[ove] # | - move current tab to the #th position (indexed from 0) | 
| :tabc[lose] | - close the current tab and all its windows | 
| :tabo[nly] | - close all tabs except for the current one | 
| :tabdo command | - run the command on all tabs (e.g. :tabdo q - closes all opened tabs) | 
| :e[dit] file | - edit a file in a new buffer | 
| :bn[ext] | - go to the next buffer | 
| :bp[revious] | - go to the previous buffer | 
| :bd[elete] | - delete a buffer (close a file) | 
| :b[uffer]# | - go to a buffer by index # | 
| :b[uffer] file | - go to a buffer by file | 
| :ls or :buffers | - list all open buffers | 
| :sp[lit] file | - open a file in a new buffer and split window | 
| :vs[plit] file | - open a file in a new buffer and vertically split window | 
| :vert[ical] ba[ll] | - edit all buffers as vertical windows | 
| :tab ba[ll] | - edit all buffers as tabs | 
| Ctrl + ws | - split window | 
| Ctrl + wv | - split window vertically | 
| Ctrl + ww | - switch windows | 
| Ctrl + wq | - quit a window | 
| Ctrl + wx | - exchange current window with next one | 
| Ctrl + w= | - make all windows equal height & width | 
| Ctrl + wh | - move cursor to the left window (vertical split) | 
| Ctrl + wl | - move cursor to the right window (vertical split) | 
| Ctrl + wj | - move cursor to the window below (horizontal split) | 
| Ctrl + wk | - move cursor to the window above (horizontal split) | 
| Ctrl + wH | - make current window full height at far left (leftmost vertical window) | 
| Ctrl + wL | - make current window full height at far right (rightmost vertical window) | 
| Ctrl + wJ | - make current window full width at the very bottom (bottommost horizontal window) | 
| Ctrl + wK | - make current window full width at the very top (topmost horizontal window) | 
| zf | - manually define a fold up to motion | 
| zd | - delete fold under the cursor | 
| za | - toggle fold under the cursor | 
| zo | - open fold under the cursor | 
| zc | - close fold under the cursor | 
| zr | - reduce (open) all folds by one level | 
| zm | - fold more (close) all folds by one level | 
| zi | - toggle folding functionality | 
| ]c | - jump to start of next change | 
| [c | - jump to start of previous change | 
| do or :diffg[et] | - obtain (get) difference (from other buffer) | 
| dp or :diffpu[t] | - put difference (to other buffer) | 
| :diffthis | - make current window part of diff | 
| :dif[fupdate] | - update differences | 
| :diffo[ff] | - switch off diff mode for current window |