: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 or word under the cursorTip: Run
vimtutorin a terminal for a basic Vim tutorial.
h: move cursor leftj: move cursor downk: move cursor upl: move cursor rightH: move to top of screenM: move to middle of screenL: move to bottom of screenw: 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)% move to the matching character (default supported pairs: ‘()’, ‘{}’, ‘[]’ - use :h matchpairs in vim for more info)0: jump to the start of a line^: jump to the first non-blank character of the line$: jump to the end of a linkg_: 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 documentgd: move to local declaration (useful for finding first instance of code variables)gD: move to global declaration (useful for finding first instance of code variables)fx: jump to next occurrence of character xtx: jump to before next occurrence of character xFx: jump to 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)zz: center cursor on screenCtrl + 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 screenCtrl + f: move forward one full screenCtrl + d: move forward 1/2 a screenCtrl + u: move back 1/2 a screenTip: Prefix a cursor movement command with a number to repeat it. For example,
4jmoves down 4 lines.
i: insert before the cursorI: insert at the beginning of the linea: append after the cursorA: append at the end of the lineo open a new line beloe the current lineO: open a new line above the current lineea: append at the end of the wordCtrl + h: delete the character before the cursor during insert modeCtrl + w: delete the 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 leftO 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 curser during insert modeCtrl + rx: insert contents of register xCtrl + ox: temporarily enter normal mode to issue one normal-mode command xEsc: exit insert moder: 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 paragrahg~: switch case up tp motiongu: change to lowercase up to motiongU: change to uppercase up to motioncc: replace entire lineC or c$: replace to the end of the lineciw: replace entire wordcw or ce: 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 changeCtrl + r: redo.: repeat last commandv: start visual mode (then mark likes and do a command)V: start linewise visual modeo: move to other end of marked areaCtrl + v: start visual block modeO: move to other corner of blockaw: mark a wordab: mark a block between (), inclusiveaB: mark a block between {}, inclusiveat: mark a block between <> tags, inclusiveib: mark a block between (), exclusiveiB: mark a block between {}, exclusiveit: mark a block between <> tags, exclusiveESC: exit visual modeTip: instead of
borBone can also use(or{respectively.
>: shift text right<: shift text lefty: yank (copy) marked textd: delete marked text~: switch caseu: change marked text to lowercaseU: change marked text to uppercasereg[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 registerTip: Registers are being stored in
~/.viminfo, and will be loaded again on next restart of vim.
Tip: Special registers:
O: 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 marksma: set current position for mark A'a: jump to position of mark Ay'a: tank text to position of mark A: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;: fo to older position in change listCtrl + ]: jump to the tag under cursorTip: 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.
qa: record macro aq stop recording macro@a: run macro a@@: rerun last 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 wordyiw: yank (copy) word under the cursoryaw: yank (copy) word under the cursor and the space after or before ity$: yank (copy) to end of linep: 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 textdd: 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 itD: 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 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:%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: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 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)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 windowTip: The commands for folding (e.g.
za) operate on one level. To operate on all levels, use uppercase letters (e.g.zA).
Tip: To view the differences of files, one can directly start Vim in diff mode by running
vimdiffin a terminal. One can even set this asgit difftool.