Mina Vim KeyBinds anteckningar
Sep 13, 2023

Intro
Endorsed by my mountain dew drinking classmates to optimise my coding speed x1000, I taught myself Vim and now mainly use it in Obsidian, Here are all my notes I've gathered for my VIM keybinds that I find useful.
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 cursor
Tip Run vimtutor in a terminal to learn the first Vim commands.
Cursor movement
```
k
<-b, h l, e->
j
```
h - move cursor leftj - move cursor downk - move cursor upl - move cursor rightgj - move cursor down (multi-line text)gk - move cursor up (multi-line text)H - move to top of screenM - move to middle of screenL - move to bottom of screenw - jump forwards to the start of a wordW - jump forwards to the start of a word (words can contain punctuation)e - jump forwards to the end of a wordE - 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)ge - jump backwards to the end of a wordgE - jump backwards to the end of a word (words can contain punctuation)% - move cursor 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_ - 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 or 5G - go to line 5gd - move to local declarationgD - move to global declarationfx - jump to next occurrence of character xtx - jump to before next occurrence of character xFx - jump to the previous occurrence of character xTx - 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 screenzt - position cursor on top of the screenzb - position cursor on bottom of the screenCtrl + e - move screen down one line (without moving cursor)Ctrl + y - move screen up one line (without moving cursor)Ctrl + b - move screen up one page (cursor to last line)Ctrl + f - move screen down one page (cursor to first line)Ctrl + d - move cursor and screen down 1/2 pageCtrl + u - move cursor and screen up 1/2 page
Tip Prefix a cursor movement command with a number to repeat it. For example, 4j moves down 4 lines.
Insert mode - inserting/appending text
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 wordCtrl + h - delete the character before the cursor during insert modeCtrl + w - delete word before the cursor during insert modeCtrl + j - add a line break at the cursor position 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 or Ctrl + c - exit insert mode
Editing
r - replace a single character.R - replace more than one character, until ESC 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$ or C - change (replace) to the end of the lineciw - change (replace) entire wordcw or ce - change (replace) to the end of the words - delete character and substitute textS - delete line and substitute text (same as cc)xp - transpose two letters (delete and paste)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 (like y-yank)V - start linewise visual modeo - move to other end of marked areaCtrl + v - start visual block modeO - move to other corner of blockaw - mark a 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 or Ctrl + c - exit visual mode
Tip Instead of b or B one can also use ( or { respectively.
Visual commands
- shift text right< - shift text lefty - yank (copy) marked textd - delete marked text~ - switch caseu - change marked text to lowercaseU - change marked text to uppercase
Registers
:reg[isters] - 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
:marks - list of marksma - set current position for mark A`a - jump to position of mark Ay`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 listg; - 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.
Macros
qa - record macro aq - stop recording macro@a - run macro a@@ - rerun last run macro
Cut and paste
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$ or Y - yank (copy) to end of linep - 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 textdd - delete (cut) a line2dd - delete (cut) 2 linesdw - delete (cut) the characters of the word from the cursor position to the start of the next worddiw - delete (cut) word under the cursordaw - delete (cut) word under the cursor and the space after or before it:3,5d - delete lines starting from 3 to 5
Tip You can also use the following characters to specify the range:
e.g.
:.,d - From the current line to the end of the file :.,1d - From the current line to the beginning of the file :10,d - From the 10th line to the beginning of the file
:g/{pattern}/d - delete all lines containing pattern:g!/{pattern}/d - delete all lines not containing patternd$ or D - delete (cut) to the end of the linex - delete (cut) character
Indent text
- indent (move right) line one shiftwidth<< - de-indent (move left) line one shiftwidth% - indent a block with () or {} (cursor on brace)<% - de-indent a block with () or {} (cursor on brace)ib - indent inner block with ()at - indent a block with <> tags3== - re-indent 3 lines=% - re-indent a block with () or {} (cursor on brace)=iB - re-indent inner block with {}gg=G - re-indent entire buffer]p - paste and adjust indent to current line
Exiting
:w - write (save) the file, but don't exit:w !sudo tee % - write out the current file using sudo:wq or :x or ZZ - write (save) and quit:q - quit (fails if there are unsaved changes):q! or ZQ - quit and throw away unsaved changes:wqa - write (save) and quit on all tabs
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:%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} - 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 the command
on all tabs (e.g. :tabdo q
- closes all opened tabs)
Working with multiple files
: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:ls or :buffers - list all open buffers: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 tabsCtrl + 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)
Diff
zf - 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.