Quickref
Nvim :help pages, generated
from source
using the tree-sitter-vimdoc parser.
Quick reference guide
Contents
tag subject tag subject
Q_ct list of help files
Q_re Repeating commands
Q_lr motion: Left-right
Q_km Key mapping
Q_ud motion: Up-down
Q_ab Abbreviations
Q_tm motion: Text object
Q_op Options
Q_pa motion: Pattern searches
Q_ur Undo/Redo commands
Q_ma motion: Marks
Q_et External commands
Q_vm motion: Various
Q_qf Quickfix commands
Q_ta motion: Using tags
Q_vc Various commands
Q_sc Scrolling
Q_ce Ex: Command-line editing
Q_in insert: Inserting text
Q_ra Ex: Ranges
Q_ai insert: Keys
Q_ex Ex: Special characters
Q_ss insert: Special keys
Q_st Starting Vim
Q_di insert: Digraphs
Q_ed Editing a file
Q_si insert: Special inserts
Q_fl Using the argument list
Q_de change: Deleting text
Q_wq Writing and quitting
Q_cm change: Copying and moving
Q_ac Automatic commands
Q_ch change: Changing text
Q_wi Multi-window commands
Q_co change: Complex
Q_bu Buffer list commands
Q_vi Visual mode
Q_sy Syntax highlighting
Q_to Text objects
Q_gu GUI commands
Q_fo Folding
N is used to indicate an optional count that can be given before the command.
h N h left (also:
CTRL-H,
<BS>, or
<Left> key)
l N l right (also:
<Space> or
<Right> key)
0 0 to first character in the line (also:
<Home> key)
^ ^ to first non-blank character in the line
$ N $ to the next EOL (end of line) position
(also:
<End> key)
g0 g0 to first character in screen line (differs from "0"
when lines wrap)
g^ g^ to first non-blank character in screen line (differs
from "^" when lines wrap)
g$ N g$ to last character in screen line (differs from "$"
when lines wrap)
gm gm to middle of the screen line
gM gM to middle of the line
bar N | to column N (default: 1)
f N f{char} to the Nth occurrence of
{char} to the right
F N F{char} to the Nth occurrence of
{char} to the left
t N t{char} till before the Nth occurrence of
{char} to the right
T N T{char} till before the Nth occurrence of
{char} to the left
; N ; repeat the last "f", "F", "t", or "T" N times
, N , repeat the last "f", "F", "t", or "T" N times in
opposite direction
k N k up N lines (also:
CTRL-P and
<Up>)
j N j down N lines (also:
CTRL-J,
CTRL-N,
<NL>, and
<Down>)
- N - up N lines, on the first non-blank character
+ N + down N lines, on the first non-blank character (also:
CTRL-M and
<CR>)
_ N _ down N-1 lines, on the first non-blank character
G N G goto line N (default: last line), on the first
non-blank character
gg N gg goto line N (default: first line), on the first
non-blank character
N% N % goto line N percentage down in the file; N must be
given, otherwise it is the
% command
gk N gk up N screen lines (differs from "k" when line wraps)
gj N gj down N screen lines (differs from "j" when line wraps)
w N w N words forward
W N W N blank-separated
WORDs forward
e N e forward to the end of the Nth word
E N E forward to the end of the Nth blank-separated
WORD
b N b N words backward
B N B N blank-separated
WORDs backward
ge N ge backward to the end of the Nth word
gE N gE backward to the end of the Nth blank-separated
WORD
) N ) N sentences forward
( N ( N sentences backward
} N } N paragraphs forward
{ N { N paragraphs backward
]] N ]] N sections forward, at start of section
[[ N [[ N sections backward, at start of section
][ N ][ N sections forward, at end of section
[] N [] N sections backward, at end of section
[( N [( N times back to unclosed '('
[{ N [{ N times back to unclosed '{'
[m N [m N times back to start of method (for Java)
[M N [M N times back to end of method (for Java)
]) N ]) N times forward to unclosed ')'
]} N ]} N times forward to unclosed '}'
]m N ]m N times forward to start of method (for Java)
]M N ]M N times forward to end of method (for Java)
[# N [# N times back to unclosed "#if" or "#else"
]# N ]# N times forward to unclosed "#else" or "#endif"
[star N [* N times back to start of comment "/*"
]star N ]* N times forward to end of comment "*/"
/ N /{pattern}[/[offset]]<CR>
search forward for the Nth occurrence of
{pattern}
? N ?{pattern}[?[offset]]<CR>
search backward for the Nth occurrence of
{pattern}
/<CR> N /<CR> repeat last search, in the forward direction
?<CR> N ?<CR> repeat last search, in the backward direction
n N n repeat last search
N N N repeat last search, in opposite direction
star N * search forward for the identifier under the cursor
# N # search backward for the identifier under the cursor
gstar N g* like "*", but also find partial matches
g# N g# like "#", but also find partial matches
gd gd goto local declaration of identifier under the cursor
gD gD goto global declaration of identifier under the cursor
pattern Special characters in search patterns
| meaning | magic nomagic |
| matches any single character | . | \. |
| matches start of line | ^ | ^ |
matches <EOL> | $ | $ |
| matches start of word | \< | \< |
| matches end of word | \> | \> |
| matches a single char from the range | [a-z] | \[a-z] |
| matches a single char not in the range | [^a-z] | \[^a-z] |
| matches an identifier char | \i | \i |
| idem but excluding digits | \I | \I |
| matches a keyword character | \k | \k |
| idem but excluding digits | \K | \K |
| matches a file name character | \f | \f |
| idem but excluding digits | \F | \F |
| matches a printable character | \p | \p |
| idem but excluding digits | \P | \P |
| matches a white space character | \s | \s |
| matches a non-white space character | \S | \S |
matches <Esc> \e \e
matches <Tab> \t \t
matches <CR> \r \r
matches <BS> \b \b
matches 0 or more of the preceding atom * \*
matches 1 or more of the preceding atom \+ \+
matches 0 or 1 of the preceding atom \= \=
matches 2 to 5 of the preceding atom \{2,5} \{2,5}
separates two alternatives \| \|
group a pattern into an atom \(\) \(\)
[num] [num] lines downwards, in column 1
+[num] [num] lines downwards, in column 1
-[num] [num] lines upwards, in column 1
e[+num] [num] characters to the right of the end of the match
e[-num] [num] characters to the left of the end of the match
s[+num] [num] characters to the right of the start of the match
s[-num] [num] characters to the left of the start of the match
b[+num] [num] identical to s[+num] above (mnemonic: begin)
b[-num] [num] identical to s[-num] above (mnemonic: begin)
;{search-command} execute {search-command} next
m m{a-zA-Z} mark current position with mark
{a-zA-Z}
`a `{a-z} go to mark {a-z} within current file
`A `{A-Z} go to mark {A-Z} in any file
`0 `{0-9} go to the position where Vim was previously exited
`` `` go to the position before the last jump
`quote `" go to the position when last editing this file
`[ `[ go to the start of the previously operated or put text
`] `] go to the end of the previously operated or put text
`< `< go to the start of the (previous) Visual area
`> `> go to the end of the (previous) Visual area
`. `. go to the position of the last change in this file
' '{a-zA-Z0-9[]'"<>.}
same as `, but on the first non-blank in the line
:marks :marks print the active marks
CTRL-O N
CTRL-O go to Nth older position in jump list
CTRL-I N
CTRL-I go to Nth newer position in jump list
:ju :ju[mps] print the jump list
% % find the next brace, bracket, comment, or "#if"/
"#else"/"#endif" in this line and go to its match
H N H go to the Nth line in the window, on the first
non-blank
M M go to the middle line in the window, on the first
non-blank
L N L go to the Nth line from the bottom, on the first
non-blank
go N go go to Nth byte in the buffer
:go :[range]go[to] [off] go to [off] byte in the buffer
:ta :ta[g][!]
{tag} jump to tag
{tag}
:ta :[count]ta[g][!] jump to [count]'th newer tag in tag list
CTRL-] CTRL-] jump to the tag under cursor, unless changes
have been made
:ts :ts[elect][!] [tag] list matching tags and select one to jump to
:tjump :tj[ump][!] [tag] jump to tag [tag] or select from list when
there are multiple matches
:ltag :lt[ag][!] [tag] jump to tag [tag] and add matching tags to the
location list
:tags :tags print tag list
CTRL-T N
CTRL-T jump back from Nth older tag in tag list
:po :[count]po[p][!] jump back from [count]'th older tag in tag list
:tnext :[count]tn[ext][!] jump to [count]'th next matching tag
:tp :[count]tp[revious][!] jump to [count]'th previous matching tag
:tr :[count]tr[ewind][!] jump to [count]'th matching tag
:tl :tl[ast][!] jump to last matching tag
:ptag :pt[ag]
{tag} open a preview window to show tag
{tag}
CTRL-W_} CTRL-W } like
CTRL-] but show tag in preview window
:pts :pts[elect] like ":tselect" but show tag in preview window
:ptjump :ptj[ump] like ":tjump" but show tag in preview window
:pclose :pc[lose] close tag preview window
CTRL-W_z CTRL-W z close tag preview window
CTRL-E N
CTRL-E window N lines downwards (default: 1)
CTRL-D N
CTRL-D window N lines Downwards (default: 1/2 window)
CTRL-F N
CTRL-F window N pages Forwards (downwards)
CTRL-Y N
CTRL-Y window N lines upwards (default: 1)
CTRL-U N
CTRL-U window N lines Upwards (default: 1/2 window)
CTRL-B N
CTRL-B window N pages Backwards (upwards)
z<CR> z<CR> or zt redraw, current line at top of window
z. z. or zz redraw, current line at center of window
z- z- or zb redraw, current line at bottom of window
These only work when
'wrap' is off:
zh N zh scroll screen N characters to the right
zl N zl scroll screen N characters to the left
zH N zH scroll screen half a screenwidth to the right
zL N zL scroll screen half a screenwidth to the left
a N a append text after the cursor (N times)
A N A append text at the end of the line (N times)
i N i insert text before the cursor (N times) (also:
<Insert>)
I N I insert text before the first non-blank in the line (N times)
gI N gI insert text in column 1 (N times)
o N o open a new line below the current line, append text (N times)
O N O open a new line above the current line, append text (N times)
:startinsert :star[tinsert][!] start Insert mode, append when [!] used
:startreplace :startr[eplace][!] start Replace mode, at EOL when [!] used
in Visual block mode:
v_b_I I insert the same text in front of all the selected lines
v_b_A A append the same text after all the selected lines
leaving Insert mode:
i_<Esc> <Esc> end Insert mode, back to Normal mode
i_CTRL-C CTRL-C like
<Esc>, but do not use an abbreviation
i_CTRL-O CTRL-O {command} execute
{command} and return to Insert mode
moving around:
i_<Up> cursor keys move cursor left/right/up/down
i_<S-Left> shift-left/right one word left/right
i_<S-Up> shift-up/down one screenful backward/forward
i_<End> <End> cursor after last character in the line
i_<Home> <Home> cursor to first character in the line
Q_ss Special keys in Insert mode
i_CTRL-V CTRL-V {char}.. insert character literally, or enter decimal
byte value
i_<NL> <NL> or
<CR> or
CTRL-M or
CTRL-J
begin new line
i_CTRL-E CTRL-E insert the character from below the cursor
i_CTRL-Y CTRL-Y insert the character from above the cursor
i_CTRL-A CTRL-A insert previously inserted text
i_CTRL-@ CTRL-@ insert previously inserted text and stop
Insert mode
i_CTRL-R CTRL-R {register} insert the contents of a register
i_CTRL-N CTRL-N insert next match of identifier before the
cursor
i_CTRL-P CTRL-P insert previous match of identifier before
the cursor
i_CTRL-X CTRL-X ... complete the word before the cursor in
various ways
i_<BS> <BS> or
CTRL-H delete the character before the cursor
i_<Del> <Del> delete the character under the cursor
i_CTRL-W CTRL-W delete word before the cursor
i_CTRL-U CTRL-U delete all entered characters in the current
line
i_CTRL-T CTRL-T insert one shiftwidth of indent in front of
the current line
i_CTRL-D CTRL-D delete one shiftwidth of indent in front of
the current line
i_0_CTRL-D 0
CTRL-D delete all indent in the current line
i_^_CTRL-D ^
CTRL-D delete all indent in the current line,
restore indent in next line
:dig :dig[raphs] show current list of digraphs
:dig :dig[raphs]
{char1}{char2} {number} ...
add digraph(s) to the list
In Insert or Command-line mode:
i_CTRL-K CTRL-K {char1} {char2}
enter digraph
i_digraph {char1} <BS> {char2}
enter digraph if
'digraph' option set
:r :r [file] insert the contents of [file] below the cursor
:r! :r!
{command} insert the standard output of
{command} below the
cursor
x N x delete N characters under and after the cursor
<Del> N
<Del> delete N characters under and after the cursor
X N X delete N characters before the cursor
d N d{motion} delete the text that is moved over with
{motion}
v_d {visual}d delete the highlighted text
dd N dd delete N lines
D N D delete to the end of the line (and N-1 more lines)
J N J join N-1 lines (delete
<EOL>s)
v_J {visual}J join the highlighted lines
gJ N gJ like "J", but without inserting spaces
v_gJ {visual}gJ like "{visual}J", but without inserting spaces
:d :[range]d [x] delete [range] lines [into register x]
Q_cm Copying and moving text
quote "{char} use register
{char} for the next delete, yank, or put
:reg :reg show the contents of all registers
:reg :reg
{arg} show the contents of registers mentioned in
{arg}
y N y{motion} yank the text moved over with
{motion} into a register
v_y {visual}y yank the highlighted text into a register
yy N yy yank N lines into a register
Y N Y yank N lines into a register
Note: Mapped to "y$" by default.
default-mappings
p N p put a register after the cursor position (N times)
P N P put a register before the cursor position (N times)
]p N ]p like p, but adjust indent to current line
[p N [p like P, but adjust indent to current line
gp N gp like p, but leave cursor after the new text
gP N gP like P, but leave cursor after the new text
r N r{char} replace N characters with
{char}
gr N gr{char} replace N characters without affecting layout
R N R enter Replace mode (repeat the entered text N times)
gR N gR enter virtual Replace mode: Like Replace mode but
without affecting layout
v_b_r {visual}r{char}
in Visual block mode: Replace each char of the
selected text with
{char}
(change = delete text and enter Insert mode)
c N c{motion} change the text that is moved over with
{motion}
v_c {visual}c change the highlighted text
cc N cc change N lines
S N S change N lines
C N C change to the end of the line (and N-1 more lines)
s N s change N characters
v_b_c {visual}c in Visual block mode: Change each of the selected
lines with the entered text
v_b_C {visual}C in Visual block mode: Change each of the selected
lines until end-of-line with the entered text
~ N ~ switch case for N characters and advance cursor
v_~ {visual}~ switch case for highlighted text
v_u {visual}u make highlighted text lowercase
v_U {visual}U make highlighted text uppercase
g~ g~{motion} switch case for the text that is moved over with
{motion}
gu gu{motion} make the text that is moved over with
{motion}
lowercase
gU gU{motion} make the text that is moved over with
{motion}
uppercase
v_g? {visual}g? perform rot13 encoding on highlighted text
g? g?{motion} perform rot13 encoding on the text that is moved over
with
{motion}
CTRL-A N
CTRL-A add N to the number at or after the cursor
CTRL-X N
CTRL-X subtract N from the number at or after the cursor
< N <{motion} move the lines that are moved over with
{motion} one
shiftwidth left
<< N << move N lines one shiftwidth left
> N >
{motion} move the lines that are moved over with
{motion} one
shiftwidth right
>> N >> move N lines one shiftwidth right
gq N gq{motion} format the lines that are moved over with
{motion} to
'textwidth' length
:ce :[range]ce[nter] [width]
center the lines in [range]
:le :[range]le[ft] [indent]
left-align the lines in [range] (with [indent])
:ri :[range]ri[ght] [width]
right-align the lines in [range]
! N !{motion}{command}<CR>
filter the lines that are moved over through
{command}
!! N !!{command}<CR>
filter N lines through
{command}
v_! {visual}!{command}<CR>
filter the highlighted lines through
{command}
:range! :[range]!
{command}<CR>
filter [range] lines through
{command}
= N ={motion}
filter the lines that are moved over through
'equalprg'
== N == filter N lines through
'equalprg'
v_= {visual}=
filter the highlighted lines through
'equalprg'
:s :[range]s[ubstitute]/{pattern}/{string}/[g][c]
substitute
{pattern} by
{string} in [range] lines;
with [g], replace all occurrences of
{pattern};
with [c], confirm each replacement
:s :[range]s[ubstitute] [g][c]
repeat previous ":s" with new range and options
& & Repeat previous ":s" on current line without options
:ret :[range]ret[ab][!] [tabstop]
set
'tabstop' to new value and adjust white space
accordingly
v v start highlighting characters } move cursor and use
V V start highlighting linewise } operator to affect
CTRL-V CTRL-V start highlighting blockwise } highlighted text
v_o o exchange cursor position with start of highlighting
gv gv start highlighting on previous visual area
v_v v highlight characters or stop highlighting
v_V V highlight linewise or stop highlighting
v_CTRL-V CTRL-V highlight blockwise or stop highlighting
Q_to Text objects (only in Visual mode or after an operator)
v_aw N aw Select "a word"
v_iw N iw Select "inner word"
v_aW N aW Select "a
WORD"
v_iW N iW Select "inner
WORD"
v_as N as Select "a sentence"
v_is N is Select "inner sentence"
v_ap N ap Select "a paragraph"
v_ip N ip Select "inner paragraph"
v_al al Select all lines
v_il il Select "inner line"
v_ab N ab Select "a block" (from "[(" to "])")
v_ib N ib Select "inner block" (from "[(" to "])")
v_aB N aB Select "a Block" (from
[{ to
]})
v_iB N iB Select "inner Block" (from
[{ to
]})
v_a> N a> Select "a <> block"
v_i> N i> Select "inner <> block"
v_at N at Select "a tag block" (from
<aaa> to </aaa>)
v_it N it Select "inner tag block" (from
<aaa> to </aaa>)
v_a' N a' Select "a single quoted string"
v_i' N i' Select "inner single quoted string"
v_aquote N a" Select "a double quoted string"
v_iquote N i" Select "inner double quoted string"
v_a` N a` Select "a backward quoted string"
v_i` N i` Select "inner backward quoted string"
. N . repeat last change (with count replaced with N)
q q{a-z} record typed characters into register
{a-z}
q q{A-Z} record typed characters, appended to register
{a-z}
q q stop recording
Q Q replay last recorded macro
@ N @{a-z} execute the contents of register
{a-z} (N times)
@@ N @@ repeat previous @{a-z} (N times)
:@ :@{a-z} execute the contents of register
{a-z} as an Ex
command
:@@ :@@ repeat previous :@{a-z}
:g :[range]g[lobal]/{pattern}/[cmd]
execute Ex command [cmd] (default: ":p") on the lines
within [range] where
{pattern} matches
:g :[range]g[lobal]!/{pattern}/[cmd]
execute Ex command [cmd] (default: ":p") on the lines
within [range] where
{pattern} does NOT match
:so :so[urce]
{file}
read Ex commands from
{file}
:so :so[urce]!
{file}
read Vim commands from
{file}
:sl :sl[eep] [sec]
don't do anything for [sec] seconds
gs N gs goto Sleep for N seconds
:map :ma[p]
{lhs} {rhs} map
{lhs} to
{rhs} in Normal and Visual mode
:map! :ma[p]!
{lhs} {rhs} map
{lhs} to
{rhs} in Insert and Command-line
mode
:noremap :no[remap][!]
{lhs} {rhs}
same as ":map", no remapping for this
{rhs}
:unmap :unm[ap]
{lhs} remove the mapping of
{lhs} for Normal and
Visual mode
:unmap! :unm[ap]!
{lhs} remove the mapping of
{lhs} for Insert and
Command-line mode
:map_l :ma[p] [lhs] list mappings (starting with [lhs]) for
Normal and Visual mode
:map_l! :ma[p]! [lhs] list mappings (starting with [lhs]) for
Insert and Command-line mode
:cmap :cmap/:cunmap/:cnoremap
like ":map!"/":unmap!"/":noremap!" but for
Command-line mode only
:imap :imap/:iunmap/:inoremap
like ":map!"/":unmap!"/":noremap!" but for
Insert mode only
:nmap :nmap/:nunmap/:nnoremap
like ":map"/":unmap"/":noremap" but for
Normal mode only
:vmap :vmap/:vunmap/:vnoremap
like ":map"/":unmap"/":noremap" but for
Visual mode only
:omap :omap/:ounmap/:onoremap
like ":map"/":unmap"/":noremap" but only for
when an operator is pending
:mapc :mapc[lear] remove mappings for Normal and Visual mode
:mapc :mapc[lear]! remove mappings for Insert and Cmdline mode
:imapc :imapc[lear] remove mappings for Insert mode
:vmapc :vmapc[lear] remove mappings for Visual mode
:omapc :omapc[lear] remove mappings for Operator-pending mode
:nmapc :nmapc[lear] remove mappings for Normal mode
:cmapc :cmapc[lear] remove mappings for Cmdline mode
:mkexrc :mk[exrc][!] [file] write current mappings, abbreviations, and
settings to [file] (default: ".exrc";
use ! to overwrite)
:mkvimrc :mkv[imrc][!] [file]
same as :mkexrc, but with default ".nvimrc"
:mksession :mks[ession][!] [file]
like ":mkvimrc", but store current files,
windows, etc. too, to be able to continue
this session later
:abbreviate :ab[breviate]
{lhs} {rhs} add abbreviation for
{lhs} to
{rhs}
:abbreviate :ab[breviate]
{lhs} show abbr's that start with
{lhs}
:abbreviate :ab[breviate] show all abbreviations
:unabbreviate :una[bbreviate]
{lhs} remove abbreviation for
{lhs}
:noreabbrev :norea[bbrev] [lhs] [rhs] like ":ab", but don't remap [rhs]
:iabbrev :iab/:iunab/:inoreab like ":ab", but only for Insert mode
:cabbrev :cab/:cunab/:cnoreab like ":ab", but only for
Command-line mode
:abclear :abc[lear] remove all abbreviations
:cabclear :cabc[lear] remove all abbr's for Cmdline mode
:iabclear :iabc[lear] remove all abbr's for Insert mode
:set :se[t] show all modified options
:set :se[t] all show all options
:set :se[t]
{option} set boolean option (switch it on),
show string or number option
:set :se[t] no{option} reset boolean option (switch it off)
:set :se[t] inv{option} invert boolean option
:set :se[t]
{option}={value} set string/number option to
{value}
:set :se[t]
{option}+={value} append
{value} to string option, add
{value} to number option
:set :se[t]
{option}-={value} remove
{value} to string option,
subtract
{value} from number option
:set :se[t]
{option}? show value of
{option}
:set :se[t]
{option}& reset
{option} to its default value
:setlocal :setl[ocal] like ":set" but set the local value
for options that have one
:setglobal :setg[lobal] like ":set" but set the global value
of a local option
:options :opt[ions] open a new window to view and set
options, grouped by functionality,
a one line explanation and links to
the help
u N u undo last N changes
CTRL-R N
CTRL-R redo last N undone changes
U U restore last changed line
:! :!{command} execute
{command} with a shell
K K lookup keyword under the cursor with
'keywordprg' program (default: "man")
:cc :cc [nr] display error [nr] (default is the same again)
:cnext :cn display the next error
:cprevious :cp display the previous error
:clist :cl list all errors
:cfile :cf read errors from the file
'errorfile'
:cgetbuffer :cgetb like :cbuffer but don't jump to the first error
:cgetfile :cg like :cfile but don't jump to the first error
:cgetexpr :cgete like :cexpr but don't jump to the first error
:caddfile :caddf add errors from the error file to the current
quickfix list
:caddexpr :cad add errors from an expression to the current
quickfix list
:cbuffer :cb read errors from text in a buffer
:cexpr :cex read errors from an expression
:cquit :cq quit without writing and return error code (to
the compiler)
:make :make [args] start make, read errors, and jump to first
error
:grep :gr[ep] [args] execute
'grepprg' to find matches and jump to
the first one
CTRL-L CTRL-L clear and redraw the screen
CTRL-G CTRL-G show current file name (with path) and cursor
position
ga ga show ascii value of character under cursor in
decimal, hex, and octal
g8 g8 for utf-8 encoding: show byte sequence for
character under cursor in hex
g_CTRL-G g
CTRL-G show cursor column, line, and character
position
CTRL-C CTRL-C during searches: Interrupt the search
<Del> <Del> while entering a count: delete last character
:version :ve[rsion] show version information
:normal :norm[al][!]
{commands}
execute Normal mode commands
:exmode 1q: switch to
Ex-mode
:redir :redir >
{file} redirect messages to
{file}
:silent :silent[!]
{command} execute
{command} silently
:confirm :confirm
{command} quit, write, etc., asking about
unsaved changes or read-only files
:browse :browse
{command} open/read/write file, using a
file selection dialog
Q_ce Command-line editing
c_CTRL-V CTRL-V {char} insert
{char} literally
c_CTRL-V CTRL-V {number} enter decimal value of character (up to
three digits)
c_CTRL-K CTRL-K {char1} {char2}
enter digraph (See
Q_di)
c_CTRL-R CTRL-R {register} insert the contents of a register
c_<Left> <Left>/<Right> cursor left/right
c_<S-Left> <S-Left>/<S-Right> cursor one word left/right
c_CTRL-B CTRL-B/CTRL-E cursor to beginning/end of command-line
c_<BS> <BS> delete the character in front of the cursor
c_<Del> <Del> delete the character under the cursor
c_CTRL-W CTRL-W delete the word in front of the cursor
c_CTRL-U CTRL-U remove all characters between the cursor
and beginning of command-line
c_<Up> <Up>/<Down> recall older/newer command-line that starts
with current command
c_<S-Up> <S-Up>/<S-Down> recall older/newer command-line from history
c_CTRL-G CTRL-G next match when
'incsearch' is active
c_CTRL-T CTRL-T previous match when
'incsearch' is active
:history :his[tory] show older command-lines
Context-sensitive completion on the command-line:
c_wildchar 'wildchar' (default:
<Tab>)
do completion on the pattern in front of the
cursor; if there are multiple matches,
beep and show the first one; further
'wildchar' will show the next ones
c_CTRL-D CTRL-D list all names that match the pattern in
front of the cursor
c_CTRL-A CTRL-A insert all names that match pattern in front
of cursor
c_CTRL-L CTRL-L insert longest common part of names that
match pattern
c_CTRL-N CTRL-N after
'wildchar' with multiple matches: go
to next match
c_CTRL-P CTRL-P after
'wildchar' with multiple matches: go
to previous match
:range , separates two line numbers
:range ; idem, set cursor to the first line number
before interpreting the second one
:range {number} an absolute line number
:range . the current line
:range $ the last line in the file
:range % equal to 1,$ (the entire file)
:range * equal to '<,'> (visual area)
:range 't position of mark t
:range /{pattern}[/] the next line where
{pattern} matches
:range ?{pattern}[?] the previous line where
{pattern} matches
:range +[num] add [num] to the preceding line number
(default: 1)
:range -[num] subtract [num] from the preceding line
number (default: 1)
Q_ex Special Ex characters
:bar | separates two commands (not for ":global" and ":!")
:quote " begins comment
:_% % current file name (only where a file name is expected)
:_# #[num] alternate file name [num] (only where a file name is
expected)
Note: The next seven are typed literally; these are not special keys!
:<abuf> <abuf> buffer number, for use in an autocommand (only where a
file name is expected)
:<afile> <afile> file name, for use in an autocommand (only where a
file name is expected)
:<amatch> <amatch> what matched with the pattern, for use in an
autocommand (only where a file name is expected)
:<cword> <cword> word under the cursor (only where a file name is
expected)
:<cWORD> <cWORD> WORD under the cursor (only where a file name is
expected) (see
WORD)
:<cfile> <cfile> file name under the cursor (only where a file name is
expected)
:<script> <script> file name of a ":source"d file, within that file (only
where a file name is expected)
After "%", "#", "<cfile>", "<script>" or "<afile>"
::p :p full path
::h :h head (file name removed)
::t :t tail (file name only)
::r :r root (extension removed)
::e :e extension
::s :s/{pat}/{repl}/ substitute
{pat} with
{repl}
-file vim [options]
{file} .. start editing one or more files
-- vim [options] - read file from stdin
-tag vim [options] -t
{tag} edit the file associated with
{tag}
-qf vim [options] -q [fname] start editing in QuickFix mode,
display the first error
-+ +[num] put the cursor at line [num] (default: last line)
-+c +{command} execute
{command} after loading the file
-+/ +/{pat}
{file} .. put the cursor at the first occurrence of
{pat}
-e -e
Ex-mode
-R -R Read-only mode, implies -n
-m -m modifications not allowed (resets
'write' option)
-d -d
diff-mode
-b -b binary mode
-l -l lisp mode
-A -A Arabic mode (
'arabic' is set)
-H -H Hebrew mode (Hebrew keymap &
'rightleft' are set)
-V -V Verbose, give informative messages
-r -r give list of swap files
-r -r
{file} .. recover aborted edit session
-n -n do not create a swap file
-o -o [num] open [num] windows (default: one for each file)
-s -s
{scriptin} first read commands from the file
{scriptin}
-w -w
{scriptout} write typed chars to file
{scriptout} (append)
-W -W
{scriptout} write typed chars to file
{scriptout} (overwrite)
-u -u
{vimrc} read inits from
{vimrc} instead of other inits
-i -i
{shada} read info from
{shada} instead of other files
--- -- end of options, other arguments are file names
--help --help show list of arguments and exit
--version --version show version info and exit
-- - read file from stdin
Without !: Fail if changes have been made to the current buffer.
With !: Discard any changes to the current buffer.
:edit_f :e[dit][!]
{file} edit
{file}
:edit :e[dit][!] reload the current file
:enew :ene[w][!] edit a new, unnamed buffer
:find :fin[d][!]
{file} find
{file} in
'path' and edit it
CTRL-^ N
CTRL-^ edit alternate file N (equivalent to ":e #N")
gf gf or ]f edit the file whose name is under the cursor
:pwd :pwd print the current directory name
:cd :cd [path] change the current directory to [path]
:cd- :cd - back to previous current directory
:file :f[ile] print the current file name and the cursor
position
:file :f[ile]
{name} set the current file name to
{name}
:files :files show alternate file names
:args :ar[gs] print the argument list, with the current file
in "[]"
:all :all or :sall open a window for every file in the arg list
:wn :wn[ext][!] write file and edit next file
:wn :wn[ext][!]
{file} write to
{file} and edit next file, unless
{file} exists; With !, overwrite existing
file
:wN :wN[ext][!] [file] write file and edit previous file
| in current window | in new window | action |
| :argument :argu[ment] N | :sar[gument] N | edit file N |
| :next :n[ext] | :sn[ext] | edit next file |
:next_f :n[ext] {arglist} | :sn[ext] {arglist} | define new arg list and edit first file |
| :Next :N[ext] | :sN[ext] | edit previous file |
| :first :fir[st] | :sfir[st] | edit first file |
| :last :la[st] | :sla[st] | edit last file |
Q_wq Writing and quitting
:w :[range]w[rite][!] write to the current file
:w_f :[range]w[rite]
{file} write to
{file}, unless it already
exists
:w_f :[range]w[rite]!
{file} write to
{file}. Overwrite an existing
file
:w_a :[range]w[rite][!] >> append to the current file
:w_a :[range]w[rite][!] >>
{file} append to
{file}
:w_c :[range]w[rite] !{cmd} execute
{cmd} with [range] lines as
standard input
:up :[range]up[date][!] write to current file if modified
:wall :wa[ll][!] write all changed buffers
:q :q[uit] quit current buffer, unless changes have been
made; Exit Vim when there are no other
non-help buffers
:q :q[uit]! quit current buffer always, discard any
changes. Exit Vim when there are no other
non-help buffers
:qa :qa[ll] exit Vim, unless changes have been made
:qa :qa[ll]! exit Vim always, discard any changes
:cq :cq quit without writing and return error code
:wq :wq[!] write the current file and exit
:wq :wq[!]
{file} write to
{file} and exit
:xit :x[it][!] [file] like ":wq" but write only when changes have
been made
ZZ ZZ same as ":x"
ZQ ZQ same as ":q!"
:xall :xa[ll][!] or :wqall[!]
write all changed buffers and exit
:stop :st[op][!] suspend Vim or start new shell; if
'aw' option
is set and [!] not given write the buffer
CTRL-Z CTRL-Z same as ":stop"
shada-file read registers, marks, history at startup, save when exiting.
:rshada :rsh[ada] [file] read info from ShaDa file [file]
:rshada :rsh[ada]! [file] idem, overwrite existing info
:wshada :wsh[ada] [file] add info to ShaDa file [file]
:wshada :wsh[ada]! [file] write info to ShaDa file [file]
modeline Automatic option setting when editing a file
modeline vim:{set-arg}: .. In the first and last lines of the
file (see
'ml' option),
{set-arg} is
given as an argument to ":set"
autocommand Automatic execution of commands on certain events.
:autocmd :au list all autocommands
:autocmd :au
{event} list all autocommands for
{event}
:autocmd :au
{event} {pat} list all autocommands for
{event}
with
{pat}
:autocmd :au
{event} {pat} {cmd} enter new autocommands for
{event}
with
{pat}
:autocmd :au! remove all autocommands
:autocmd :au!
{event} remove all autocommands for
{event}
:autocmd :au! *
{pat} remove all autocommands for
{pat}
:autocmd :au!
{event} {pat} remove all autocommands for
{event}
with
{pat}
:autocmd :au!
{event} {pat} {cmd} remove all autocommands for
{event}
with
{pat} and enter new one
Q_wi Multi-window commands
CTRL-W_s CTRL-W s or :split split window into two parts
:split_f :split
{file} split window and edit
{file} in one of
them
:vsplit :vsplit
{file} same, but split vertically
:vertical :vertical
{cmd} make
{cmd} split vertically
:sfind :sf[ind]
{file} split window, find
{file} in
'path'
and edit it
:terminal :terminal
{cmd} open a terminal window
CTRL-W_] CTRL-W ] split window and jump to tag under
cursor
CTRL-W_f CTRL-W f split window and edit file name under
the cursor
CTRL-W_^ CTRL-W ^ split window and edit alternate file
CTRL-W_n CTRL-W n or :new create new empty window
CTRL-W_q CTRL-W q or :q[uit] quit editing and close window
CTRL-W_c CTRL-W c or :clo[se] make buffer hidden and close window
CTRL-W_o CTRL-W o or :on[ly] make current window only one on the
screen
CTRL-W_j CTRL-W j move cursor to window below
CTRL-W_k CTRL-W k move cursor to window above
CTRL-W_CTRL-W CTRL-W CTRL-W move cursor to window below (wrap)
CTRL-W_W CTRL-W W move cursor to window above (wrap)
CTRL-W_t CTRL-W t move cursor to top window
CTRL-W_b CTRL-W b move cursor to bottom window
CTRL-W_p CTRL-W p move cursor to previous active window
CTRL-W_r CTRL-W r rotate windows downwards
CTRL-W_R CTRL-W R rotate windows upwards
CTRL-W_x CTRL-W x exchange current window with next one
CTRL-W_= CTRL-W = make all windows equal height & width
CTRL-W_- CTRL-W - decrease current window height
CTRL-W_+ CTRL-W + increase current window height
CTRL-W__ CTRL-W _ set current window height (default:
very high)
CTRL-W_< CTRL-W < decrease current window width
CTRL-W_> CTRL-W > increase current window width
CTRL-W_bar CTRL-W | set current window width (default:
widest possible)
Q_bu Buffer list commands
:buffers :buffers or :files list all known buffer and file names
:ball :ball or :sball edit all args/buffers
:unhide :unhide or :sunhide edit all loaded buffers
:badd :badd
{fname} add file name
{fname} to the list
:bunload :bunload[!] [N] unload buffer [N] from memory
:bdelete :bdelete[!] [N] unload buffer [N] and delete it from
the buffer list
in current window in new window
:buffer :[N]buffer [N] :[N]sbuffer [N] to arg/buf N
:bnext :[N]bnext [N] :[N]sbnext [N] to Nth next arg/buf
:bNext :[N]bNext [N] :[N]sbNext [N] to Nth previous arg/buf
:bprevious :[N]bprevious [N] :[N]sbprevious [N] to Nth previous arg/buf
:bfirst :bfirst :sbfirst to first arg/buf
:blast :blast :sblast to last arg/buf
:bmodified :[N]bmod [N] :[N]sbmod [N] to Nth modified buf
:syn-on :syntax on start using syntax highlighting
:syn-off :syntax off stop using syntax highlighting
:syn-keyword :syntax keyword
{group-name} {keyword} ..
add a syntax keyword item
:syn-match :syntax match
{group-name} {pattern} ...
add syntax match item
:syn-region :syntax region
{group-name} {pattern} ...
add syntax region item
:syn-sync :syntax sync [ccomment | lines
{N} | ...]
tell syntax how to sync
:syntax :syntax [list] list current syntax items
:syn-clear :syntax clear clear all syntax info
:highlight :highlight clear clear all highlight info
:highlight :highlight
{group-name} {key}={arg} ..
set highlighting for
{group-name}
:filetype :filetype on switch on file type detection, without
syntax highlighting
:filetype :filetype plugin indent on
switch on file type detection, with
automatic indenting and settings
:menu :menu list all menus
:menu :menu
{mpath} list menus starting with
{mpath}
:menu :menu
{mpath} {rhs} add menu
{mpath}, giving
{rhs}
:menu :menu
{pri} {mpath} {rhs}
idem, with priorities
{pri}
:menu :menu ToolBar.
{name} {rhs}
add toolbar item, giving
{rhs}
:tmenu :tmenu
{mpath} {text} add tooltip to menu
{mpath}
:unmenu :unmenu
{mpath} remove menu
{mpath}
'foldmethod' set foldmethod=manual manual folding
set foldmethod=indent folding by indent
set foldmethod=expr folding by
'foldexpr'
set foldmethod=syntax folding by syntax regions
set foldmethod=marker folding by
'foldmarker'
zf zf{motion} operator: Define a fold manually
:fold :{range}fold define a fold for
{range} lines
zd zd delete one fold under the cursor
zD zD delete all folds under the cursor
zo zo open one fold under the cursor
zO zO open all folds under the cursor
zc zc close one fold under the cursor
zC zC close all folds under the cursor