This Vim Cheat Sheet offers a comprehensive overview of essential commands for efficient text editing within Vim, covering everything from basic navigation to advanced file operations. It serves as a quick reference for Vim's most commonly used motions, insertions, deletions, and search and replace functionalities, along with tips on window management and macros. Whether you're a beginner looking to get started or an experienced user aiming to refine your workflow, this cheat sheet is an invaluable resource for enhancing your Vim proficiency.
Getting Started
Motion Diagrams
▼/▶ Cursor ▽/▷ Target
Left-right motions
┌───────────── |
├───────────── 0 $ ──────────────┐
│ ┌────────── ^ fe ────────┐ │
│ │ ┌─────── Fo te ───────┐│ │
│ │ │┌────── To 30| ───┐ ││ │
│ │ ││ ┌──── ge w ───┐ │ ││ │
│ │ ││ │ ┌── b e ─┐ │ │ ││ │
│ │ ││ │ │ ┌h l┐ │ │ │ ││ │
▽ ▽ ▽▽ ▽ ▽ ▽▼ ▼▽ ▽ ▽ ▽ ▽▽ ▽
echo "A cheatsheet from quickref.me"
Up-down motions
- SCREEN 1 START
┌─┬─────────▷ #!/usr/bin/python
│ │ ┌───▷
│ │ │ print("Hello")
│ │ { } ▶ print("Vim")
│ │ │ print("!")
│ │ └─▷
│ │ ┌───┬───▷ print("Welcome")
G gg H M L k j ▶ print("to")
│ │ └─▷ print("cheatsheets.zip")
│ │ print("/vim")
│ │
│ └─────▷
│ - SCREEN 1 END
└──────────────▷ print("SCREEN 2")
Motions
Shortcut |
Description |
h | j | k | l |
Arrow keys |
<C-u> / <C-d> |
Half-page up/down |
<C-b> / <C-f> |
Page up/down |
Words
Shortcut |
Description |
b / w |
Previous/Next word |
ge / e |
Previous/Next end of word |
Line
Shortcut |
Description |
0 (zero) / $ |
Start/End of line |
^ |
Start of line (non-blank) |
Character
Shortcut |
Description |
Fe / fe |
Move to previous/next e |
To / to |
Move before/after previous/next o |
| / n| |
Go to first/n th column |
Document
Shortcut |
Description |
gg / G |
First/Last line |
:n | nG |
Go to line n |
} / { |
Next/Previous empty line |
Window
Shortcut |
Description |
H / M / L |
Top/Middle/Bottom screen |
zt / zz / zb |
Top/Center/Bottom this line |
Insert Mode
Shortcut |
Description |
i / a |
Insert before/after cursor |
I / A |
Insert start/end of line |
o / O (letter) |
Insert new line below/above |
s / S |
Delete char/line and insert |
C / cc |
Change to end of/current line |
gi |
Insert at last insert point |
Esc | <C-[> |
Exit insert mode |
Saving and Exiting
Shortcut |
Description |
:w |
Save |
:q |
Close file |
:wq | :x | ZZ |
Save and quit |
:wqa |
Save and quit all files |
:q! | ZQ |
Force quit |
:qa |
Close all files |
:qa! |
Force quit all files |
:w now.txt |
Write to now.txt |
:sav new.txt |
Save and edit new.txt |
:w !sudo tee % |
Write to readonly file |
Normal Mode
Shortcut |
Description |
r |
Replace one character |
R |
Enter Replace mode |
u / 3u |
Undo changes 1 / 3 times |
U |
Undo changes on one line |
J |
Join with next line |
<C-r> / 5 <C-r> |
Redo changes 1 / 5 times |
Cut and paste
Shortcut |
Description |
x |
Delete character (Cut) |
p / P |
Paste after/before |
xp |
Swap two characters |
D |
Delete to end of line (Cut) |
dw |
Delete word (Cut) |
dd |
Delete line (Cut) |
ddp |
Swap two lines |
yy |
Yank line (Copy) |
"*p | "+p |
Paste from system clipboard |
"*y | "+y |
Paste to system clipboard |
In visual mode
Shortcut |
Description |
d | x |
Delete selection (Cut) |
s |
Replace selection |
y |
Yank selection (Copy) |
Repeating
Shortcut |
Description |
. |
Repeat last command |
; |
Repeat latest f , t , F or T |
, |
Repeat latest f , t , F or T reversed |
& |
Repeat last :s |
@: |
Repeat a command-line command |
Visual mode
Shortcut |
Description |
v |
Enter visual mode |
V |
Enter visual line mode |
<C-v> |
Enter visual block mode |
ggVG |
Select all text |
> / < |
Shift text right/left |
Macros
- |
- |
qi |
Record macro i |
q |
Stop recording macro |
@i |
Run macro i |
7@i |
Run macro i 7 times |
@@ |
Repeat last macro |
You can save macro for any letters not just i
Vim Operators
Usage
Shortcut |
Description |
d |
<yel>w</yel> |
Operator |
Motion |
Combine operators with motions to use them
Available Operators
Shortcut |
Description |
d |
Delete |
y |
Yank (copy) |
c |
Change (delete then insert) |
p |
Paste |
= |
Formats code |
g~ |
Toggle case |
gU |
Uppercase |
gu |
Lowercase |
> |
Indent right |
< |
Indent left |
! |
Filter through external program |
Examples
Combination |
Description |
d <yel>d</yel> |
Delete current line |
d <yel>j</yel> |
Delete two lines |
d <yel>w</yel> |
Delete to next word |
d <yel>b</yel> |
Delete to beginning of word |
d <yel>fa</yel> |
Delete until a char |
d <yel>/hello</yel> |
Delete until hello |
c <yel>c</yel> |
Change current line, synonym with S |
y <yel>y</yel> |
Copy current line |
> <yel>j</yel> |
Indent 2 lines |
ggd <yel>G</yel> |
Delete a complete document |
gg= <yel>G</yel> |
Indent a complete document |
ggy <yel>G</yel> |
Copy a whole document |
Counts
[count] <operator> <motion>
<operator> [count] <motion>
Combination |
Description |
2d <yel>d</yel> |
Delete 2 lines |
6y <yel>y</yel> |
Copy 6 lines |
d 3<yel>w</yel> |
Delete 3 words |
d 5<yel>j</yel> |
Delete 5 lines downwards |
> 4<yel>k</yel> |
Indent 4 lines upwards |
Vim Text objects
Usage
Shortcut |
Description |
- |
v |
<pur>i</pur> / <pur>a</pur> |
<yel>p</yel> |
Operator |
<pur>i</pur>nner / <pur>a</pur>round |
Text object |
Operate with an operator inner or around text blocks
Text objects
Shortcut |
Description |
<yel>p</yel> |
Paragraph |
<yel>w</yel> |
Word |
<yel>W</yel> |
WORD |
<yel>s</yel> |
Sentence |
<yel>[</yel> <yel>(</yel> <yel>{</yel> <yel>\<</yel> |
A [], (), or {} block |
<yel>]</yel> <yel>)</yel> <yel>}</yel> <yel>></yel> |
A [], (), or {} block |
<yel>'</yel> <yel>"</yel> <yel>`</yel> |
A quoted string |
<yel>b</yel> |
A block [( |
<yel>B</yel> |
A block in [{ |
<yel>t</yel> |
A HTML tag block |
See :help text-objects
Delete
Shortcut |
Description |
d <pur>i</pur><yel>w</yel> |
Delete inner word |
d <pur>i</pur><yel>s</yel> |
Delete inner sentence |
d <pur>i</pur><yel>"</yel> |
Delete in quotes |
d <pur>a</pur><yel>"</yel> |
Delete in quotes (including quotes) |
d <pur>i</pur><yel>p</yel> |
Delete a paragraph |
Selections
Shortcut |
Description |
v <pur>i</pur><yel>"</yel> |
Select inner quotes "... " |
v <pur>a</pur><yel>"</yel> |
Select quotes "..." |
v <pur>i</pur><yel>[</yel> |
Select inner brackets [... ] |
v <pur>a</pur><yel>[</yel> |
Select brackets [...] |
v <pur>i</pur><yel>w</yel> |
Select inner word |
v <pur>i</pur><yel>p</yel> |
Select inner paragraph |
v <pur>i</pur><yel>p</yel><pur>i</pur><yel>p</yel> |
Select more paragraph |
Misc
Shortcut |
Description |
c <pur>i</pur><yel>w</yel> |
Change inner word |
c <pur>i</pur><yel>"</yel> |
Change inner quotes |
c <pur>i</pur><yel>t</yel> |
Change inner tags (HTML) |
c <pur>i</pur><yel>p</yel> |
Change inner paragraph |
y <pur>i</pur><yel>p</yel> |
Yank inner paragraph |
y <pur>a</pur><yel>p</yel> |
Yank paragraph (including newline) |
Vim Multiple files
Buffers
- |
- |
:e file |
Edit a file in a new buffer |
:bn |
Go to the next buffer |
:bp |
Go to the previous buffer |
:bd |
Remove file from buffer list |
:b 5 |
Open buffer #5 |
:b file |
Go to a buffer by file |
:ls |
List all open buffers |
:sp file |
Open and split window |
:vs file |
Open and vertically split window |
:hid |
Hide this buffer |
:wn |
Write file and move to next |
:tab ba |
Edit all buffers as tabs |
Windows
- |
- |
<C-w> s |
Split window |
<C-w> v |
Split window vertically |
<C-w> w |
Switch windows |
<C-w> q |
Quit a window |
<C-w> T |
Break out into a new tab |
<C-w> x |
Swap current with next |
<C-w> - / + |
Decrease/Increase height |
<C-w> < / > |
Decrease/Increase width |
<C-w> | |
Max out the width |
<C-w> = |
Equally high and wide |
<C-w> h / l |
Go to the left/right window |
<C-w> j / k |
Go to the up/down window |
Tabs
Shortcut |
Description |
:tabe [file] |
<yel>E</yel>dit file in a new tab |
:tabf [file] |
Open if exists in new tab |
:tabc |
<yel>C</yel>lose current tab |
:tabo |
Close <yel>o</yel>ther tabs |
:tabs |
List all <yel>tabs</yel> |
:tabr |
Go to fi<yel>r</yel>st tab |
:tabl |
Go to <yel>l</yel>ast tab |
:tabm 0 |
<yel>M</yel>ove to position 0 |
:tabn |
Go to <yel>n</yel>ext tab |
:tabp |
Go to <yel>p</yel>revious tab |
Normal mode
Shortcut |
Description |
gt |
Go to <yel>n</yel>ext tab |
gT |
Go to <yel>p</yel>revious tab |
2gt |
Go to tab number 2 |
Vim Search and Replace
Search
- |
- |
/foo |
Search forward |
/foo\c |
Search forward (case insensitive) |
?foo |
Search backward |
/\v\d+ |
Search with regex |
n |
Next matching search pattern |
N |
Previous match |
* |
Search for current word forward |
# |
Search for current word backward |
Replace LINE
:[range]s/{pattern}/{str}/[flags]
|
|
:s/old/new |
Replace first |
:s/old/new/g |
Replace all |
:s/\vold/new/g |
Replace all with regex |
:s/old/new/gc |
replace all (Confirm) |
:s/old/new/i |
Ignore case replace first |
:2,6s/old/new/g |
Replace between lines 2 -6 |
Replace FILE
:%s/{pattern}/{str}/[flags]
|
|
:%s/old/new |
Replace first |
:%s/old/new/g |
Replace all |
:%s/old/new/gc |
Replace all (Confirm) |
:%s/old/new/gi |
Replace all (ignore case) |
:%s/\vold/new/g |
Replace all with regex |
Ranges
- |
- |
% |
Entire file |
’<,’> |
Current selection |
5 |
Line 5 |
5,10 |
Lines 5 to 10 |
$ |
Last line |
2,$ |
Lines 2 to Last |
. |
Current line |
,3 |
Next 3 lines |
-3, |
Forward 3 lines |
Global command
:[range]g/{pattern}/[command]
|
|
:g/foo/d |
Delete lines containing foo |
:g!/foo/d |
Delete lines not containing foo |
:g/^\s*$/d |
Delete all blank lines |
:g/foo/t$ |
Copy lines containing foo to EOF |
:g/foo/m$ |
Move lines containing foo to EOF |
:g/^/m0 |
Reverse a file |
:g/^/t. |
Duplicate every line |
Inverse :g
:[range]v/{pattern}/[command]
|
|
:v/foo/d |
Delete lines not containing foo <br/>(also :g!/foo/d ) |
Flags
- |
- |
g |
Replace all occurrences |
i |
Ignore case |
I |
Don't ignore case |
c |
Confirm each substitution |
Substitute expression (magic)
- |
- |
& | \0 |
Replace with the whole matched |
\1 ...\9 |
Replace with the group 0-9 |
\u |
Uppercase next letter |
\U |
Uppercase following characters |
\l |
Lowercase next letter |
\L |
Lowercase following characters |
\e |
End of \u , \U , \l and \L |
\E |
End of \u , \U , \l and \L |
Examples
:s/a\|b/xxx\0xxx/g # Modifies "a b" to "xxxaxxx xxxbxxx"
:s/test/\U& file/ # Modifies "test" to "TEST FILE"
:s/\(test\)/\U\1\e file/ # Modifies "test" to "TEST file"
:s/\v([abc])([efg])/\2\1/g # Modifies "af fa bg" to "fa fa gb"
:s/\v\w+/\u\0/g # Modifies "bla bla" to "Bla Bla"
:s/\v([ab])|([cd])/\1x/g # Modifies "a b c d" to "ax bx x x"
:%s/.*/\L&/ # Modifies "HTML" to "html"
:s/\v<(.)(\w*)/\u\1\L\2/g # Make every first letter of a word uppercase
:%s/^\(.*\)\n\1/\1/ # Remove duplicate lines
:%s/<\/\=\(\w\+\)\>/\U&/g # Convert HTML-Tags to uppercase
:g/^pattern/s/$/mytext # Find and append text to the end
:g/pattern/norm! @i # Run a macro on matching lines
/^\(.*\)\(\r\?\n\1\)\+$ # View the duplicates lines
/\v^(.*)(\r?\n\1)+$ # View the duplicates lines (very magic)
:v/./,/./-j # Compress blank lines into a blank line
:g/<p1>/,/<p2>/d # Delete inclusively from <p1> to <p2>
Vimdiff
Usage
$ vimdiff file1 file2 [file3]
$ vim -d file1 file2 [file3]
Editing
:[range]diffget [bufspec]
:[range]diffput [bufspec]
Shortcut |
Description |
do / :diffget |
Obtain (get) difference |
dp / :diffput |
Put difference |
:dif |
Re-scan differences |
:diffo |
Switch off diff mode |
:1,$+1diffget |
Get all differences |
ZQ |
Quit without changes |
See: Ranges
Folds
Shortcut |
Description |
zo / zO |
Open |
zc / zC |
Close |
za / zA |
Toggle |
zv |
Open folds for this line |
zM |
Close all |
zR |
Open all |
zm |
Fold more (foldlevel += 1) |
zr |
Fold less (foldlevel -= 1) |
zx |
Update folds |
Jumping
Shortcut |
Description |
]c |
Next difference |
[c |
Previous difference |
Miscellaneous
Case
Shortcut |
Description |
vU |
Uppercase character |
vu |
Lowercase character |
~ |
Toggle case character |
viw U |
Uppercase word |
viw u |
Lowercase word |
viw ~ |
Toggle case word |
VU / gUU |
Uppercase line |
Vu / guu |
Lowercase line |
V~ / g~~ |
Toggle case line |
gggUG |
Uppercase all text |
ggguG |
Lowercase all text |
ggg~G |
Toggle case all text |
Jumping
Shortcut |
Description |
<C-o> |
Go back to previous |
<C-i> |
Go forward |
gf |
Go to file in cursor |
ga |
Display hex, ascii value |
Misc command-lines
- |
- |
:h |
Help open help view |
:edit! |
Reload current file |
:2,8m0 |
Move lines 2 -8 to 0 |
:noh |
Clear search highlights |
:sort |
Sort lines |
:ter |
Open a terminal window |
:set paste |
Enable Insert Paste sub-mode |
:set nopaste |
disable Insert Paste sub-mode |
:cq |
Exiting with an error<br/>(aborting Git) |
Navigating
Shortcut |
Description |
% |
Nearest/matching {[()]} |
[( | [{ |
Previous ( or { |
]) | ]{ |
Next ) or } |
[m |
Previous method start |
[M |
Previous method end |
Counters
Shortcut |
Description |
<C-a> |
Increase number |
<C-x> |
Decrease number |
Shortcut |
Description |
:tag Classname |
Jump to first definition of Classname |
<C-]> |
Jump to definition |
g] |
See all definitions |
<C-t> |
Go back to last tag |
<C-o> <C-i> |
Back/forward |
:tselect Classname |
Find definitions of Classname |
:tjump Classname |
Find definitions of Classname (auto-select 1st) |
- |
- |
:ce 8 |
Center lines between 8 columns |
:ri 4 |
Right-align lines at 4 columns |
:le |
Left-align lines |
See :help formatting
Marks
Shortcut |
Description |
`^ |
Last position of cursor in insert mode |
`. |
Last change in current buffer |
`" |
Last exited current buffer |
`0 |
In last file edited |
'' |
Back to line in current buffer where jumped from |
`` |
Back to position in current buffer where jumped from |
`[ |
To beginning of previously changed or yanked text |
`] |
To end of previously changed or yanked text |
`<` |
To beginning of last visual selection |
`>` |
To end of last visual selection |
ma |
Mark this cursor position as a |
`a |
Jump to the cursor position a |
'a |
Jump to the beginning of the line with position a |
d'a |
Delete from current line to line of mark a |
d `a |
Delete from current position to position of mark a |
c'a |
Change text from current line to line of a |
y `a |
Yank text from current position to position of a |
:marks |
List all current marks |
:delm a |
Delete mark a |
:delm a-d |
Delete marks a , b , c , d |
:delm abc |
Delete marks a , b , c |
Calculator
Shortcut |
Description |
<C-r> = 7*7 |
Shows the result |
<C-r> = 10/2 |
Shows the result |
Do this in INSERT mode
Shell
- |
- |
:!<shell> |
Interpret Shell Command |
:r!<shell> |
Read in output of shell |
:r!date |
Insert date |
:!!date |
Replace current line with date |
Command line
Shortcut |
Description |
<C-r><C-w> |
Insert current word into the command line |
<C-r>" |
Paste from " register |
<C-x><C-f> |
Auto-completion of path in insert mode |
Tricks
Remove duplicate lines
:sort | %!uniq -u
To number the lines in the file
:%!cat -n
Copy whole doc to clipboard
:%w !pbcopy # Mac OS X
:%w !xclip -i -sel c # GNU/Linux
:%w !xsel -i -b # GNU/Linux
Useful tips and links
Tips
Here are five useful tips for using Vim that can enhance your productivity and make your editing experience more efficient:
Vim Tips for Productivity
Tip 1: Efficient Navigation
Use the combination of gg
and G
to quickly move to the beginning or the end of your document, respectively. For line-specific navigation, :n
or nG
(where n
is the line number) can instantly take you to a specific line. This method is far more efficient than scrolling or using repeated j
and k
commands.
- `gg`: Jump to the start of the document.
- `G`: Jump to the end of the document.
- `:n`: Go to line `n`.
- `nG`: Also goes to line `n`.
Tip 2: Powerful Search and Replace
Vim's search and replace functionality is both powerful and versatile. Use :%s/old/new/g
to replace all instances of "old" with "new" throughout your document. Adding c
at the end (:%s/old/new/gc
) allows you to confirm each replacement, providing more control over the changes.
- `:%s/old/new/g`: Replace all occurrences of "old" with "new".
- `:%s/old/new/gc`: Replace all occurrences with confirmation.
Tip 3: Visual Block Editing
With visual block mode, you can edit multiple lines at once, which is perfect for formatting or inserting repetitive content. Enter visual block mode with Ctrl-v
, select your block, and then apply commands (I
for insert, A
for append, etc.) to all selected lines simultaneously.
- `Ctrl-v`: Enter visual block mode.
- After selection, `I` or `A`: Insert or append text to all selected lines.
Tip 4: Undo and Redo
Mastering undo and redo commands in Vim can save you from many unintended changes. Use u
to undo the last action and Ctrl-r
to redo it. Remember, Vim has a multi-level undo tree, so you can undo and redo multiple steps.
- `u`: Undo the last action.
- `Ctrl-r`: Redo the last undone action.
Tip 5: Split Windows for Multi-file Editing
Vim allows you to work with multiple files in the same instance using split windows. Use :sp file
to split horizontally and edit another file or :vsp file
to split vertically. Switch between splits using Ctrl-w
followed by a direction key (h
, j
, k
, l
).
- `:sp file`: Open a file in a horizontal split window.
- `:vsp file`: Open a file in a vertical split window.
- `Ctrl-w h/j/k/l`: Navigate through split windows.
These tips should help you navigate and edit files in Vim more effectively. Remember, the key to mastering Vim is practice and exploring its extensive documentation (:help
).