Vim Cheatsheet
A quick reference guide for essential Vim commands and shortcuts.
Modes
- Normal Mode: Default mode for commands
- Insert Mode: For typing text
- Visual Mode: For selecting text
- Command Mode: For entering commands
Global
:h[elp] keyword
- open help for keyword:sav[eas] file
- save file as:clo[se]
- close current pane:ter[minal]
- open a terminal windowK
- open man page for word under the cursor
Cursor Movement
h - move cursor leftj - move cursor downk - move cursor upl - move cursor rightgj - move cursor down (multi-line text)gk - move cursor up (multi-line text)H - move to top of screenM - move to middle of screenL - move to bottom of screen
Word Movement
w - jump forwards to the start of a wordW - jump forwards to the start of a word (words can contain punctuation)e - jump forwards to the end of a wordE - jump forwards to the end of a word (words can contain punctuation)b - jump backwards to the start of a wordB - jump backwards to the start of a word (words can contain punctuation)ge - jump backwards to the end of a wordgE - jump backwards to the end of a word (words can contain punctuation)
Line Movement
0 - jump to the start of the line^ - jump to the first non-blank character of the line$ - jump to the end of the lineg_ - jump to the last non-blank character of the linegg - go to the first line of the documentG - go to the last line of the document5gg or 5G - go to line 5
Screen Movement
zz - center cursor on screenzt - position cursor on top of the screenzb - position cursor on bottom of the screenCtrl + e - move screen down one line (without moving cursor)Ctrl + y - move screen up one line (without moving cursor)Ctrl + b - move screen up one page (cursor to last line)Ctrl + f - move screen down one page (cursor to first line)Ctrl + d - move cursor and screen down 1/2 pageCtrl + u - move cursor and screen up 1/2 page
Advanced Movement
% - move cursor to matching character (default supported pairs: '()', '{}', '[]')gd - move to local declarationgD - move to global declarationfx - jump to next occurrence of character xtx - jump to before next occurrence of character xFx - jump to the previous occurrence of character xTx - jump to after previous occurrence 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)
Tip: Prefix a cursor movement command with a number to repeat it. For example,
4j
moves down 4 lines.
Insert Mode
Entering Insert Mode
i - insert before the cursorI - insert at the beginning of the linea - insert (append) after the cursorA - insert (append) at the end of the lineo - append (open) a new line below the current lineO - append (open) a new line above the current lineea - insert (append) at the end of the word
Insert Mode Commands
Ctrl + h - delete the character before the cursor during insert modeCtrl + w - delete word before the cursor during insert modeCtrl + j - add a line break at the cursor position during insert modeCtrl + t - indent (move right) line one shiftwidth during insert modeCtrl + d - de-indent (move left) line one shiftwidth during insert modeCtrl + n - insert (auto-complete) next match before the cursor during insert modeCtrl + p - insert (auto-complete) previous match before the cursor during insert modeCtrl + rx - insert the contents of register xCtrl + ox - Temporarily enter normal mode to issue one normal-mode command x.Esc or Ctrl + c - exit insert mode
Editing
Basic Operations
r - replace a single characterR - replace more than one character, until ESC is pressedJ - join line below to the current one with one space in betweengJ - join line below to the current one without space in betweengwip - reflow paragraphg~ - switch case up to motiongu - change to lowercase up to motiongU - change to uppercase up to motioncc - change (replace) entire linec$ or C - change (replace) to the end of the lineciw - change (replace) entire wordcw or ce - change (replace) to the end of the words - delete character and substitute text (same as cl)S - delete line and substitute text (same as cc)xp - transpose two letters (delete and paste)u - undoU - restore (undo) last changed lineCtrl + r - redo. - repeat last command
Visual Mode
Entering Visual Mode
v - start visual mode, mark lines, then do a command (like y-yank)V - start linewise visual modeo - move to other end of marked areaCtrl + v - start visual block modeO - move to other corner of block
Text Objects in Visual Mode
aw - mark a wordab - a block with ()aB - a block with {}at - a block with <> tagsib - inner block with ()iB - inner block with {}it - inner block with <> tagsEsc or Ctrl + c - exit visual mode
Tip: Instead of
b
orB
one can also use(
or{
respectively.
Visual Commands
> - shift text right< - shift text lefty - yank (copy) marked textd - delete marked text~ - switch caseu - change marked text to lowercaseU - change marked text to uppercase
Registers
: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
Tip: Registers are being stored in ~/.viminfo, and will be loaded again on next restart of vim.
Tip: Special registers:
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
Marks and Positions
:marks - list of marksma - set current position for mark A`a - jump to position of mark Ay`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 jumpsCtrl + i - go to newer position in jump listCtrl + o - go to older position in jump list:changes - list of changesg, - go to newer position in change listg; - go to older position in change listCtrl + ] - jump to the tag under cursor
Tip: To jump to a mark you can either use a backtick (`) or an apostrophe (’). Using an apostrophe jumps to the beginning (first non-blank) of the line holding the mark.
Macros
qa - record macro aq - stop recording macro@a - run macro a@@ - rerun last run macro
Cut and Paste
Yanking (Copying)
yy - yank (copy) a line2yy - yank (copy) 2 linesyw - yank (copy) the characters of the word from the cursor position to the start of the next wordyiw - yank (copy) word under the cursoryaw - yank (copy) word under the cursor and the space after or before ity$ or Y - yank (copy) to end of line
Pasting
p - put (paste) the clipboard after cursorP - put (paste) before cursorgp - put (paste) the clipboard after cursor and leave cursor after the new textgP - put (paste) before cursor and leave cursor after the new text
Deleting
dd - delete (cut) a line2dd - delete (cut) 2 linesdw - delete (cut) the characters of the word from the cursor position to the start of the next worddiw - delete (cut) word under the cursordaw - delete (cut) word under the cursor and the space after or before it:3,5d - delete lines starting from 3 to 5
Tip: You can also use the following characters to specify the range:
:.,$d
- From the current line to the end of the file:.,1d
- From the current line to the beginning of the file:10,1d
- From the 10th line to the beginning of the file
:g/{pattern}/d - delete all lines containing pattern:g!/{pattern}/d - delete all lines not containing patternd$ or D - delete (cut) to the end of the linex - delete (cut) character
Indent Text
>> - indent (move right) line one shiftwidth<< - de-indent (move left) line one shiftwidth>% - indent a block with () or {} (cursor on brace)<% - de-indent a block with () or {} (cursor on brace)>ib - indent inner block with ()>at - indent a block with <> tags3== - 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
Exiting
: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
Search and Replace
Search
/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 directionN - repeat search in opposite direction
Replace
:%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
Search in Multiple Files
:vim[grep] /pattern/ {`{file}`} - search for pattern in multiple files: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
Tabs
:tabnew or :tabnew {page.words.file} - open a file in a new tabCtrl + wT - move the current split window into its own tabgt or :tabn[ext] - move to the next tabgT 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)
Working with Multiple Files
Buffer Management
: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
Window Management
: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 tabsCtrl + ws - split windowCtrl + wv - split window verticallyCtrl + ww - switch windowsCtrl + wq - quit a windowCtrl + wx - exchange current window with next oneCtrl + w= - make all windows equal height & widthCtrl + 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)
Folds
zf - manually define a fold up to motionzd - delete fold under the cursorza - toggle fold under the cursorzo - open fold under the cursorzc - close fold under the cursorzr - reduce (open) all folds by one levelzm - fold more (close) all folds by one levelzi - toggle folding functionality]c - jump to start of next change[c - jump to start of previous changedo 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
Tip: The commands for folding (e.g.
za
) operate on one level. To operate on all levels, use uppercase letters (e.g.zA
).