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] |