:e[dit] {file} - load {file} into a buffer (replaces current window's buffer)
:fin[d] {file} - search and open {file}
:badd {file} - add {file} to the buffer list without opening
:w[rite] - save current buffer
:w {file} - save current buffer as {file} (does not change buffer name)
:sav[eas] {file} - save current buffer as {file} and switch buffer to it
:wa[ll] - save all buffers
:up[date] - update current buffer
:r[ead] {file} - insert {file} below cursor
:r[ead] !{cmd} - insert output of {cmd} into current buffer
:e[dit]! - reload buffer, discard changes
:f[ile] - show current buffer name
:f[ile] {name} - change current buffer name (no write)
:bd[elete] - delete current/active buffer (close file)
:{n},{m}bd[elete] - delete buffers from {n} to {m}
:%bd[elete] - delete all buffers
:bufdo {cmd} - execute {cmd} in each buffer in the list. eg: apply macro 'a' to each buffer :bufdo normal @a
:buddo norm[al] @a - apply macro 'a' to each buffer
:ls or :buffers - show all buffers
:b[uffer]{id} - move to buffer using {id}
:bn[ext], :bp[rev] - go to the next/previous buffer
:bf[irst], :bl[ast] - go to first/last buffer
CTRL-^ - switch to the alternate buffer. (marked in buffer list with symbol #)
{id}CTRL-^ - switch to buffer {id}.
:sb{id} - open buffer{id} as a horizontal split
:vert[ical] sb{id} - open buffer{id} as a vertical split
:ball - open all buffers in horizonal splits
:vert ball - open all buffers in vertical splits
:ar[gs] - display the arglist
:ar[gs] {file(s)} - replace arglist with {file(s)}
:arga[dd] {file(s)} - add {file(s)} to the arglist
:ar[gs] **/*.yml - add all yaml files from CWD and child folders
:argd[elete] {file(s)} - to remove {file(s)} from the arglist
:argd[elete] * - remove all files from the arglist
:argdo {cmd} - execute {cmd} on every file in the arglist
:argdo update - save all changes to arglist
:argdo undo - undo last change in each arg buffer
:n[ext] - edit next file in the arglist
:N[ext] or :prev - edit previous file in the arglist
:wn[ext] - write current file, edit next arg
:wN[ext] or :wprev - write current file, edit previous arg
:fir[st] or :rew[ind] - edit first file in the arglist
:la[st] - edit last file in the arglist
:argdo %s/old/new/ge | update - replace "old" with "new" in each file in the arglist and save
:sp[lit] {file} or :new {file} - open {file} in a new buffer and create horizontal split
:vs[plit] {file} or :vnew {file} - open {file} in a new buffer and create vertical split
:on[ly]! - close all windows except current
CTRL-w o - close all windows except current
CTRL-w s - split active window horizontally
CTRL-w v - split active window vertically
CTRL-w w - cycle through windows
CTRL-w p - switch to previous window
CTRL-w n - open a new empty window (horizontal split)
CTRL-w q - quit a window
CTRL-w j or CTRL-w <Dn> - switch to window below
CTRL-w k or CTRL-w <Up> - switch to window above
CTRL-w h or CTRL-w <Left> - switch to window left
CTRL-w l or CTRL-w <Right> - switch to window right
CTRL-w H - move window to far left
CTRL-w J - move window to bottom
CTRL-w K - move window to top
CTRL-w L - move window to far right
CTRL-w r - rotate the windows clockwise
CTRL-w R - rotate the windows counter-clockwise
CTRL-w x - exchange windows, horizontal
CTRL-w X - exchange windows, vertical
CTRL-w _ - maximize window height of current split
CTRL-w | - maximize window width of current split
CTRL-w = - normalize all split sizes
CTRL-w T - break out current window into new tab
:res[size] {num} - resize active horizontal window by {num} rows
:vert[ical] res[size] {num} - resize active vertical window by {num} columns
{buffer_id}CTRL-w ^ - split window and edit buffer {id}
:windo {cmd} - execute {cmd} for all windows
:windo difft[his] - start diff mode in all open windows
:windo diffo[ff] - stop diff mode for all open windows
:sf {file} - split window and :find {file}
:vert[ical] sf {file} - split window vertically and :find {file}
:tabe[dit] {file} - open {file} in a new tab
:tabnew {file} - open {file} in a new tab
:tabe[dit] % - open current buffer in a new tab
:tabs - list tabs
gt or :tabn[ext] - move to the next tab
gT or :tabp[rev] - move to the previous tab
:tabfir[st] - move to first tab
:tabl[ast] - move to last tab
{n}gt - move to tab number {n}
:tabmove {n} - move current tab to {n}th position (indexed from 0)
if no position provided, moves to last position
:tabc[lose] - close the current tab and all its windows
:tabo[nly] - close all tabs except for the current one
:tabd[o] {cmd} - execute {cmd} in each tab page
CTRL-o - jump to older cursor position
CTRL-i - jump to newer cursor position
:jumps - to display jump list
:clearjumps - clear the jump list
gf - edit file name under cursor
:changes - display change list
g; - jump to the previous (older) change
g, - jump to the next (newer) change
# commands that populate Quickfix list
:vim[grep] /pattern {file} - search using Vim's internal grep
:gr[ep] - search via external program specified by grepprg setting
:helpgr[ep] - search help text files
:mak[e] - call the program specified by the makeprg setting (default is make)
:cex[pr] {expression} - use {expression} to populate to list
:cex[pr] [] - replace quickfix list with empty list (clear quickfix list)
# vimgrep examples
:vim /foo/g % - search in current active buffer only
:vim /foo/g fo.txt ab.txt - search fo.txt and ab.txt for foo
:vim /foo/g *.txt - search *.txt for foo
:vim /foo/g **/* - search recursive current directory and below
:vim /foo/g **/*.txt - search recursive current directory and below in all *.txt file(s)
:vim /foo/g ## - search files in arglist
:vim /foo/gj ## - search files in arglist, do not jump to first match
:vim /foo/gf ## - search files in arglist, fuzzy match the pattern
# commands to use Quickfix list
:cw[indow] - open the quickfix window if it's not empty
:cope[n] - open quickfix window
:ccl[ose] - close quickfix window
:cn[ext], :cp[rev] - jump to next/previous error
:cc {n} - jump to quickfix entry {n}
:cnf[ile], :cpf[file] - jump to first error in the next/previous file
:cab[ove], :cbe[ow] - jump to the error above/below the current line
:col[der], :cnew[er] - go to the older/newer quickfix list
:chi[story] - Show the list of quickfix lists
:cfir[st], :cla[st] - go to first/last location
:cdo {cmd} - execute {cmd} in each valid entry in the quickfix list
:cdo %s/old/new/gc | update - replace "old" with "new" in each entry in the quickfix list and save
:cfdo {cmd} - execute {cmd} in each file in the quickfix list
:cfdo %s/old/new/gc | update - replace "old" with "new" in each file in the quickfix list and save
* - search for the exact word under the cursor
g* - search for partial matches of word under cursor
# - search for the exact word under the cursor (reverse)
g# - search for partial matches of word under cursor (reverse)
gd - go to local declaration of identifier under cursor
gD - go to global declaration of identifier under cursor
CTRL-] - jump to tag under cursor
gCTRL-] - prompt user to select from multiple matching tags
:t[ag] {tag} - jump to tag {tag}
:t[ag] {tag} {file} - jump to tag {tag} in file {file}
:t[ag] {tag} {file} {line} - jump to tag {tag} in file {file} at line {line}
:tj[ump] {keyword} - prompt user to select from matching tags for {keyword}
:CTRL-t - jump back in tag stack
:tn[ext] - jump to next matching tag
:tp[rev] - jump to previous matching tag
:tfirst - jump to first matching tag
:tlast - jump to last matching tag
:tselect - prompt user to select from matching tags
:g/pattern/# - list all lines matching pattern with line numbers
:g/pattern/{cmd} - executes {cmd} on all lines matching pattern
:g/pattern/m0 - move matching lines to the top of the file
:g/pattern/t$ - move matching lines to the end of the file
:g/pattern/d _ - delete all lines containing pattern without affecting registers (use blackhole register _ )
:g!/pattern/d or :v/pattern/d - delete all lines not matching pattern (inverse match)
q a q:g/pattern/y A - copy all lines matching a pattern to register 'a'.
:bufdo g/pattern/d - delete all lines matching 'pattern' in all buffers
:bufdo g/pattern/s/old/new/g - replace 'old' with 'new' on matching lines in all buffers
:argdo g/pattern/d | update - delete all lines matching 'pattern' in each file and save
:argdo g/pattern/s/old/new/g | update - replace 'old' with 'new' on matching lines in each file and save
:cdo g/pattern/d - delete all lines matching 'pattern' in all quickfix entries
:cdo g/pattern/s/old/new/g - replace 'old' with 'new' on matching lines in all quickfix entries
# Setting marks
m{a-z} - set a local mark {a-z} at the cursor position
m{A-Z} - set a global mark {A-Z} (accessible across files)
# Jumping to marks
'{a-z} - jump to the beginning of the line of local mark {a-z}
`{a-z} - jump to exact cursor position of local mark {a-z}
'{A-Z} - jump to line of global mark {A-Z} in its file
`{A-Z} - jump to exact position of global mark {A-Z} in its file
# Navigation shortcuts
'' - jump to position before last jump
# Viewing / deleting marks
:marks - display all current marks
:delmarks {a-zA-Z} - delete specified marks
:delmarks! - delete all global marks
# Examples
ma - set mark 'a' at cursor
`a - jump to mark 'a'