:h[elp] <keyword> - open help for <keyword> (don't use "<>"):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
Tip: - Run vimtutor in a terminal to learn the first Vim commands.
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)
% - 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
; - 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)
g_ - 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 5gd - 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 previous occurence of character xTx - jump to after previous occurence of character xzz - center cursor on screengh - move cursor up to the pevious editor linegj - move cursor down to the next editor lineg0 - jump to the beginning of the editor lineg^ - jump to the first non-blank character in the editor lineg$ - jump to the end of the editor lineCtrl + 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
Tip: - Prefix a cursor movement command with a number to repeat it. For example, 4j moves down 4 lines.
Ctrl + h - delete the character before the cursor during insert modeCtrl + w - delete word before the cursor during insert modeCtrl + j - begin new line 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 + 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)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 wordEsc - exit insert moder - replace a single characterJ - 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 - change (replace) to the end of the linec$ - change (replace) to the end of the lineciw - change (replace) entire wordcw - change (replace) to the end of the words - delete character and substitute textS - 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 commandv - start visual mode, mark lines, then do a command (like y-yank)V - start linewise visual modegv - start visual mode, recalling the previous selectiono - move to other end of marked areaCtrl + v - start visual block modeO - move to other corner of blockaw - 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 - exit visual mode> - 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: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.
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* - 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
Tip - To jump to a mark you can either use a backtick (`) or an apostrophe ('). Using an apostrophe jumps to the beginning (first non-black) of the line holding the mark.
qa - record macro aq - stop recording macro@a - run macro a@@ - rerun last run macroyy - 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 wordy$ - yank (copy) to end of linep - put (paste) the clipboard after cursorP - put (paste) before cursordd - 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 wordD - delete (cut) to the end of the lined$ - delete (cut) to the end of the linex- delete (cut) character>> - indent (move right) line one shiftwidth<< - 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 <> 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: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/pattern - search for pattern?pattern - search backward for patternvpattern - '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:%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: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: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):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> (_remove the "<>"):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 tabszf - 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