Starting Vim
vim [file1] [file2] ...
vim has 3 main modes:
- Normal mode: For navigation and manipulation of text. This is the mode that vim will usually start in
- Insert (edit) mode: For inserting new text, where you type into your file like other editors.
- Command mode: For executing extra commands like the help, shell, ...
move around the text (file) by:
gg
<ctrl+b>
<ctrl+u>
-
k
^
0 / ^ / B / b / h < > l / e / E / w / W / $
v
+
j
<ctrl+d>
<ctrl+f>
G
h: leftj: downk: upl: right
w: next wordW: next WORDb: previous wordB: previous WORDe: end of wordE: end of WORD
0: begin of line (column 0)^: begin of line (non-blank)$: end of line-=k^: start of previous line+=j^: start of next line
H: top of windowM: middle of windowL: low (bottom) of windowzt: scroll to topzz: scroll to middlezb: scroll to bottom<ctrl+b>/<ctrl+f>: previous / next page<ctrl+u>/<ctrl+d>: previous / next half page
gg/G: go to begin / end of file[num]gg/[num]G/:num<CR>: go to line numgd: go to definition of current wordgf: go to the file (under the cursor)
searching in Normal Mode:
f[char]/F[char]: find forward / backward to next / previous char (exactly on char)t[chat]/T[char]: up to forward / backward to next / previous char (next to the char),/;: previous / next repeat forf/t/F/Taction*/#: find current word backward / forward/[pattern]/?[pattern]: search forward / backward by matching patternn/N: next / previous result[I: show lines with matching word under cursor
<ctrl+o>: jump back<ctrl+i>: jump forward<ctrl+6>: jump to the buffer you just left<ctrl+]>: jump to tag under cursor (if./tagsis available)'': jump back to last jump'.: jump to last edited line{/}: previous / next paragraph%: matching (), {}, []m[char]/'[char]: mark by / jump to[char]m[CHAR]/'[CHAR]: mark by / jump to[CHAR]across the files.
these commands take you in Insert Mode:
i: insert at left of cursorI-> insert at the line beginning (non-blank)a: insert at right of cursorA: insert at end of lineo: insert by adding new line below the cursorO: insert by insert new line above the cursors: substitute at cursor and enter insert modeS=^DA=ddO: delete current line and enter insert modeC=c$: change line from cursor to EOL
editing the text without transition to Insert Mode:
.: repeat last command~: swap casex: delete char current charr: replace char under the cursordd: delete current lineJ: merge with the next lineD: delete line from cursor to the EOLyy: yank/copy current lineu: undo<ctrl+r>: redo
paste:
p: paste to the next lineP: paste above current line
visual mode:
v: into visual/select modeV: into visual/select mode by line<ctrl+v>: into visual/select mode by block
alignment:
=<CR>,==: auto indent><CR>,>>: shift right, increase indent<<CR>,<<: shift left, decrease indent
operator are generally constructed as:
[operator][count][motion]
[operator]i[motion]
- operators:
c: change command ...d: delete ...y: yank (copy) ...g~: swap case ...gu: to lower case ...gU: to upper case ...
- motion:
w/W: word / WORD[,]: block(,): block<,>: block",': in double quote or quotet: XML/HTML tags: sentence
examples:
di): delete the text inside current paranthesisci": change the text inside ""gUiw: make the word under the cursor to upper case
"[char][y|d]: yank/delete into register"[char][p|P]: paste from register:echo @[char]: shows register content:reg[isters]: shows all registers
q[char]: start recording into registercharq: stop recording macro@[char]: play macro in registerchar@@: repeat last playback
zi: toggles folding on or offza: toggles current fold open or closezc: close current foldzC: close current fold recursivelyzo: open current foldzO: open current fold recursivelyzR: open all foldszM: close all foldszv: expand folds to reveal the cursorzk/zj: move to previous / next fold
<ctrl+w> s=:sp[lit]: split current window horizontally<ctrl+w> v=:vs[plit]: split current window vertically<ctrl+w> c=:cl[ose]: close current window<ctrl+w> o=:on[ly]: close all windows except current one<ctrl+w> <ctrl+w>: switch to next split window<ctrl+w> <ctrl+p>: switch to previous split window<ctrl+w> hjkl: switch (move cursor) to left, below, above or right split<ctrl+w> HJKL: move current window to left, below, above or right<ctrl+w> r: rotate window clockwise<ctrl+w> =: make all windows equal in size[num]<ctrl+w> +-: increase/decrease current window height[num]<ctrl+w> <>: increase/decrease current window width<ctrl+w> _: minimize current window<ctrl+w> T: move current window to new tab
]s/[s: jump to next / previous spelling errorz=: suggest corrections for current wordzg: add current word to the dictionaryzw: remove current word from dictionary
Esc=<ctrl+c>=<ctrl+[>: exit insert mode
<ctrl+p>: auto-complete / previous item<ctrl+n>: auto-complete / next item<ctrl+x><ctrl+l>: auto complete line mode
<ctrl+w>: delete word before cursor<ctrl+u>: delete line before cursor<ctrl+r>[char]: insert content of register[char]<ctrl+t>: increase line indent<ctrl+u>: decrease line indent
:jumps: shows the jump list:changes: shows the change list:reg[isters]: shows the registers:marks: shows the marks:delm[arks] {marks}: delete specified mark(s)delm a b 1 \": deletesa,b,1and"delm a-h: deletes all marks fromatoh
:delm[marks]!: deletes all lowercase marks
:w[rite]: write current file:q: close/quit current file, split or tab:wq=ZZ: write current file and quit:q!=ZQ: quit without writing the changes:qa: quit all splits:ls: list all open files/buffers:f[ile]=<ctrl+g>: shows current file path:e[dit]: open a file for editing:ene[w]: open a blank new file for editing:b<n>: jump to buffernreturned from:ls:b <file>: jump to bufferfile, Tab to scroll through available options:bn[ext]: jump to next buffer:bp[rev]: jump to previous buffer:bd[elete]: remove file from buffer list
:mak[e]: run make in current directory:cw: toggle mini window for errors:!: executes external shell command:r[ead]: read external program output into current file
:sp[lit]=<ctrl+w> s: split current window horizontally:vs[plit]=<ctrl+w> v: split current window vertically:cl[ose]=<ctrl+w> c: close current window:on[ly]=<ctrl+w> o: close all windows except current one
<ctrl+w> gf: open file under the cursor into new tab:tabs: list current tabs and windows:tabn=<ctrl+PageDown>: next tab:tabn <n>: goto tabn:tabp=tabN=<ctrl+PageUp>: previous tab:tabe [file]: create a new blank tab or opensfilein that tab
:h cmd: normal mode command help:h :cmd: command line help for cmd:h i_cmd: insert mode command help:h v_cmd: visual mode command help:h c_cmd: command line editing cmd help:h 'option': help of option:helpg[rep]: search through help docs!
:h motions:h word-motions:h jump-motions:h mark-motions:h operators:h buffres:h windows:h tabs:h registers:h pattern-searches
:set <opt>?: shows current option value:set no<opt>: turn off flagopt:set opt: turn on flagopt:set opt=val: override value ofopt:set opt+=val: appendvaltoopt:echo &opt: shows value ofopt
hiddenorhid: when off, a buffer is unloaded when it's abandoned.laststatusorls: shows status line: 0 (never), 1 (only if at least two windows), 3 (always)hisearchorhis: highlight search matchesnumberornu: shows line numbershowcmdorsc: shows command as you type them (may not be available on your compilation)rulerorru: shows line and column number of the cursorwrap: controls line wrappingignorecaseoric: ignores case for search patternssmartindentorsi: flag for smart indentingfoldmethodorfdm: fold methodspell/nospell: turn spell checking enable or disable.
:s/search/replace/: basic substitution on a line:%s/search/replace/: run substitution on every line:%s/search/replace/g:gflag means apply to every match:%s/search/replace/c:cflag means ask for confirmation
by executing $> ctags -r under project tree:
:tag <name>TAB: goes to tag name<ctrl+]>: goes to the tag under cursor
do: get changes from other window into the current windowdp: put the changes from current window into the other window]c: jump to the next change[c: jump to the previous changezo: open foldzc: close foldzr: reducing folding levelzm: one more folding level, please:diffupdate,:diffu: recalculate the diff:diffg RE: get from REMOTE:diffg BA: get from BASE:diffg LO: get from LOCAL