📖 Guide
Vim Commands Cheat Sheet — Complete Reference
Every Vim command you need, from basic navigation to advanced macros. Searchable and organized by category.
179 commands across 11 categories
Mode SwitchingCursor MovementEditingYank & PasteVisual ModeSearch & ReplaceFiles & BuffersWindows & TabsMarks & JumpsMacros & RegistersAdvanced
Mode Switching
| Command | Description |
|---|---|
i | Enter Insert mode before cursor |
I | Enter Insert mode at beginning of line |
a | Enter Insert mode after cursor |
A | Enter Insert mode at end of line |
o | Open new line below and enter Insert mode |
O | Open new line above and enter Insert mode |
v | Enter Visual mode (character-wise) |
V | Enter Visual Line mode |
Ctrl+v | Enter Visual Block mode |
Esc | Return to Normal mode from any mode |
: | Enter Command-line mode |
R | Enter Replace mode (overwrite characters) |
Cursor Movement
| Command | Description |
|---|---|
h / j / k / l | Move left / down / up / right |
w | Jump to start of next word |
W | Jump to start of next WORD (whitespace-delimited) |
b | Jump to start of previous word |
B | Jump to start of previous WORD |
e | Jump to end of current/next word |
E | Jump to end of current/next WORD |
0 | Jump to beginning of line |
^ | Jump to first non-blank character of line |
$ | Jump to end of line |
gg | Go to first line of file |
G | Go to last line of file |
:<number>e.g. :42 | Go to specific line number |
Ctrl+d | Scroll down half page |
Ctrl+u | Scroll up half page |
Ctrl+f | Scroll down full page |
Ctrl+b | Scroll up full page |
H | Move cursor to top of screen |
M | Move cursor to middle of screen |
L | Move cursor to bottom of screen |
% | Jump to matching bracket/parenthesis |
f<char>e.g. fa | Jump to next occurrence of char on line |
F<char> | Jump to previous occurrence of char on line |
t<char> | Jump to just before next occurrence of char |
; | Repeat last f/F/t/T motion forward |
, | Repeat last f/F/t/T motion backward |
{ | Jump to previous empty line (paragraph) |
} | Jump to next empty line (paragraph) |
Editing
| Command | Description |
|---|---|
x | Delete character under cursor |
X | Delete character before cursor |
dd | Delete (cut) entire line |
D | Delete from cursor to end of line |
dw | Delete from cursor to start of next word |
d$ | Delete from cursor to end of line |
d0 | Delete from cursor to beginning of line |
dG | Delete from current line to end of file |
diw | Delete inner word (word under cursor) |
di" | Delete text inside double quotes |
di( | Delete text inside parentheses |
di{ | Delete text inside curly braces |
dat | Delete around HTML/XML tag |
cc | Change (replace) entire line |
C | Change from cursor to end of line |
cw | Change from cursor to end of word |
ciw | Change inner word |
ci" | Change text inside quotes |
ci( | Change text inside parentheses |
r<char> | Replace single character under cursor |
s | Delete character and enter Insert mode |
S | Delete line and enter Insert mode |
J | Join current line with next line |
~ | Toggle case of character under cursor |
gUiw | Uppercase inner word |
guiw | Lowercase inner word |
>> | Indent line |
<< | Unindent line |
== | Auto-indent line |
. | Repeat last editing command |
Yank & Paste
| Command | Description |
|---|---|
yy | Yank (copy) entire line |
yw | Yank from cursor to start of next word |
y$ | Yank from cursor to end of line |
yiw | Yank inner word |
yi" | Yank text inside double quotes |
p | Paste after cursor |
P | Paste before cursor |
"ay | Yank into register 'a' |
"ap | Paste from register 'a' |
"+y | Yank to system clipboard |
"+p | Paste from system clipboard |
:reg | Show contents of all registers |
Visual Mode
| Command | Description |
|---|---|
v | Start character-wise visual selection |
V | Start line-wise visual selection |
Ctrl+v | Start block-wise visual selection |
gv | Re-select last visual selection |
o | Move to other end of selection |
d | Delete selection |
y | Yank selection |
c | Change selection |
> | Indent selection |
< | Unindent selection |
= | Auto-indent selection |
U | Uppercase selection |
u | Lowercase selection |
I (block) | Insert at start of each line in block selection |
A (block) | Append at end of each line in block selection |
Search & Replace
| Command | Description |
|---|---|
/<pattern>e.g. /function | Search forward for pattern |
?<pattern> | Search backward for pattern |
n | Jump to next search match |
N | Jump to previous search match |
* | Search forward for word under cursor |
# | Search backward for word under cursor |
:s/old/new/ | Replace first occurrence on current line |
:s/old/new/g | Replace all occurrences on current line |
:%s/old/new/g | Replace all occurrences in file |
:%s/old/new/gc | Replace all with confirmation prompts |
:%s/old/new/gi | Replace all, case-insensitive |
:noh | Clear search highlighting |
:g/pattern/d | Delete all lines matching pattern |
:v/pattern/d | Delete all lines NOT matching pattern |
:g/pattern/cmde.g. :g/TODO/t$ | Run command on all matching lines |
Files & Buffers
| Command | Description |
|---|---|
:w | Save file |
:w <filename> | Save as new filename |
:q | Quit (fails if unsaved changes) |
:q! | Quit without saving |
:wq | Save and quit |
:x | Save and quit (same as :wq) |
ZZ | Save and quit (Normal mode shortcut) |
ZQ | Quit without saving (Normal mode) |
:e <file>e.g. :e ~/.bashrc | Open a file |
:e! | Revert to last saved version |
:bn | Next buffer |
:bp | Previous buffer |
:bd | Close/delete current buffer |
:ls | List all open buffers |
:b <n> | Switch to buffer number n |
Windows & Tabs
| Command | Description |
|---|---|
:split <file> | Horizontal split (or :sp) |
:vsplit <file> | Vertical split (or :vs) |
Ctrl+w s | Horizontal split current file |
Ctrl+w v | Vertical split current file |
Ctrl+w h/j/k/l | Navigate between splits |
Ctrl+w w | Cycle through windows |
Ctrl+w = | Make all windows equal size |
Ctrl+w _ | Maximize current window height |
Ctrl+w | | Maximize current window width |
Ctrl+w q | Close current window |
Ctrl+w o | Close all other windows |
:tabnew <file> | Open file in new tab |
gt | Next tab |
gT | Previous tab |
:tabclose | Close current tab |
Marks & Jumps
| Command | Description |
|---|---|
m<letter>e.g. ma | Set mark at cursor position |
'<letter>e.g. 'a | Jump to line of mark |
`<letter> | Jump to exact position of mark |
'' | Jump back to previous position |
'. | Jump to last edit position |
Ctrl+o | Jump back in jump list |
Ctrl+i | Jump forward in jump list |
:marks | List all marks |
:delmarks a | Delete mark 'a' |
g; | Jump to previous change position |
g, | Jump to next change position |
Macros & Registers
| Command | Description |
|---|---|
q<letter>e.g. qa | Start recording macro into register |
q | Stop recording macro |
@<letter>e.g. @a | Play macro from register |
@@ | Replay last played macro |
10@a | Play macro 'a' 10 times |
:reg | Show all register contents |
"<letter>y | Yank into named register |
"<letter>p | Paste from named register |
"0p | Paste last yank (not delete) |
"_d | Delete into black hole register (no yank) |
Advanced
| Command | Description |
|---|---|
za | Toggle fold |
zR | Open all folds |
zM | Close all folds |
zo / zc | Open / close fold under cursor |
Ctrl+n | Autocomplete (Insert mode) — next match |
Ctrl+p | Autocomplete (Insert mode) — previous match |
:set spell | Enable spell checking |
]s / [s | Next / previous misspelled word |
z= | Show spelling suggestions |
:!<cmd>e.g. :!ls | Run external shell command |
:r !<cmd>e.g. :r !date | Insert output of command into file |
:sort | Sort selected lines |
Ctrl+a / Ctrl+x | Increment / decrement number under cursor |
:set number | Show line numbers |
:set relativenumber | Show relative line numbers |
:syntax on | Enable syntax highlighting |
📖 Free, searchable command reference. Bookmark this page for quick access.