A Great Vim Cheat Sheet

Essentials

Cursor movement (Normal/Visual Mode)

  • h j k l - Arrow keys
  • w / b - Next/previous word
  • W / B - Next/previous word (space seperated)
  • e / ge - Next/previous end of word
  • 0 / $ - Start/End of line
  • ^ - First non-blank character of line (same as 0w)

Editing text

  • i / a - Start insert mode at/after cursor
  • I / A - Start insert mode at the beginning/end of the line
  • o / O - Add blank line below/above current line
  • Esc or Ctrl+[ - Exit insert mode
  • d - Delete
  • dd - Delete line
  • c - Delete, then start insert mode
  • cc - Delete line, then start insert mode

Operators

Operators also work in Visual Mode

  • d - Deletes from the cursor to the movement location
  • c - Deletes from the cursor to the movement location, then starts insert mode
  • y - Copy from the cursor to the movement location
  • > - Indent one level
  • < - Unindent one level

You can also combine operators with motions. Ex: d$ deletes from the cursor to the end of the line.

Marking text (visual mode)

  • v - Start visual mode
  • V - Start linewise visual mode
  • Ctrl+v - Start visual block mode
  • Esc or Ctrl+[ - Exit visual mode

Clipboard

  • yy - Yank (copy) a line
  • p - Paste after cursor
  • P - Paste before cursor
  • dd - Delete (cut) a line
  • x - Delete (cut) current character
  • X - Delete (cut) previous character
  • d / c - By default, these copy the deleted text

Exiting

  • :w - Write (save) the file, but don’t quit
  • :wq - Write (save) and quit
  • :q - Quit (fails if anything has changed)
  • :q! - Quit and throw away changes
  • :qa - Quit all windows
  • :wqa - Write and quit all windows

Search/Replace

  • /pattern - Search for pattern
  • ?pattern - Search backward for pattern
  • n - Repeat search in same direction
  • N - Repeat search in opposite direction
  • :%s/old/new/g - Replace all old with new throughout file (gn is better though)
  • :%s/old/new/gc - Replace all old with new throughout file with confirmations

General

  • u - Undo
  • Ctrl+r - Redo

Advanced

Cursor movement

  • Ctrl+d - Move down half a page
  • Ctrl+u - Move up half a page
  • } - Go forward by paragraph (the next blank line)
  • { - Go backward by paragraph (the next blank line)
  • gg - Go to the top of the page
  • G - Go the bottom of the page
  • : [num] [enter] - Go to that line in the document
  • number + j / k - Go to line relative line number, down or up
  • ctrl+e / ctrl+y - Scroll down/up one line
  • f [char] - Move forward to the given char
  • F [char] - Move backward to the given char
  • t [char] - Move forward to before the given char
  • T [char] - Move backward to before the given char
  • ; / , - Repeat search forwards/backwards

Editing text

  • J - Join line below to the current one
  • r [char] - Replace a single character with the specified char (does not use Insert mode)

Visual mode

  • O - Move to other corner of block
  • o - Move to other end of marked area

File Tabs

  • :e filename - Edit a file

  • :tabe - Make a new tab

  • gt - Go to the next tab

  • gT - Go to the previous tab

  • :vsp - Vertically split windows

  • ctrl+ws - Split windows horizontally

  • ctrl+wv - Split windows vertically

  • ctrl+ww - Switch between windows

  • ctrl+wq - Quit a window

  • :vs|:te or :vs+te - Vertical split with new term

  • :sp+te - Horizontal split with term

Marks

  • Marks allow you to jump to designated points in your code.
    • m{a-z} - Set mark {a-z} at cursor position
  • A capital mark {A-Z} sets a global mark and will work between files
    • '{a-z} - Move the cursor to the start of the line where the mark was set
    • '' - Go back to the previous jump location

Text Objects

Say you have def (arg1, arg2, arg3), where your cursor is somewhere in the middle of the parenthesis.

  • di( deletes everything between the parenthesis. That says “change everything inside the nearest parenthesis”. Without text objects, you would need to do T(dt).
  • Learn more

General

  • . - Repeat last command
  • Ctrl+r + 0 in insert mode inserts the last yanked text (or in command mode)
  • gv - reselect (select last selected block of text, from visual mode)
  • % - jumps between matching () or {}

My tweeks:

" Alt+,/.
nnoremap <M-,> :tabprevious<CR>
nnoremap <M-.> :tabnext<CR>

" shift+alt+j/k | duplicate selectec line down/up
nnoremap <S-M-j> :t.<CR>
nnoremap <S-M-k> :t-<CR>

" alt+j/k move selection down/up
nnoremap <A-j> :m .+1<CR>
nnoremap <A-k> :m .-2<CR>