| :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 |