Vim cheat sheet

Vim cheat sheet. Explore our ultimate quick reference for Vim.

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"

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("")
│        │       print("/vim")
│        │     
│        └─────▷ 
│                - SCREEN 1 END
└──────────────▷ print("SCREEN 2")


Shortcut Description
h | j | k | l Arrow keys
<C-u> / <C-d> Half-page up/down
<C-b> / <C-f> Page up/down


Shortcut Description
b / w Previous/Next word
ge / e Previous/Next end of word


Shortcut Description
0 (zero) / $ Start/End of line
^ Start of line (non-blank)


Shortcut Description
Fe / fe Move to previous/next e
To / to Move before/after previous/next o
| / n| Go to first/nth column


Shortcut Description
gg / G First/Last line
:n | nG Go to line n
} / { Next/Previous empty line


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)


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


- -
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


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


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


[count] <operator> <motion>
<operator> [count] <motion>

Combination Description
2d<yel>d</yel> Delete 2 lines
6y<yel>y</yel> Copy 6 lines
d3<yel>w</yel> Delete 3 words
d5<yel>j</yel> Delete 5 lines downwards
>4<yel>k</yel> Indent 4 lines upwards

Vim Text objects


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


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


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


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


- -
: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


- -
<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


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

- -
/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


: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/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


- -
% 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


: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


:v/foo/d Delete lines not containing foo<br/>(also :g!/foo/d)


- -
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


: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 file1 file2 [file3]
$ vim -d file1 file2 [file3]


:[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


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


Shortcut Description
]c Next difference
[c Previous difference



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


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)
Shortcut Description
% Nearest/matching {[()]}
[( | [{ Previous ( or {
]) | ]{ Next ) or }
[m Previous method start
[M Previous method end


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


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


Shortcut Description
<C-r> = 7*7 Shows the result
<C-r> = 10/2 Shows the result

Do this in INSERT mode


- -
:!<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


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


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.

Markdown Format

- `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.

Markdown Format

- `:%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.

Markdown Format

- `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.

Markdown Format

- `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).

Markdown Format

- `: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).