Vim Memo
Vim terminology
| Standard word | Vim term |
|---|---|
| save | write |
| cut | delete |
| copy | yank |
| paste | put |
| overwrite | replace |
Miscellaneous commands
| Quit (w/o writing) | :qa[ll]! / :quita[ll]! | |
| Write all and exit | :wqa[ll] / :xa[ll] | |
| Abort command | CTRL-C | |
| Undo | :u[ndo] | u |
| Redo | :red[o] | CTRL-R |
| Help | :h[elp] <topic> | <F1> |
| Set an on/off option | :set [no]<option> | :set <option>? : current value |
| Set an option | :set <option>=<value> | |
| Set a keymap | :set keymap=<keymap> | e.g. accents, magyar (default = nothing) |
| Set encoding | :set fileencoding=<encoding> | :set fileformat/ff=<dos/unix> |
| List of options | :options | |
| Syntax highlighting | :syntax on/off | :colorscheme : various schemes |
| Start a shell | :ter[minal] [command] | (only CTRL-W commands work) |
| Terminal commands | CTRL-W : (Ex command) | CTRL-W N (~normal mode, i/a returns) |
Changing modes
| Insert mode (before cursor) | i | I: at the beginning of line |
| Insert mode (after cursor) | a | A: at the end of line |
| Replace mode | R | |
| Visual mode | v | V: select lines; CTRL-V: select blocks |
Files and buffers
| Edit (or reload current) file | :e[dit] [file] | ++enc/ff=… overrides fileencoding/fileformat |
| Write file | :w[rite] | :w[rite] >> <file> : append to file |
| Close file (w/o writing) | :q[uit]! | ZQ |
| Write and close file | :wq / :x[it] / :exi[t] | ZZ |
| Save as | :saveas <filename> | |
| Edit next file | :n[ext] | :wn[ext] : write and edit next file |
| Edit previous file | :prev[ious] | :wp[revious] : write and edit prev file |
| Edig the alternate file | :e[dit] # | CTRL-^ / CTRL-6 |
| Change buffer | :b[uffer] <buffer> | |
| Next/previous buffer | :bn[ext] | :bp[revious] |
| List buffers | :ls / :buffers / :files |
Moving around
| Left / Down / Up / Right | h / j / k / l | |
| Scroll forward (down) one page | CTRL-F | CTRL-D: half page; CTRL-E: one line |
| Scroll backward (up) one page | CTRL-B | CTRL-U: half page; CTRL-Y: one line |
| To beginning of next word | w | W: same with whitespace-boundaries |
| To beginning of this word | b | B: same with whitespace-boundaries |
| To the end of this word | e | E: same with whitespace-boundaries |
| To the end of last word | ge | gE: same with whitespace-boundaries |
| To beginning of line | 0 | ^: ignoring whitespace characters |
| To end of line | $ | g$: last char of the screen line (with wrap) |
| To char <c> in current line | f + <c> | F: backwards (;: next, ,: previous) |
| To char before <c> in current line | t + <c> | T: backwards (;: next, ,: previous) |
| Change side (in visual mode) | o | |
| Jump to matching parenthesis | % | |
| Jump to beginning of file | [count] gg | with count, jump to that line |
| Jump to the end of file | [count] G | with count, jump to that line |
| Jump to column in current row | [count] | | gm: jump to central column |
| Jump to top/middle/bottom of the window | H / M / L | |
| Show current line at top/middle/bottom | zt / zz / zb | |
| Jump to next occurrence of the word at cursor | * | #: jump to previous occurrence |
| Set a mark to the letter <c> | m + <c> | use uppercase letters for global marks |
| Jump to a mark at letter <c> | ` + <c> | ' + <c>: the beginning of that line |
| Show all marks | :marks | :marks <cde> : show only marks c,d,e |
| Jump to last change | `. | `^: to last insertion |
| Back from a jump | `` |
- Tags
- tags files are consulted based on the "tags" variable
- these files can be created (e.g.) with exuberant ctags (ctags -R .)
Go to tag definition :ta[g] <tag> CTRL-]: tag under cursor Go to tag definition in new window :sta[g] <tag> CTRL-W [CTRL-]]: tag under cursor Go back from tag jump :po[p] CTRL-T / CTRL-O Go to next/previous tag definition :tn[ext] :tp[revious] / :tN[ext] Select tag jump from list :ts[elect] <tag> g]: tag under cursor Select tag jump from list in new window :sts[elect] <tag> CTRL-W g]: tag under cursor - Special Motions
- in Visual mode, or as parameters for other commands (e.g. d,c,y)
A word iw iW: same with whitespace-boundaries A word (plus spaces) aw aW: same with whitespace-boundaries A paragraph ip ap: same but cursor goes on the line below Between quotations marks (excluding) i" similarly with ',`,),],},>,t (tag) Between quotations marks (including) a" similarly with ',`,),],},>,t (tag)
Windows
| New file in new window (horizontal) | :new | CTRL-W [CTRL-]n |
| New file in new window (vertical) | :vne[w] | |
| Split window (horizontal) | :sp[lit] | CTRL-W [CTRL-]s |
| Split window (vertical) | :vs[plit] | CTRL-W [CTRL-]v |
| Edit file in new window (horizontal) | :new <file> / :sp[lit] <file> | |
| Edit file in new window (vertical) | :vne[w] <file> / :vs[plit] <file> | |
| Enlarge/shrink window vertically by N lines | :res[ize] +N / :res[ize] -N | [N] CTRL-W +/- |
| Enlarge/shrink window horizontally by N lines | [N] CTRL-W >/< | |
| Resize window to full (or N) width | :vertical :res[ize] [N] | [N] CTRL-W | |
| Make all windows equal in size | CTRL-W = | |
| Change to "the other" window | CTRL-W [CTRL-]w | |
| Change to the (left/bottom/top/right) window | CTRL-W h/j/k/l | |
| Move window to the (l/b/t/r) and maximimze | CTRL-W H/J/K/L | |
| Close window | :clo[se] | CTRL-W c |
| Close all other windows | :on[ly] | CTRL-W [CTRL-]o |
Tabs
| Edit file in new tab | :tabe[dit] <file> / :tabnew <file> | |
| Edit same buffer in new tab | :tab split | |
| Close current tab | :tabc[lose] | |
| Close all other tabs | :tab[only] | |
| Go to next tab | :tabn[ext] | gt |
| Go to previous tab | :tabp[revious] / :tabN[ext] | gT |
| Go to first tab | :tabr[ewind] / :tabfir[st] | |
| Go to last tab | :tabl[ast] | |
| Move tab N spaces | :tabm[ove] +N / :tabm[ove] -N | |
| Run command in new tab | :tab <command> |
Editing
| Delete | d + <movement> | |
| Delete line | dd | D: just right from cursor (= d$) |
| Change (delete + insert mode) | c + <movement> | C: (= Da) |
| Change line | cc | C: just right from cursor (= c$) |
| Delete current char | x (= dl) | X: backwards (= dh) |
| Substitute a char | s (= cl) | S: (= cc) |
| Replace current char with <c> | r <c> | |
| Open line below | o | O: open row above |
| Yank | y + <movement> | |
| Yank line | yy / Y | |
| Put | p | P: before cursor |
| Select register for next d/y/p | " + <register> | (yank always uses 0, as well) |
| Show registers | :reg[isters] / :di[splay] | |
| Change case | g~ + <movement> | ~: on one char & forward |
| Change to lowercase | gu + <movement> | gU + <movement>: uppercase |
| Add [count] (or 1) to the number under cursor | [count] CTRL-A | [count] CTRL-X: same but subtract |
| Format lines | gq + <movement> | set textwidth/tw to > 0 for wrapping |
| Indent lines | = + <movement> | [count] + ==: indent count lines |
| Filter lines through external command | ! + <movement> <command> | [count] + !! <command>: filter count lines |
| Prepend to each line in visual block | I + <string> | A + <string>: same with append |
- transpose chars: xp
- transpose lines: ddp
- duplicate line: yyp
Special keys in Insert mode
| Temporary Normal mode | CTRL-O | |
| Delete backwards | CTRL-W (word) | CTRL-U (whole line) |
| Change indentation | CTRL-T (more) | CTRL-D (less) |
| Insert literally | CTRL-V + <char> | CTRL-Q + <char> |
| Insert register | CTRL-R + <register> | |
| Insert same character | CTRL-Y (as above cursor) | CTRL-E (as below cursor) |
| Autocomplete | CTRL-N (search forward) | CTRL-P (search backward) |
| Insert digraph | CTRL-K <char1> <char2> | (see also :h digraphs-default) |
| Add digraph | :dig[raphs] <char1> <char2> <code> | :dig[raphs] (show all digraphs) |
Registers
| default | " |
| named | a-z |
| named (appending) | A-Z |
| last yank | 0 |
| last small delete | - |
| recent large deletes | 1-9 |
| black hole | _ |
| clipboard | + |
| primary clipboard | * |
| expression | = |
| current filename | % |
| alternate filename | # |
| last insertion | . |
| last Ex command | : |
| last search | / |
Search & replace
| Search <string> | / <string> | ?: backwards |
| Search word under cursor | * | |
| Next match | n | N: previous |
| Substitute | :[<range>]s[ubstitute]/[<old>]/<new>[/<flags>] | &: repeat (no flags) |
- <range> is the current line by default
- <old> is the last search by default
- flags: g (global), c (confirm), n (only count), & (same flags as before)
- confirm mode: y/n (yes/no), q (quit), l (yes + quit), a (all); C-e/C-y (scroll up/down)
Ranges
- % means the whole file
- a,b for lines a-b (. is the current line, 0 the zeroth, 1 the first, $ the last)
- these can be regexps, e.g. /start/,/end/, or marks, e.g. 't,'b
- can have offsets, e.g. /start/+1,/end/-1
- visual mode selections also specify ranges (o: changes active end [O: other corner for blocks])
- ! filters the range through an external command (:<range>!<cmd>)
Automatization
| Record macro in <register> | q + <register> [stop: q, use uppercase register to append] |
| Play macro in <register> | @ + <register> [after that: @@] |
| Repeat last command | . |
| Repeat <command> <n> times | <n> + <command> |
| Repeat last Ex command | @: [after that: @@] |
| Execute commands for range | :[<range>] normal <commands> |
| Execute commands for matches | :[<range>] g[lobal][!] /<pattern>/ <commands> |
| Do for all buffers/windows | :bufdo / :windo |
Quickfix
| Call make | :mak[e] | |
| Search files containing regexp | :vim[grep] /<pattern>/ <file> | (use * or ** in path) |
| Open quickfix window | :cope[n] | |
| Open quickfix window when there are errors | :cw[indow] | |
| Next/previous location | :cn[ext] | :cp[revious] |
| Go to selected location | <Enter> | (in quickfix window) |
| Go to selected location in new window | CTRL-W <Enter> | (in quickfix window) |
| Go to older/newer error list | :col[der] | :cnew[er] |