Vim Cheat Sheet
info
Thanks for the work of https://vim.rtorr.com/ This copy here is only for taking notes and mark what's been learnt.
vim structure: Tabs -> Windows -> buffers
#
Global:h[elp] keyword
- open help for keyword:sav[eas] file
- save file as:clo[se]
- close current pane:ter[minal]
- open a terminal windowK
- open man page for word under the cursortip
Run
vimtutor
in a terminal to learn the first Vim commands.
#
Cursor movementh k j l
hjkl
- move cursor left down up rightgj
- move cursor down (multi-line text, set wrap for latex, markdown)gk
- move cursor up (multi-line text)H
- move to top of screen
M
- move to middle of screenL
- move to bottom of screenw e b
w
- jump forwards to the start of a wordW
- jump forwards to the start of a word (words can contain punctuation)e
,ge
- jump forwards to the end of a wordE
,gE
- jump forwards to the end of a word (words can contain punctuation)b
- jump backwards to the start of a wordB
- jump backwards to the start of a word (words can contain punctuation)
%
- move to matching character (default supported pairs: '()', '{}', '[]' - use:h matchpairs
in vim for more info)0
- jump to the start of the line^
- jump to the first non-blank character of the line$
- jump to the end of the lineg
g_
- jump to the last non-blank character of the linegg
- go to the first line of the documentG
- go to the last line of the document5gg
or5G
- go to line 5gd
- move to local declarationgD
- move to global declaration
f t
find (on), til (before)fx
,f*
- jump to next occurrence of characterx
,*
tx
,t*
- jump to before next occurrence of characterx
,*
Fx
- jump to the previous occurrence of characterx
Tx
- jump to after previous occurrence of character x;
- repeat previous f, t, F or T movement,
- repeat previous f, t, F or T movement, backwards
}
- jump to next paragraph (or function/block, when editing code){
- jump to previous paragraph (or function/block, when editing code)zz
- center cursor on screenctrl+
Ctrl
+e
- move screen down one line (without moving cursor)Ctrl
+y
- move screen up one line (without moving cursor)Ctrl
+b
- move back one full screenCtrl
+f
- move forward one full screenCtrl
+d
- move forward 1/2 a screenCtrl
+u
- move back 1/2 a screen
tip
Prefix a cursor movement command with a number to repeat it. For
example, 4j
moves down 4 lines.
#
Insert mode - inserting/appending texti a o
i
- insert before the cursorI
- insert at the beginning of the linea
- insert (append) after the cursorA
- insert (append) at the end of the lineo
- append (open) a new line below the current lineO
- append (open) a new line above the current lineea
- insert (append) at the end of the word
ctrl+
(may conlict with key biner.)Ctrl
+h
- delete the character before the cursor during insert modeCtrl
+w
- delete word before the cursor during insert modeCtrl
+j
- begin new line during insert modeCtrl
+t
- indent (move right) line one shiftwidth during insert modeCtrl
+d
- de-indent (move left) line one shiftwidth during insert modeCtrl
+n
- insert (auto-complete) next match before the cursor during insert modeCtrl
+p
- insert (auto-complete) previous match before the cursor during insert modeCtrl
+rx
- insert the contents of register xCtrl
+ox
- Temporarily enter normal mode to issue one normal-mode command x.
Esc
- exit insert mode
#
Editing (enter insert mode when finished)r
- replace a single character.R
- replace more than one character, untilESC
is pressed.J
- join line below to the current one with one space in betweengJ
- join line below to the current one without space in betweengwip
- reflow paragraphg~
- switch case up to motiongu
- change to lowercase up to motiongU
- change to uppercase up to motioncc
- change (replace) entire linec$
orC
- change (replace) to the end of the lineciw
- change (replace) entire word (enter insert mode after delete)ci(
- change (replace) entire word within parentheses.cw
orce
- change (replace) to the end of the words
- delete character and substitute textS
- delete line and substitute text (same ascc
)xp
- transpose two letters (delete and paste)- undo, redo
u
- undoU
- restore (undo) last changed lineCtrl
+r
- redo
.
- repeat last command
#
Marking text (visual mode)v
- start visual mode, mark lines, then do a command (likey
-yank)V
(shift+v)- start linewise visual modeCtrl
+v
- start visual block mode. (column selection)o
- move to other end of marked areaO
- move to other corner of blockaw
- marka
wordab
- a block with ()aB
- a block with {}at
- a block with<>
tagsib
- inner block with ()iB
- inner block with {}it
- inner block with<>
tagsEsc
- exit visual mode
note
To insert same stuff on one column,
- ctrl+v
- select all the space on one column
- shift+i
- do what you want: inserting, deleting
- esc : wait for effects.
v
, select a token,#
or*
- find next same token
tip
Instead of b
or B
one can also use (
or {
respectively.
#
Visual commands (v, s-v, c-v)>
- shift text right with shiftwidth.<
- shift text lefty
- yank (copy) marked textd
- delete marked text~
- switch caseu
- change marked text to lowercaseU
- change marked text to uppercase
#
Registers (clipboard)all previous copy, selection, delete are in registers.
:reg
- show registers content"xy
- yank into register x"xp
- paste contents of register x"+y
- yank into the system clipboard register"+p
- paste from the system clipboard register
tip
Registers are being stored in ~/.viminfo, and will be loaded again on next restart of vim.
tip
Special registers:
0
- last yank"
- unnamed register, last delete or yank%
- current file name#
- alternate file name*
- clipboard contents (X11 primary)+
- clipboard contents (X11 clipboard)/
- last search pattern:
- last command-line.
- last inserted text-
- last small (less than a line) delete=
- expression register_
- black hole register
#
Marks and positions (wait point):marks
- list of marksma
- set current position for marka
- `a - jump to position of mark
a
- y`a - yank text to position of mark
a
- `0 - go to the position where Vim was previously exited
- `" - go to the position when last editing this file
- `. - go to the position of the last change in this file
- `` - go to the position before the last jump
:ju[mps]
- list of jumpsCtrl
+i
- go to newer position in jump listCtrl
+o
- go to older position in jump list:changes
- list of changesg,
- go to newer position in change listsg;
- go to older position in change listCtrl
+]
- jump to the tag under cursor
tip
To jump to a mark you can either use a backtick (`) or an apostrophe ('
).
Using an apostrophe jumps to the beginning (first non-blank) of the line
holding the mark.
#
Macrostip
store in registers.
qa
- record macroa
q
- stop recording macro@a
- run macroa
@@
- rerun last run macro
#
Cut(delete), pastetip
delete dd
is same as cut, because the registers record the deleted text.
y
yy
- yank (copy) a line2yy
- yank (copy) 2 linesyw
- yank (copy) the characters of the word from the cursor position to the start of the next wordyiw
- yank (copy) word under the cursoryaw
- yank (copy) word under the cursor and the space after or before ity$
orY
- yank (copy) to end of lineyt{
copy all till{
p
- put (paste) the clipboard after cursorP
- put (paste) before cursorgp
- put (paste) the clipboard after cursor and leave cursor after the new textgP
- put (paste) before cursor and leave cursor after the new text
d
dd
- delete (cut) a line2dd
- delete (cut) 2 linesdw
,db
- delete (cut) the characters of the word from the cursor position to the start of the worddiw
- delete (cut) word under the cursor.di(
,di)
- delete (cut) word within the()
dt(
, - delete (cut) word until the()
daw
- delete (cut) word under the cursor and the space after or before itda(
- delete the words within the()
including()
.d$
orD
- delete (cut) to the end of the lined0
x
- delete (cut) character
#
Indent texttip
should work with the auto-indent plugin of neovim
. Check ~/.config/nvim/plugin.vim
==
- indent line- line visual model (
shift+v
) select the lines to indent, then=
gg=G
- indent entire file
#
Exiting:w
- write (save) the file, but don't exit:w !sudo tee %
- write out the current file using sudo:wq
or:x
orZZ
- write (save) and quit:q
- quit (fails if there are unsaved changes):q!
orZQ
- quit and throw away unsaved changes:wqa
- write (save) and quit on all tabs:qa
close all open files.
#
Search and replace/pattern
- search for pattern?pattern
- search backward for pattern\vpattern
- 'very magic' pattern: non-alphanumeric characters are interpreted as special regex symbols (no escaping needed)n
- repeat search in same directionN
- repeat search in opposite direction
tip
similar search and highlight can be done in visual mode by selection marking. see above #
and *
in visual mode.
:%s/old/new/g
- replace all old with new throughout file:%s/old/new/gc
- replace all old with new throughout file with confirmations:noh[lsearch]
- remove highlighting of search matches
#
Search in multiple files:vim[grep] /pattern/ {\
{file}`}- search for pattern in multiple files e.g.
:vim[grep] /foo/*/`:cn[ext]
- jump to the next match:cp[revious]
- jump to the previous match:cope[n]
- open a window containing the list of matches:ccl[ose]
- close the quickfix window
#
Tabs:tabnew
or:tabnew {page.words.file}
(shortcuttn
) - open a file in a new tabCtrl
+wT
- move the current split window into its own tabgt
or:tabn[ext]
- move to the next tabgT
or:tabp[revious]
- move to the previous tab\#gt
- move to tab number #:tabm[ove] \#
- move current tab to the #th position (indexed from 0):tabc[lose]
- close the current tab and all its windows:tabo[nly]
- close all tabs except for the current one:tabdo
command - run thecommand
on all tabs (e.g.:tabdo q
- closes all opened tabs)
#
Working with multiple filesbuffer
:ls
or:buffers
- list all open buffers:e[dit] file
- edit a file in a new buffer:bn[ext]
- go to the next buffer:bp[revious]
- go to the previous buffer:bd[elete]
- delete a buffer (close a file):b[uffer]#
- go to a buffer by index #:b[uffer] file
- go to a buffer by file:sp[lit] file
- open a file in a new buffer and split window:vs[plit] file
- open a file in a new buffer and vertically split window:vert[ical] ba[ll]
- edit all buffers as vertical windows:tab ba[ll]
- edit all buffers as tabs
window
ctrl+w
Ctrl
+ws
- split windowCtrl
+wv
- split window verticallyCtrl
+ww
- switch windowsCtrl
+wq
- quit a windowCtrl
+wx
- exchange current window with next oneCtrl
+w=
- make all windows equal height & widthCtrl
+wh
- move cursor to the left window (vertical split)Ctrl
+wl
- move cursor to the right window (vertical split)Ctrl
+wj
- move cursor to the window below (horizontal split)Ctrl
+wk
- move cursor to the window above (horizontal split)Ctrl
+wH
- make current window full height at far left (leftmost vertical window)Ctrl
+wL
- make current window full height at far right (rightmost vertical window)Ctrl
+wJ
- make current window full width at the very bottom (bottommost horizontal window)Ctrl
+wK
- make current window full width at the very top (topmost horizontal window)
info
keys remapping
" Split windownmap ss :split<Return><C-w>wnmap sv :vsplit<Return><C-w>w" switch windownmap <Space> <C-w>w
#
Diffzf
- manually define a fold up to motionzd
- delete fold under the cursorza
- toggle fold under the cursorzo
- open fold under the cursorzc
- close fold under the cursorzr
- reduce (open) all folds by one levelzm
- fold more (close) all folds by one levelzi
- toggle folding functionality]c
- jump to start of next change[c
- jump to start of previous changedo
or:diffg[et]
- obtain (get) difference (from other buffer)dp
or:diffpu[t]
- put difference (to other buffer):diffthis
- make current window part of diff:dif[fupdate]
- update differences:diffo[ff]
- switch off diff mode for current window
tip
The commands for folding (e.g. za
) operate on one level. To operate on all levels, use uppercase letters (e.g. zA
).
tip
To view the differences of files, one can directly start Vim in diff mode by running vimdiff
in a terminal. One can even set this as git difftool
.