VIM
vim is a text editor for Unix-like operating systems such as Linux, macOS, and Windows.
Getting started
Motion Diagrams
Left-right motions
┌───────────── |
├───────────── 0 $ ──────────────┐
│ ┌────────── ^ fe ────────┐ │
│ │ ┌─────── Fo te ───────┐│ │
│ │ │┌────── To 30| ───┐ ││ │
│ │ ││ ┌──── ge w ───┐ │ ││ │
│ │ ││ │ ┌── b e ─┐ │ │ ││ │
│ │ ││ │ │ ┌h l┐ │ │ │ ││ │
▽ ▽ ▽▽ ▽ ▽ ▽▼ ▼▽ ▽ ▽ ▽ ▽▽ ▽
echo "A cheatsheet from lsong.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( "lsong.me" )
│ │ 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
Change to end of 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
new.txt
Write to new.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
Operators
Usage
Shortcut
Description
d
w
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
d
Delete current line
d
j
Delete two lines
d
w
Delete to next word
d
b
Delete to beginning of word
d
fa
Delete until a
char
d
/hello
Delete until hello
c
c
Change current line
y
y
Copy current line
>
j
Indent 2 lines
ggd
G
Delete a complete document
gg=
G
Indent a complete document
ggy
G
Copy a whole document
Counts
[count] <operator> <motion>
<operator> [count] <motion>
Combination
Description
2d
d
Delete 2
lines
6y
y
Copy 6
lines
d
3w
Delete 3
words
d
5j
Delete 5
lines downwards
>
4k
Indent 4
lines upwards
Text objects
Usage
Shortcut
Description
-
v
i / a
p
Operator
inner / around
Text object
Operate with an operator inner or around text blocks
Text objects
Shortcut
Description
p
Paragraph
w
Word
W
WORD (surrounded by whitespace)
s
Sentence
[ ( { \<
A [], (), or {} block
] ) } >
A [], (), or {} block
’ “ `
A quoted string
b
A block [(
B
A block in [{
t
A HTML tag block
See :help text-objects
Delete
Shortcut
Description
d
iw
Delete inner word
d
is
Delete inner sentence
d
i”
Delete in quotes
d
a”
Delete in quotes (including quotes)
d
ip
Delete a paragraph
Selections
Shortcut
Description
v
i”
Select inner quotes “...
”
v
a”
Select quotes "..."
v
i[
Select inner brackets [...
]
v
a[
Select brackets [...]
v
iw
Select inner word
v
ip
Select inner paragraph
v
ipip
Select more paragraph
Misc
Shortcut
Description
c
iw
Change inner word
c
i”
Change inner quotes
c
it
Change inner tags (HTML)
c
ip
Change inner paragraph
y
ip
Yank inner paragraph
y
ap
Yank paragraph (including newline)
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]
Edit file in a new tab
:tabf [file]
Open if exists in new tab
:tabc
Close current tab
:tabo
Close other tabs
:tabs
List all tabs
:tabr
Go to first tab
:tabl
Go to last tab
:tabm 0
Move to position 0
:tabn
Go to next tab
:tabp
Go to previous tab
Normal mode
Shortcut
Description
gt
Go to next tab
gT
Go to previous tab
2gt
Go to tab number 2
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
(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/./,/./-j # Compress blank lines into a blank line
:g//,//d # Delete inclusively from to
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 (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
da
Delete from current line to line of mark a
da
Delete from current position to position of mark a
ca
Change text from current line to line ofa
ya
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
Copy whole doc to clipboard :%w !pbcopy \# Mac OS X :%w !xclip -i -sel c \# GNU/Linux :%w !xsel -i -b \# GNU/Linux
Also see