Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
VIM movement, keyboard commands and shortcuts

VIM Cheatsheet

Motion, keyboard commands and shortcuts for VI Improved

Graphic

Legend

Command Keyboard Character
command
control
alt
delete
option
shift
caps lock
tab
arrow up
arrow down
arrow left
arrow right
escape or
return/enter or
home
end
page up
page down

Motion - Normal Mode

  • j - Down
  • k - Up
  • h - Left
  • l - Right
  • 0, ⇧6 - Line beginning
  • $ - Line ending
  • e, w - Forward (Small word)
  • ⇧e, ⇧w - Forward (big word forward (whitespace only))
  • b - Backwards (small word)
  • ⇧b - Backwards (big word)
  • f<char> - Jump to first occurrence of <char>
  • ; - Repeat previous jump
  • ⇧f<char> - Jump to previous first occurrence of <char>
  • t<char> - Jump to position before first occurrence of <char>
  • ⇧t<char> - Jump to position before first previous occurrence of <char> in the direction youre searching
  • <n> <motion> - Prefix motion command with a number n to have it jump that n away. e.g. 4li jumps to the 4th 'i' forward.
  • ⌃f - Forward (page)
  • ⌃b - Backward (page)
  • ⌃u - Upward (half page)
  • ⌃d - Downward (half page)
  • ⇧h - Head (of current page)
  • ⇧m - Middle (of current page)
  • ⇧l - Lowest (of current page)
  • gg - Go to top of file
  • ⇧gg - Go to bottom of file
  • <n>⇧g - Go to line n
  • ][ - Jump to next matching brace
  • [] - Jump to previous matching brace
  • % - Jump between matching braces
  • za - Toggle code fold
  • zo - Open code fold
  • zc - Close code fold
  • zr - Open one layer of code folds
  • z⇧r - Open all code folks

Insert Mode

These commands are entered while in Normal or visual mode.

  • i - Insert at cursor
  • ⇧i - Insert at line beginning
  • a - Append after cursor
  • ea - Append after word at cursor
  • ⇧a - Append at end of line
  • o - Insert line below cursor
  • ⇧o - Insert line above cursor
  • x - Delete character under cursor
  • ⇧x - Delete character before cursor
  • dd - Delete line at cursor position
  • d <motion> - Delete amount by motion command e.g. dw delete small word
  • c <motion> - Change by motion e.g. cw overwrite small word
  • r - Replace character at cursor
  • ⇧r - Replace overwriting text
  • ^v u <codepoint> - Insert unicode character at codepoint
  • - Exit insert mode

Changes

  • ⇧j - Join line with line below
  • c(f|t)<char> - Change characters (inclusive with f or exclusive with t) to char

Yank/Put or Copy/Paste

  • yw - Yank word into buffer
  • yy - Yank line into buffer
  • <n>yy- Yank n lines into buffer
  • y <motion> - Yank into buffer by motion
  • x - Yank character at cursor
  • p - Put buffer after cursor
  • ⇧p - Put buffer before cursor

Visual / Visual Block Mode

Visual mode is used for marking text.

  • v - Visual mode
  • V - Visual line-based mode
  • ⌃v - Visual block mode
  • gv - Re-select previous Visual block buffer
  • o - Jump to other end of block
  • ⇧o - Jump to other corner of block
  • vaw - Visual select a word (includes whitespace)
  • viw - Vissual select inner word (no whitespace)
  • vap - Visual select a paragraph
  • vip - Visual select inner paragraph
  • va[ - Visual select [] block and contents
  • vi[ - Visual select [] contents only
  • va{ - Visual select {} block and contents
  • vi{ - Visual select {} contents only
  • va( - Visual select () block and contents
  • vi( - Visual select () contents only
  • va< - Visual select <> block and contents
  • vi< - Visual select <> contents only
  • va" - Visual select all double quote and contents
  • vi" - Visual select inner quoted contents
  • vit - Visual select inner XML/HTML tag contents
  • vat - Visual select all XML/HTML tag contents
  • v<motion> - Visually mark text by motion command
  • - Exit visual mode

The following commands can be used while text is marked.

  • c - Delete and begin inserting (To replace currently marked text)
  • d - Delete
  • y - Yank
  • > - Indent right
  • < - Indent left

Commands

  • . - Repeat previous command
  • u - Undo previous command
  • ⇧u - Undo all changes to current line
  • ⌃r - Redo
  • :q - Quit
  • :q! - Quit (without saving changes)

Files

  • :e <path> - OpEn file into buffer
  • :w - Write buffer to file
  • :ls - List open buffers
  • :(b|buf|buffer) <n> - Switch to buff n
  • :(bd|bdelete) <n> - Delete buffer n (close file)
  • :bp - Switch to previous buffer
  • :bn - Switch to next buffer

Windows

  • ⌃wo - make current window the Only window
  • :(sp|spl|split) <path> - SPlit window horizontally, optionally loading file at path
  • :vsp <path> - Vertically SPlit window, optionally loading file at path
  • ⌃ws - Window split (horizontally)
  • ⌃wv - Window split (vertically)
  • ⌃wx - Windows eXchange, swap their position
  • ⌃wk - Move window up
  • ⌃wj - Move window down
  • ⌃wh - Move window left
  • ⌃wl - Move window right
  • ⌃wp - Move window previous
  • ⌃wc - Window close
  • ⌃w= - Balance windows
  • ⌃w+ - Grow horizontal window split by 1
  • ⌃w- - Shrink horizontal window split by 1
  • ⌃w> - Grow vertical window split by 1
  • ⌃w< - Shrink vertical window split by 1
  • :(resize|res) (+|-)<n> - Horizontal resize to n or increase/decrease by n
  • :vertical resize (+|-)<n> - Vertical resize to n or increase/decrease by n

Tabs

  • gt - GoTo next tab
  • g⇧t - Goto previous tab
  • <n>gt - Goto tab n
  • :tabedit <file> - Edit specified file in a new tab
  • :tabfind <file> - Open a new tab with filename given
  • :tabclose - Close tab
  • :tabclose <n> - Close tab n
  • :tabonly - Close all other tabs

coc.nvim

  • ,dj Open implementation at cursor (coc-implementation)
  • ,dd Open symbol definition at cursor (coc-definition)
  • ,dr Open panel of symbol references at cursor (coc-references)

Denite

  • ; - fuzzy-search buffers for a string
  • ,t - fuzzy-search current directory for string
  • ,j - fuzzy-search current directory for string at cursor

Help

  • :h - Open Help
  • ⌃] - Activate link at cursor
  • ⌃T - Back

Search / Replace

  • /<pattern> - Search forward for pattern
  • ?<pattern> - Search backward for pattern
  • n - Jump to next match in searching direction
  • ⇧n - Jump to next match in opposite direction
  • :<range>s/<foo>/<bar>/[g,i,I,c] - Replace old with new. range is either empty, % for whole file, or a line number. g flag replaces all occurrances on the line. i ignores case. I doesn't ignore case. c asks for confirmation.
  • * <n|⇧n> - Search forward for word at cursor, n jumps to Next result, N jumps to previous
  • # <n|⇧n> - Search backward for word at cursor, n jumps to Next result, N jumps to previous

Find Files

For finding patterns in files. Use :vimgrep if unsure if the grep command-line utility is available, but :grep is generally faster. All searches fill a buffer that is accessible by the :cw command.

  • :vimgrep /<pattern>/[g][j] <path/**/*> - Search for regex pattern located in path. The g option specifies that all matches for a search will be returned instead of just one per line, and the j option specifies that Vim will not jump to the first match automatically.
  • :grep <pattern> <path> - Search for regex pattern located in path.
@RayKimEX

This comment has been minimized.

Copy link

RayKimEX commented Jun 25, 2018

Good Explanation!

@rootid

This comment has been minimized.

Copy link

rootid commented Jan 25, 2019

Nice Explanation. How did you generate the diagram?

@0xadada

This comment has been minimized.

Copy link
Owner Author

0xadada commented May 28, 2019

@rootid i didn't, i found it online somewhere

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.