Skip to content

Instantly share code, notes, and snippets.

Last active September 27, 2023 06:59
Star You must be signed in to star a gist
What would you like to do?
vim / vimdiff cheatsheet - essential commands

Vim cheat sheet

Starting Vim

vim [file1] [file2] ...

Table of contents

Vim modality

vim has 3 main modes:

  • Normal mode: For navigation and manipulation of text. This is the mode that vim will usually start in
  • Insert (edit) mode: For inserting new text, where you type into your file like other editors.
  • Command mode: For executing extra commands like the help, shell, ...


Normal mode


move around the text (file) by:

0 / ^ / B / b / h <   > l / e / E / w / W / $


arrow keys

  • h: left
  • j: down
  • k: up
  • l: right


  • w: next word
  • W: next WORD
  • b: previous word
  • B: previous WORD
  • e: end of word
  • E: end of WORD


  • 0: begin of line (column 0)
  • ^: begin of line (non-blank)
  • $: end of line
  • - = k^: start of previous line
  • + = j^: start of next line


  • H: top of window
  • M: middle of window
  • L: low (bottom) of window
  • zt: scroll to top
  • zz: scroll to middle
  • zb: scroll to bottom
  • <ctrl+b> / <ctrl+f>: previous / next page
  • <ctrl+u> / <ctrl+d>: previous / next half page


  • gg / G: go to begin / end of file
  • [num]gg / [num]G / :num<CR> : go to line num
  • gd: go to definition of current word
  • gf: go to the file (under the cursor)



searching in Normal Mode:

  • f[char] / F[char]: find forward / backward to next / previous char (exactly on char)
  • t[chat] / T[char]: up to forward / backward to next / previous char (next to the char)
  • , / ;: previous / next repeat for f/t/F/T action
  • * / #: find current word backward / forward
  • /[pattern] / ?[pattern]: search forward / backward by matching pattern
  • n / N: next / previous result
  • [I: show lines with matching word under cursor


jumps and marks

  • <ctrl+o>: jump back
  • <ctrl+i>: jump forward
  • <ctrl+6>: jump to the buffer you just left
  • <ctrl+]>: jump to tag under cursor (if ./tags is available)
  • '': jump back to last jump
  • '.: jump to last edited line
  • { / }: previous / next paragraph
  • %: matching (), {}, []
  • m[char] / '[char]: mark by / jump to [char]
  • m[CHAR] / '[CHAR]: mark by / jump to [CHAR] across the files.



goto insert mode

these commands take you in Insert Mode:

  • i: insert at left of cursor
  • I -> insert at the line beginning (non-blank)
  • a: insert at right of cursor
  • A: insert at end of line
  • o: insert by adding new line below the cursor
  • O: insert by insert new line above the cursor
  • s: substitute at cursor and enter insert mode
  • S = ^DA = ddO: delete current line and enter insert mode
  • C = c$: change line from cursor to EOL

stay in command mode

editing the text without transition to Insert Mode:

  • .: repeat last command
  • ~: swap case
  • x: delete char current char
  • r: replace char under the cursor
  • dd: delete current line
  • J: merge with the next line
  • D: delete line from cursor to the EOL
  • yy: yank/copy current line
  • u: undo
  • <ctrl+r>: redo


  • p: paste to the next line
  • P: paste above current line

visual mode:

  • v: into visual/select mode
  • V: into visual/select mode by line
  • <ctrl+v>: into visual/select mode by block


  • =<CR>, ==: auto indent
  • ><CR>, >>: shift right, increase indent
  • <<CR>, <<: shift left, decrease indent



operator are generally constructed as:

  • operators:
    • c: change command ...
    • d: delete ...
    • y: yank (copy) ...
    • g~: swap case ...
    • gu: to lower case ...
    • gU: to upper case ...
  • motion:
    • w / W: word / WORD
    • [, ]: block
    • (, ): block
    • <, >: block
    • ", ': in double quote or quote
    • t: XML/HTML tag
    • s: sentence


  • di): delete the text inside current paranthesis
  • ci": change the text inside ""
  • gUiw: make the word under the cursor to upper case




  • "[char][y|d]: yank/delete into register
  • "[char][p|P]: paste from register
  • :echo @[char]: shows register content
  • :reg[isters]: shows all registers


  • q[char]: start recording into register char
  • q: stop recording macro
  • @[char]: play macro in register char
  • @@: repeat last playback

code folding

  • zi: toggles folding on or off
  • za: toggles current fold open or close
  • zc: close current fold
  • zC: close current fold recursively
  • zo: open current fold
  • zO: open current fold recursively
  • zR: open all folds
  • zM: close all folds
  • zv: expand folds to reveal the cursor
  • zk / zj: move to previous / next fold


windows and split

  • <ctrl+w> s = :sp[lit]: split current window horizontally
  • <ctrl+w> v = :vs[plit]: split current window vertically
  • <ctrl+w> c = :cl[ose]: close current window
  • <ctrl+w> o = :on[ly]: close all windows except current one
  • <ctrl+w> <ctrl+w>: switch to next split window
  • <ctrl+w> <ctrl+p>: switch to previous split window
  • <ctrl+w> hjkl: switch (move cursor) to left, below, above or right split
  • <ctrl+w> HJKL: move current window to left, below, above or right
  • <ctrl+w> r: rotate window clockwise
  • <ctrl+w> =: make all windows equal in size
  • [num]<ctrl+w> +-: increase/decrease current window height
  • [num]<ctrl+w> <>: increase/decrease current window width
  • <ctrl+w> _: minimize current window
  • <ctrl+w> T: move current window to new tab


spell checking

  • ]s / [s: jump to next / previous spelling error
  • z=: suggest corrections for current word
  • zg: add current word to the dictionary
  • zw: remove current word from dictionary


Insert mode

mode change

  • Esc = <ctrl+c> = <ctrl+[>: exit insert mode

auto complete

  • <ctrl+p>: auto-complete / previous item
  • <ctrl+n>: auto-complete / next item
  • <ctrl+x><ctrl+l>: auto complete line mode

cool editing stuff

  • <ctrl+w>: delete word before cursor
  • <ctrl+u>: delete line before cursor
  • <ctrl+r>[char]: insert content of register [char]
  • <ctrl+t>: increase line indent
  • <ctrl+u>: decrease line indent


Command mode


  • :jumps: shows the jump list
  • :changes: shows the change list
  • :reg[isters]: shows the registers
  • :marks: shows the marks
  • :delm[arks] {marks}: delete specified mark(s)
    • delm a b 1 \": deletes a, b, 1 and "
    • delm a-h: deletes all marks from a to h
  • :delm[marks]!: deletes all lowercase marks

file and buffers

  • :w[rite]: write current file
  • :q: close/quit current file, split or tab
  • :wq = ZZ: write current file and quit
  • :q! = ZQ: quit without writing the changes
  • :qa: quit all splits
  • :ls: list all open files/buffers
  • :f[ile] = <ctrl+g>: shows current file path
  • :e[dit]: open a file for editing
  • :ene[w]: open a blank new file for editing
  • :b<n>: jump to buffer n returned from :ls
  • :b <file>: jump to buffer file, Tab to scroll through available options
  • :bn[ext]: jump to next buffer
  • :bp[rev]: jump to previous buffer
  • :bd[elete]: remove file from buffer list



  • :mak[e]: run make in current directory
  • :cw: toggle mini window for errors
  • :!: executes external shell command
  • :r[ead]: read external program output into current file


windows and splits

  • :sp[lit] = <ctrl+w> s: split current window horizontally
  • :vs[plit] = <ctrl+w> v: split current window vertically
  • :cl[ose] = <ctrl+w> c: close current window
  • :on[ly] = <ctrl+w> o: close all windows except current one



  • <ctrl+w> gf: open file under the cursor into new tab
  • :tabs: list current tabs and windows
  • :tabn = <ctrl+PageDown>: next tab
  • :tabn <n>: goto tab n
  • :tabp = tabN = <ctrl+PageUp>: previous tab
  • :tabe [file]: create a new blank tab or opens file in that tab



  • :h cmd: normal mode command help
  • :h :cmd: command line help for cmd
  • :h i_cmd: insert mode command help
  • :h v_cmd: visual mode command help
  • :h c_cmd: command line editing cmd help
  • :h 'option': help of option
  • :helpg[rep]: search through help docs!

special help sections

  • :h motions
  • :h word-motions
  • :h jump-motions
  • :h mark-motions
  • :h operators
  • :h buffres
  • :h windows
  • :h tabs
  • :h registers
  • :h pattern-searches



  • :set <opt>?: shows current option value
  • :set no<opt>: turn off flag opt
  • :set opt: turn on flag opt
  • :set opt=val: override value of opt
  • :set opt+=val: append val to opt
  • :echo &opt: shows value of opt

essential options

  • hidden or hid: when off, a buffer is unloaded when it's abandoned.
  • laststatus or ls: shows status line: 0 (never), 1 (only if at least two windows), 3 (always)
  • hisearch or his: highlight search matches
  • number or nu: shows line number
  • showcmd or sc: shows command as you type them (may not be available on your compilation)
  • ruler or ru: shows line and column number of the cursor
  • wrap: controls line wrapping
  • ignorecase or ic: ignores case for search patterns
  • smartindent or si: flag for smart indenting
  • foldmethod or fdm: fold method
  • spell / nospell: turn spell checking enable or disable.



  • :s/search/replace/: basic substitution on a line
  • :%s/search/replace/: run substitution on every line
  • :%s/search/replace/g: g flag means apply to every match
  • :%s/search/replace/c: c flag means ask for confirmation

tags / ctags

by executing $> ctags -r under project tree:

  • :tag <name>TAB: goes to tag name
  • <ctrl+]>: goes to the tag under cursor



  • do: get changes from other window into the current window
  • dp: put the changes from current window into the other window
  • ]c: jump to the next change
  • [c: jump to the previous change
  • zo: open fold
  • zc: close fold
  • zr: reducing folding level
  • zm: one more folding level, please
  • :diffupdate, :diffu: recalculate the diff
  • :diffg RE: get from REMOTE
  • :diffg BA: get from BASE
  • :diffg LO: get from LOCAL


Copy link


Copy link

Very useful

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment