Vim

Vi IMproved, a programmers text editor

Exiting
:w write (save) the file, but don’t exit
:wq write (save) and quit
:x write (save) and quit
:q quit (fails if there are unsaved changes)
:q! quit and throw away unsaved changes
:qa quit all buffers and windows
ZZ write (save) current file, if modified, and quit
ZQ quit without checking for changes
Cursor Movement

| h | move cursor left | | ——— | ————————————————————————————— | | j | move cursor down | | k | move cursor up | | l | move cursor right | | w | jump forwards to the start of a word | | W | jump forwards to the start of a word (words can contain punctuation) | | e | jump forwards to the end of a word | | E | jump forwards to the end of a word (words can contain punctuation) | | b | jump backwards to the start of a word | | B | jump backwards to the start of a word (words can contain punctuation) | | 0 | jump to the start of the line | | ^ | jump to the first non-blank character of the line | | $ | jump to the end of the line | | G | go to the last line of the document | | nG | go to line number n | | :n | go to line number n | | '' | To the position before the latest jump, / where the last “m’” / “m" command was given. | | fx | jump to next occurrence of character x | | tx | jump to one character before the character x | | } | jump to next paragraph | | { | jump to previous paragraph | | H | jump to home (top) of screen | | L | jump to last line of screen | | M | jump to middle of screen | | 3, f, x | jump to 3rd instance of character x forward from cursor on current line. | | 3, F, x` | jump to 3rd instance of character x back from cursor on current line. |

Screen Movement
Ctrl u move screen up by half page
Ctrl b move screen up by one page
Ctrl d move screen down by half page
Ctrl f move screen down by one page
zz center screen on cursor
zt align top of screen with cursor
zb align bottom of screen with cursor
Insert Mode - Inserting/Appending Text
i insert before the cursor
I insert at the beginning of the line
a insert (append) after the cursor
A insert (append) at the end of the line
o append (open) a new line below the current line
O append (open) a new line above the current line
ea insert (append) at the end of the word
Esc exit insert mode
Editing
r replace a single character
J join line below to the current one
cc change (replace) entire line
cw change (replace) to the end of the word
c$ change (replace) to the end of the line
s delete character and substitute text
S delete line and substitute text (same as cc)
xp transpose two letters (delete and paste)
u undo
Ctrl r redo
. repeat last command
Cut and Paste
yy yank (copy) a line
2yy yank (copy) 2 lines
:n,Ny yank lines n through N
yw yank (copy) word
y$ yank (copy) to end of line
p put (paste) the clipboard after cursor
P put (paste) before cursor
dd delete (cut) a line
2dd delete (cut) 2 lines
:n,Nd delete lines n through N
dw delete (cut) word
D delete (cut) to the end of the line
d$ delete (cut) to the end of the line
x delete (cut) character
Search and Replace
* search for word under cursor
/pattern search for pattern
?pattern search backward for pattern
n repeat search in same direction
N 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
Marking Text (Visual Mode)
v start visual mode, mark lines, then do a command (like y-yank)
V start linewise visual mode
vo move to other end of marked area
Ctrl v start visual block mode
vO move to other corner of block
vaw mark a word
vab mark a block with ()
vaB mark a block with {}
vib mark inner block with ()
viB mark inner block with {}
Esc exit visual mode
Visual Commands
> shift text right
< shift text left
== auto-indent current line
<< shift current line left by shiftwidth
>> shift current line right by shiftwidth
y yank (copy) marked text
d delete marked text
~ switch case
Working with Multiple Files
:e filename edit a file in a new buffer
:ene open a blank file for editing
:bnext / :bn go to the next buffer
:bprev / :bp go to the previous buffer
:bd delete a buffer (close a file)
:sp filename open a file in a new buffer and split window
:vs filename open a file in a new buffer and vertically split window
Ctrl w, s split window
Ctrl w, w switch windows
Ctrl w, q quit a window
Ctrl w, v split window vertically
Ctrl w, h move cursor to window left
Ctrl w, l move cursor to window right
Ctrl w, k move cursor to window above
Ctrl w, j move cursor to window below
Ctrl w, r rotate windows clockwise
Ctrl w, T move current window to a new tab
:on close all windows except current window
Ctrl w, \| maximize width of active window
Ctrl w, 1, \| minimize width of active window
Ctrl w, _ maximize height of active window
Ctrl w, 1, _ minimize height of active window
Ctrl w, = equalize size of windows
Tabs
#gt move to tab number #
Ctrl w, t move the current split window into its own tab
:tabmove # move current tab to the #th position (indexed from 0)
:tabnew filename / :tabn filename open a file in a new tab
:tabclose / :tabc close the current tab and all its windows
:tabonly / :tabo close all tabs except for the current one
gt / :tabnext / :tabn move to the next tab
gT / :tabprev / :tabp move to the previous tab
Registers
:reg / :registers view all current registers
echo @r access register r as a variable
"/ last search pattern register
"_ the black hole register
"0 last yank register
"1 last big delete register
"2-"9 big delete register stack
"+ system clipboard
"- small delete register
"a-"z named registers
"A-"Z append registers
qr record into register r
Additional Ex Commands
:mak / :make run a compiler and enter quickfix mode
:! execute external shell command
:r / :read read external program output into current file
:x,ymz move lines x through y to z (delete + put)
:x,ytz yank lines x through y and put to z (yank + put)
:. current line (cursor location)
:$ last line (bottom of file)
:0 first line (top of file)
:ls list all open files
:%TOhtml create html representation of current working buffer
Basic Configuration
:set nu show line numbers
:set hid lets you switch buffers without saving
:set hls highlight search matches
:set sc show commands as you type them
:set ru show line and column number of the cursor
Folding Commands
zf#j creates a fold from the cursor down # lines
zf/ string creates a fold from the cursor to string
zj moves the cursor to the next fold
zk moves the cursor to the previous fold
za toggle a fold under cursor
zo opens a fold at the cursor
zO opens all folds at the cursor
zc closes a fold under cursor
zm increases the foldlevel by one
zM closes all open folds
zr decreases the foldlevel by one
zR decreases the foldlevel to zero – all folds will be open
zd deletes the fold at the cursor
zE deletes all folds
[z move to start of open fold
]z move to end of open fold