Cheatsheet: Vim
-
modified:
-
reading: 13 minutes
:set list
, \l
- show invisibles
:retab!
- auto converting between tabs and spaces
:set expandtab
, retab!
- to spaces
:set noexpandtab
, retab!
- to tabs
.
- repeat
Normal mode
h
, j
, k
, l
- left, down, up, right
gj
- go down display line
gk
- go up display line
0
- to the first character of real line
g0
- to the first character of display line
^
- to the first nonblank character of line
g^
- to the first nonblank character of display line
$
- to the end of real line
g$
- to the end of display line
w
- forward to start of next word
W
- to the next WORD
b
- backward to start of current/previous word
B
- backward to start of current/previous WORD
e
- forward to end of current/next word
E
- forward to end of current/next WORD
ge
- backward to end of previous word
gE
- backward to end of previous WORD
<number>G
- to the line
gg
- beginning of the file
G
- end of the file
^G
- show current line
%
- move to matching brackets
f<char>
- find next
F<char>
- find backward
t<char>
- find next char and place cursor before
T<char>
- find next char and place cursor before backward
;
- go to the next of f
/t
,
- go to previous of f
/t
g;
- back to the last change
g,
- forward to the next change
:changes
- list changes
{number}+
- go to the {number}
lines down
{number}-
- go to the {number}
lines up
Marks
m{a-zA-Z}
- set a mark
`{mark}
- go to the exact mark place
'{mark}
- go the first non-whitespace character on where mark was set
Automatic marks
`
- Position before the last jump within current file
.
- Location of last change
^
- Location of last insertion
[
- Start of last change or yank
]
- End of last change or yank
<
- Start of last visual selection
>
- End of last visual selection
Search
/<text>
- forward search
d/ge
- delete till you find ge
v/ge
- select till ge
/{text}\c
- case insensitive
/{text}\C
- case sensitive
/\v{regex}
- very magic search (more close to regex)
/\V{text}
- very nomagic
/\v<{word}>
- search for the word
\zs
, \ze
- helps to define boundaries of a match, for example /Practical \szVim<CR>
?<text>
- backward search
:hlsearch
- highlight search results
*
- find next current word
n
- next occurrence in same direction
N
- next occurrence in opposite direction
Substitution
:[range]s/{pattern}/{string}/{flags} [count]
- replace
Flags
g
- globally (within line)
c
- confirm changes
y
to substitute this match
n
to skip this match
esc
to skip this match
a
to substitute this and all remaining matches {not in Vi}
q
to quit substituting {not in Vi}
⌃E
to scroll the screen up {not in Vi}
⌃Y
to scroll the screen down {not in Vi}
&
- same flags as previous invocation of substitute
e
- subpress errors
i
- ignore case for the pattern
I
- don’t ignore case for the pattern
p
- print the line containing last substitute
Range
%
- whole file
<n>,<m>
- between lines (including)
Special characters for the replacement string
\r
- carriage return
\t
- tab
\\
- single backslash
\1
- first submatch
\0
, &
- entire matches pattern
~
- use string from previous invocation of substitute
\={Vim script}
- evaluate script
Edit
O
- insert line above the cursor
o
- insert line below the cursor
A
- start typing at the end of line
I
- start typing at the beginning of the line
a
- start typing after cursor
i
- start typing in place of cursor
C
- replace from cursor to the end of the line
S
- replace whole line
s
- replace current selection
x
- replace under cursor
r<char>
- replace char under cursor with
gr
- virtual replace, if tabs = spaces
R
- in place replacement (more than one letter)
gR
- virtual replace, if tabs = spaces
{register}d{motion}
- delete {motion}
"_d{motion}
- to delete in black hole (not a cut)
c<motion>
- change
{register}y<motion>
- yank
~<motion>
- swap case (when selected)
u<motion>
- lowercase (when selected)
U<motion>
- uppercase (when selected)
><motion>
- shift right (>>
line)
<<motion>
- shift left (<<
line)
=<motion>
- autoindent
u
, :u[ndo]
- ungo changes
⌃R
, :red[o]
- redo changes
U
- undo all latest changes on the line
Insert mode
⌃w
- delete word
⌃u
- delete line
⌃b
- backspace
⌃[
- as escape
⌃o
- insert Normal Mode (just for one command)
⌃r{register}
- paste in insert mode
⌃r={expression}
- evaluate expression and paste
:let i = 1
^r=i<CR>
- insert i from let
⌃v[u]{digit}
- insert letter by code
⌃k{char1}{char2}
- insert letter by :diagraphs (« » 12 14 34) see :diagraph-table
Visual mode
v
- character-wise
V
- line-wise
⌃v
- block-wise
gv
- reselect
o
- go to the other end of the highlighted text
Motions
a)
, ab
- a pair of (parentheses)
i)
, ib
- inside of (parentheses)
ci)
- replace everything inside (...)
a}
, aB
- a pair of {braces}
i}
, iB
- inside of {braces}
a]
- a pair of [brackets]
i]
- inside of [brackets]
a>
- a pair of <angle brackets>
i>
- inside of <angle brackets>
a'
- a pair of 'single quotes'
i'
- inside of 'single quotes'
a"
- a pair of "double quotes"
i"
- inside of "double quotes"
a`
- a pair of backtricks
i`
- inside of backtricks
at
- a pair of <xml>tags</xml>
it
- inside of <xml>tags</xml>
iw
- current word
ciw
- replace current word.
aw
- current word plus one space
daw
- delete word and one space after it.
iW
- current WORD
aW
- current WORD plus one space
is
- current sentence
as
- current sentence plus one space
ip
- current paragraph
ap
- current paragprah plus one blank line
Yanking
{register}p
- paste text
:put {register}
- paste from register below current line
⌃r{register}
- paste in insert mode, where register can be "
, 0
, +
gp
- paste and place cursor at the end of pasted text
{register}P
- paste previous
{register}y{motion}
- yank
yy
- yank the line
- by default yank always puts everything into unnamed and 0 registers
- uppercase registes are used for append
"+
, "*
- system clipboard
:reg
- see content of all registers
"%
- name of current file
"#
- name of the alternate file
".
- last inserted text
":
- last Ex command
"/
- last search pattern
Windows
⌃w w
- next window
⌃w h
- next window on left
⌃w j
- next window below
⌃w k
- next window above
⌃w l
- next window rigth
⌃w c
, :close
, :cl
- close current window
⌃w o
, :only
, :on
- keep only current window open
⌃w =
- equalize width and height of all windows
⌃w _
- maximize height of active window
⌃w |
- maximize width of active window
{n} ⌃w _
- set active window height to {n}
rows
{n} ⌃w |
- set active window width to {n} rows
⌃w s
, :split {filename}
- split by horizontally
⌃w v
, :vsplit {filename}
- split by vertically
⌃w H
, ⌃w J
, ⌃w K
, ⌃w L
- swap windows (:help window-moving
)
⌃w x
- rotate current window (:help window-moving
)
⌃w r
- rotate all windows (:help window-moving
)
^w z
- close preview window
Tabs
:tabedit {filename}
, :tabe {filename}
- open filename in new tab
^w T
- move current window into its own tab
:tabc[lose]
- close current tab
:tabo[nly]
- keep the active tab page
{N}gt
, :tabn[ext] {N}
- switch to tab page number {N}
gt
, :tabn[ext]
- switch to next tab
gT
, :tabp[revious]
- switch to the previous tab
:tabmove [N]
- rearrange the tab
Buffers
:ls
- list of buffers
[b
, :bn[ext]
- next buffer
]b
, :bp[revious]
- previous buffer
[B
, :bfirst
- go to the first in the buffer
]B
, :blast
- go to the last in the buffer
:buffer N
- go to the buffer N
⌃-^
- alternate file
:bd[elete]
- delete current buffer
:bufdo {command}
- execute command for each buffer
Args
:args
- see args passed to the vim
:args {list}
- build arguments list
:args **/*.js **/*.css
- load all js and css files in args
:argdo command
- execute command on each argument
:argdo normal @a
- execute macro a for each file in args
:argdo write
- write all files
]a
, :next
- go to the next in args
[a
, :prev
- go to the prev in args
]A
, :first
- go to the first in args
[A
, :last
- go to the last in args
Jumps
⌃o
- jump to previous location
⌃i
- jump to forward location
:jumps
- show all jumps
^]
- jump to definition of keyword under the cursor
- Use ctags to generate ctags file
⌃t
, :pop
- to navigate back for our tag history
g ⌃]>
- if multiple matches - show choices
:tselect
, :tnext
, :tprev
, :tfirst
, :tlast
- navigate between multiple choices
:tag {keyword}
- jump to definition
:tjump {keyword}
- jump and ask for multiple
:tjump /{regex}
- try to find
gf
- jump to file name under the cursor
:set suffixesadd+=.rb
to add specific suffix :set path+=,%:h
to add current directory
(
, )
- jump to start of previous/next sentence
{
, }
- jump to start of previous/next paragraph
Command line mode
ga
- find code of selected character
:set nowrap
- unwrap lines
:setlocal spell
- turn on spell check
@:
- repeat the last ex command
⌃r
, ⌃w
- copy and paste current word to the command line
⌃p
, Up
- previous item from history
⌃n
, Down
- next item from history
q:
- see history of command line
q/
- see history of searches
:sh
- go to shell
:e <filename>
- open file name for edit
:e!
- re-read file from the disk (discard all changes)
:e %<Tab>
- to get edit current opened file
:e %:h<Tab>
- to get edit directory of current opened file
:w <filename>
- write current to file (whole file or selection)
:wall
- write all buffers
:update <filename>
- same as write, but only if modified
:r <command|filename>
- read from external file or command and paste
:!{command}
- execute command with shell
:2,$!sort -t',' -k2
- sort all lines except header by second column
read !{cmd}
- execute cmd
in shell and insert its stdout below cursor
:[range]write !{cmd}
- execute cmd
in the shell with [range]
lines as stdin
:[range]t {address}
, :[range]co[py] {address}
- copy line(s) from [range] and paste to {address}
.
- instead of address means current line
:6copy.
- copy from line 6 and insert on current line
:t6
- copy current line to below line 6
:t.
- duplicate the current line
:t$
- copy the current line to the end of the file
'<,'>t0
- copy the visually selected lines to the start of the file
:[range]m[ove] {address}
- move line(s) from [range] and paste to {address}
:[range]normal {command}
- execute command on selected range
:%normal i//
- instead //
for whole file (command all lines)
'<,'>normal .
- repeat last command for selected lines
:[range] gloabl[!] /{pattern}/ [cmd]
- execute command on range with matched pattern
:v
, :vglobal
- execute cmd on each line which does not match pattern
:sort
- sort selected lines
:grep
- grep in files
:grep -R Quickfix *
- search in all directories
:vim[grep][!] /{pattern}/[g][j] {file} ...
- search with internal vim grep
g
- multiple matches on the same line
j
- don’t jump to first match
:make
- execute make command
:setlocal makepkg=NODE_DISABLE_COLORS=1\ nodelint\ %
- change make program
:setglobal errorformat?
- see how errors are getting formatted
:compiler
- to set compiler
Macros
q{register}{macro}q
- start recording macros
- Uppercase register appends to the macro
@{register}
- replay macro
10@a
- execute 10 times macro from register a
Quickfix
:cnext
- jump to next item
:cprev
- jump to previous item
:cfirst
- jump to first item
:clast
- jump to last item
:cnfile
- jump to first item in next file
:cpfile
- jump to last item in previous file
:cc N
- jump to Nth item
:copen
- open the quickfix window
:cclose
- close the quickfix window
:colder
- older version of the quickfix list
:cnewer
- newer version of the quickfix list
Autocompletition
⌃n
- generic keywords
⌃p
- generic keywords (previous)
⌃y
- accept the currently selected match (yes)
⌃e
- revert to the originally typed text
⌃h
- delete one character from current match
⌃l
- add one character from current match
⌃x ⌃n
- current buffer keywords
⌃x ⌃i
- included file keywords
⌃x ⌃]
- tags file keywords
⌃x ⌃k
- dictionary lookup
:set spell
should be enabled
⌃x ⌃l
- whole line completion
⌃x ⌃f
-filename completion
:pwd
- to from where autocompletion will work
:cd public
- to change to folder
:cd -
- to previous working directory
⌃x ⌃o
- omni-completion
Vim spell checker
:set spell
- enable spell checking
spellfile
to share file with custom words
:set spelllang=en_us
- change speaking region
[s
- previous error
]s
- next error
z=
- fix error
zg
- add current word to spell file
zw
- remove current word from the spell file
zug
- revert zg
or zw
command for current word
⌃x s
- fix misspelled word in insert mode
Foldings
zi
- switch folding on or off
za
- toggle current fold open/closed
zc
- close current fold
zR
- open all folds
zM
- close all folds
zv
- expand folds to reveal cursor
zj
- move down to top of next fold
zk
- move up to bottom of previous fold
zo
- open current fold
zO
- recursively open current fold
zc
- close current fold
zC
- recursively close current fold
za
- toggle current fold
zA
- recursively open/close current fold
zm
- reduce foldlevel by one
zM
- close all folds
zr
- increase foldlevel by one
zR
- open all folds
Exit/Save
:q[uit]
- quit vim
:q[uit]!
- quit without saving
:cq[uit]
- quit always, without writing
ZZ
, :wq
- write and quit
ZQ
, :wq!
- write current file and exit always
:wq {file}
- write to {file}
and exit after
Vim from command line
vim -u NONE -N
- launch vim without settings
Plugins
surround.vim
S"
- surround selection with "
cs}]
- change surrounding from }
to ]
pymode
https://github.com/klen/python-mode
K
- show help for current symbol
[ [
- Jump to previous class or function (normal, visual, operator modes)
] ]
- Jump to next class or function (normal, visual, operator modes)
[M
- Jump to previous class or method (normal, visual, operator modes)
]M
- Jump to next class or method (normal, visual, operator modes)
aC
- Select a class. Ex: vaC, daC, yaC, caC (normal, operator modes)
iC
- Select inner class. Ex: viC, diC, yiC, ciC (normal, operator modes)
aM
- Select a function or method. Ex: vaM, daM, yaM, caM (normal, operator modes)
iM
- Select inner function or method. Ex: viM, diM, yiM, ciM (normal, operator modes)
^r
- Run script
^b
- Set breakpoint
Rope
^c-d
- Show doc
^c-rr
- Rename
^c-r1r
- Rename module
^c-ro
- Organize imports
^c-r1p
- Convert module to package
^c-rm
- Extract method
^c-rl
- Extract variable
^Space
- Rope completion