supported_vim_keybindings.md

April 2, 2026 ยท View on GitHub

Key

:white_check_mark: - command done

:white_check_mark: :star: - command done with specific customization

:warning: - some variations of the command are not supported

:running: - work in progress

:arrow_down: - command is low priority; open an issue (or thumbs up the relevant issue) if you want to see it sooner

:x: - command impossible

:1234: - command accepts numeric prefix

Left-right motions

StatusCommandDescriptionNote
:white_check_mark::1234: hleft (also: BS, or Left key)
:white_check_mark::1234: lright (also: Space or Right key)
:white_check_mark:0to first character in the line (also: Home key)
:white_check_mark:^to first non-blank character in the line
:white_check_mark::1234: $to the last character in the line (N-1 lines lower) (also: End key)
:white_check_mark: :star:g0to first character in screen line (differs from "0" when lines wrap)Same as 0
:white_check_mark: :star:g^to first non-blank character in screen line (differs from "^" when lines wrap)Same as ^
:white_check_mark: :star::1234: g$to last character in screen line (differs from "$" when lines wrap)Same as $
:white_check_mark:gmto middle of the screen line
:white_check_mark::1234: |to column N (default: 1)
:running::1234: f{char}to the Nth occurrence of {char} to the right
:running::1234: F{char}to the Nth occurrence of {char} to the left
:running::1234: t{char}till before the Nth occurrence of {char} to the right
:running::1234: T{char}till before the Nth occurrence of {char} to the left
:running::1234: ;repeat the last "f", "F", "t", or "T" N times
:running::1234: ,repeat the last "f", "F", "t", or "T" N times in opposite direction

Up-down motions

StatusCommandDescriptionNote
:white_check_mark::1234: kup N lines (also: CTRL-P and Up)
:white_check_mark::1234: jdown N lines (also: CTRL-J, CTRL-N, NL, and Down)
:white_check_mark::1234: -up N lines, on the first non-blank character
:white_check_mark::1234: +down N lines, on the first non-blank character (also: CTRL-M and CR)
:white_check_mark::1234: _down N-1 lines, on the first non-blank character
:white_check_mark::1234: Ggoto line N (default: last line), on the first non-blank character
:white_check_mark::1234: gggoto line N (default: first line), on the first non-blank character
:white_check_mark::1234: %goto line N percentage down in the file; N must be given, otherwise it is the % command
:white_check_mark: :star::1234: gkup N screen lines (differs from "k" when line wraps)Same as k
:white_check_mark: :star::1234: gjdown N screen lines (differs from "j" when line wraps)Same as j

Text object motions

StatusCommandDescription
:white_check_mark::1234: wN words forward
:white_check_mark::1234: WN blank-separated WORDs forward
:white_check_mark::1234: eN words forward to the end of the Nth word
:white_check_mark::1234: EN words forward to the end of the Nth blank-separated WORD
:white_check_mark::1234: bN words backward
:white_check_mark::1234: BN blank-separated WORDs backward
:white_check_mark::1234: geN words backward to the end of the Nth word
:white_check_mark::1234: gEN words backward to the end of the Nth blank-separated WORD
:running::1234: )N sentences forward
:running::1234: (N sentences backward
:white_check_mark::1234: }N paragraphs forward
:white_check_mark::1234: {N paragraphs backward
:running::1234: ]]N sections forward, at start of section
:running::1234: [[N sections backward, at start of section
:running::1234: ][N sections forward, at end of section
:running::1234: []N sections backward, at end of section
:running::1234: [(N times back to unclosed '('
:running::1234: [{N times back to unclosed '{'
:arrow_down::1234: [mN times back to start of method (for Java)
:arrow_down::1234: [MN times back to end of method (for Java)
:running::1234: ])N times forward to unclosed ')'
:running::1234: ]}N times forward to unclosed '}'
:arrow_down::1234: ]mN times forward to start of method (for Java)
:arrow_down::1234: ]MN times forward to end of method (for Java)
:arrow_down::1234: [#N times back to unclosed "#if" or "#else"
:arrow_down::1234: ]#N times forward to unclosed "#else" or "#endif"
:arrow_down::1234: [*N times back to start of a C comment "/*"
:arrow_down::1234: ]*N times forward to end of a C comment "*/"

Pattern searches

StatusCommandDescriptionNote
:running::1234: /{pattern}[/[offset]]<CR>search forward for the Nth occurrence of {pattern}
:running::1234: ?{pattern}[?[offset]]<CR>search backward for the Nth occurrence of {pattern}
:running::1234: /<CR>repeat last search, in the forward direction
:running::1234: ?<CR>repeat last search, in the backward direction
:running::1234: nrepeat last search
:running::1234: Nrepeat last search, in opposite direction
:running::1234: *search forward for the identifier under the cursor
:running::1234: #search backward for the identifier under the cursor
:running::1234: g*like "*", but also find partial matches
:running::1234: g#like "#", but also find partial matches
:running:gdgoto local declaration of identifier under the cursor
:arrow_down:gDgoto global declaration of identifier under the cursor

Marks and motions

StatusCommandDescription
:running:m{a-zA-Z}mark current position with mark {a-zA-Z}
:running:`{a-z}go to mark {a-z} within current file
:running:`{A-Z}go to mark {A-Z} in any file
:running:`{0-9}go to the position where Vim was previously exited
:running:`go to the position before the last jump
:arrow_down:`"go to the position when last editing this file
:running:`[go to the start of the previously operated or put text
:running:'[go to the start of the previously operated or put text
:running:`]go to the end of the previously operated or put text
:running:']go to the end of the previously operated or put text
:arrow_down:`<go to the start of the (previous) Visual area
:arrow_down:`>go to the end of the (previous) Visual area
:running:`.go to the position of the last change in this file
:running:'.go to the position of the last change in this file
:arrow_down:'{a-zA-Z0-9[]'"<>.}same as `, but on the first non-blank in the line
:arrow_down::marksprint the active marks
:running::1234: CTRL-Ogo to Nth older position in jump list
:running::1234: CTRL-Igo to Nth newer position in jump list
:arrow_down::ju[mps]print the jump list

Various motions

StatusCommandDescription
:running:%find the next brace, bracket, comment, or "#if"/ "#else"/"#endif" in this line and go to its match
:running::1234: Hgo to the Nth line in the window, on the first non-blank
:running:Mgo to the middle line in the window, on the first non-blank
:running::1234: Lgo to the Nth line from the bottom, on the first non-blank
:arrow_down::1234: gogo to Nth byte in the buffer
:arrow_down::[range]go[to][off]go to [off] byte in the buffer

Using tags

StatusCommandDescription
:arrow_down::ta[g][!] {tag}jump to tag {tag}
:arrow_down::[count]ta[g][!]jump to [count]'th newer tag in tag list
:arrow_down:CTRL-]jump to the tag under cursor, unless changes have been made
:arrow_down::ts[elect][!] [tag]list matching tags and select one to jump to
:arrow_down::tj[ump][!] [tag]jump to tag [tag] or select from list when there are multiple matches
:arrow_down::lt[ag][!] [tag]jump to tag [tag] and add matching tags to the location list
:arrow_down::tagsaprint tag list
:arrow_down::1234: CTRL-Tjump back from Nth older tag in tag list
:arrow_down::[count]po[p][!]jump back from [count]'th older tag in tag list
:arrow_down::[count]tn[ext][!]jump to [count]'th next matching tag
:arrow_down::[count]tp[revious][!]jump to [count]'th previous matching tag
:arrow_down::[count]tr[ewind][!]jump to [count]'th matching tag
:arrow_down::tl[ast][!]jump to last matching tag
:arrow_down::pt[ag] {tag}open a preview window to show tag {tag}
:arrow_down:CTRL-W }like CTRL-] but show tag in preview window
:arrow_down::pts[elect]like ":tselect" but show tag in preview window
:arrow_down::ptj[ump]like ":tjump" but show tag in preview window
:arrow_down::pc[lose]close tag preview window
:arrow_down:CTRL-W zclose tag preview window

Scrolling

StatusCommandDescription
:white_check_mark::1234: CTRL-Ewindow N lines downwards (default: 1)
:white_check_mark::1234: CTRL-Dwindow N lines Downwards (default: 1/2 window)
:white_check_mark::1234: CTRL-Fwindow N pages Forwards (downwards)
:white_check_mark::1234: CTRL-Ywindow N lines upwards (default: 1)
:white_check_mark::1234: CTRL-Uwindow N lines Upwards (default: 1/2 window)
:white_check_mark::1234: CTRL-Bwindow N pages Backwards (upwards)
:white_check_mark:z CR or ztredraw, current line at top of window
:white_check_mark:z. or zzredraw, current line at center of window
:white_check_mark:z- or zbredraw, current line at bottom of window

These only work when 'wrap' is off:

StatusCommandDescriptionNote
:running::1234: zhscroll screen N characters to the right
:running::1234: zlscroll screen N characters to the left
:running::1234: zHscroll screen half a screenwidth to the right
:running::1234: zLscroll screen half a screenwidth to the left

Inserting text

StatusCommandDescription
:white_check_mark:aappend text after the cursor
:white_check_mark:Aappend text at the end of the line
:white_check_mark:iswitch to insert mode
:white_check_mark:Iswitch to insert mode before the first non-blank in the line
:white_check_mark:gIinsert text in column 1
:running:giinsert at the end of the last change
:white_check_mark:oopen a new line below the current line, append text
:white_check_mark:Oopen a new line above the current line, append text

Insert mode keys

leaving Insert mode:

StatusCommandDescription
:white_check_mark:Escend Insert mode, back to Normal mode
:white_check_mark:CTRL-Clike Esc, but do not use an abbreviation
:running:CTRL-O {command}execute {command} and return to Insert mode

moving around:

StatusCommandDescription
:white_check_mark:cursor keysmove cursor left/right/up/down
:white_check_mark:shift-left/rightone word left/right
:white_check_mark:shift-up/downone screenful backward/forward
:white_check_mark:Endcursor after last character in the line
:white_check_mark:Homecursor to first character in the line

Special keys in Insert mode

StatusCommandDescriptionNote
:arrow_down:CTRL-V {char}..insert character literally, or enter decimal byte value
:white_check_mark:NL or CR or CTRL-M or CTRL-Jbegin new line
:arrow_down:CTRL-Einsert the character from below the cursor
:arrow_down:CTRL-Yinsert the character from above the cursor
:arrow_down:CTRL-Ainsert previously inserted text
:arrow_down:CTRL-@insert previously inserted text and stop Insert mode
:white_check_mark:CTRL-R {0-9a-z%#:.-="}insert the contents of a register
:arrow_down:CTRL-Ninsert next match of identifier before the cursor
:arrow_down:CTRL-Pinsert previous match of identifier before the cursor
:arrow_down:CTRL-X ...complete the word before the cursor in various ways
:white_check_mark:BS or CTRL-Hdelete the character before the cursor
:white_check_mark:Deldelete the character under the cursor
:white_check_mark:CTRL-Wdelete word before the cursor
:white_check_mark:CTRL-Udelete all entered characters in the current line
:white_check_mark:CTRL-Tinsert one shiftwidth of indent in front of the current line
:white_check_mark:CTRL-Ddelete one shiftwidth of indent in front of the current line
:arrow_down:0 CTRL-Ddelete all indent in the current line
:arrow_down:^ CTRL-Ddelete all indent in the current line, restore indent in next line

Digraphs

StatusCommandDescription
:arrow_down::dig[raphs]show current list of digraphs
:arrow_down::dig[raphs] {char1}{char2} {number} ...add digraph(s) to the list

Special inserts

StatusCommandDescription
:arrow_down::r [file]insert the contents of [file] below the cursor
:arrow_down::r! {command}insert the standard output of {command} below the cursor

Deleting text

StatusCommandDescription
:white_check_mark::1234: xdelete N characters under and after the cursor
:white_check_mark::1234: Deldelete N characters under and after the cursor
:white_check_mark::1234: Xdelete N characters before the cursor
:running::1234: d{motion}delete the text that is moved over with {motion}
:running:{visual}ddelete the highlighted text
:running::1234: dddelete N lines
:running::1234: Ddelete to the end of the line (and N-1 more lines)
:running::1234: Jjoin N-1 lines (delete EOLs)
:running:{visual}Jjoin the highlighted lines
:running::1234: gJlike "J", but without inserting spaces
:running:{visual}gJlike "{visual}J", but without inserting spaces
:running::[range]d [x]delete [range] lines [into register x]

Copying and moving text

StatusCommandDescription
:running:"{char}use register {char} for the next delete, yank, or put
:running:"*use register * to access system clipboard
:running::regshow the contents of all registers
:running::reg {arg}show the contents of registers mentioned in {arg}
:running::1234: y{motion}yank the text moved over with {motion} into a register
:running:{visual}yyank the highlighted text into a register
:running::1234: yyyank N lines into a register
:running::1234: Yyank N lines into a register
:running::1234: pput a register after the cursor position (N times)
:running::1234: Pput a register before the cursor position (N times)
:running::1234: ]plike p, but adjust indent to current line
:running::1234: [plike P, but adjust indent to current line
:running::1234: gplike p, but leave cursor after the new text
:running::1234: gPlike P, but leave cursor after the new text

Changing text

StatusCommandDescriptionNote
:running::1234: r{char}replace N characters with {char}
:arrow_down::1234: gr{char}replace N characters without affecting layout
:running::1234: Renter Replace mode (repeat the entered text N times)
:arrow_down::1234: gRenter virtual Replace mode: Like Replace mode but without affecting layout
:running:{visual}r{char}in Visual block, visual, or visual line modes: Replace each char of the selected text with {char}

(change = delete text and enter Insert mode)

StatusCommandDescription
:running::1234: c{motion}change the text that is moved over with {motion}
:running:{visual}cchange the highlighted text
:running::1234: ccchange N lines
:running::1234: Schange N lines
:running::1234: Cchange to the end of the line (and N-1 more lines)
:running::1234: schange N characters
:running:{visual}cin Visual block mode: Change each of the selected lines with the entered text
:running:{visual}Cin Visual block mode: Change each of the selected lines until end-of-line with the entered text
:running:{visual}~switch case for highlighted text
:running:{visual}umake highlighted text lowercase
:running:{visual}Umake highlighted text uppercase
:running:g~{motion}switch case for the text that is moved over with {motion}
:running:gu{motion}make the text that is moved over with {motion} lowercase
:running:gU{motion}make the text that is moved over with {motion} uppercase
:running:{visual}g?perform rot13 encoding on highlighted text
:running:g?{motion}perform rot13 encoding on the text that is moved over with {motion}
:running::1234: CTRL-Aadd N to the number at or after the cursor
:running::1234: CTRL-Xsubtract N from the number at or after the cursor
:running::1234: <{motion}move the lines that are moved over with {motion} one shiftwidth left
:running::1234: <<move N lines one shiftwidth left
:running::1234: >{motion}move the lines that are moved over with {motion} one shiftwidth right
:running::1234: >>move N lines one shiftwidth right
:running::1234: gq{motion}format the lines that are moved over with {motion} to 'textwidth' length
:arrow_down::[range]ce[nter][width]center the lines in [range]
:arrow_down::[range]le[ft][indent]left-align the lines in [range] (with [indent])
:arrow_down::[range]ri[ght][width]right-align the lines in [range]

Complex changes

StatusCommandDescriptionNote
:arrow_down::1234: !{motion}{command}<CR>filter the lines that are moved over through {command}
:arrow_down::1234: !!{command}<CR>filter N lines through {command}
:arrow_down:{visual}!{command}<CR>filter the highlighted lines through {command}
:arrow_down::[range]! {command}<CR>filter [range] lines through {command}
:running::1234: ={motion}filter the lines that are moved over through 'equalprg'
:running::1234: ==filter N lines through 'equalprg'
:running:{visual}=filter the highlighted lines through 'equalprg'
:running::[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
:arrow_down::[range]s[ubstitute][g][c]repeat previous ":s" with new range and options
:arrow_down:&Repeat previous ":s" on current line without options
:arrow_down::[range]ret[ab][!] [tabstop]set 'tabstop' to new value and adjust white space accordingly

Visual mode

StatusCommandDescription
:running:vstart highlighting characters or stop highlighting
:running:Vstart highlighting linewise or stop highlighting
:running:CTRL-Vstart highlighting blockwise or stop highlighting
:running:oexchange cursor position with start of highlighting
:running:gvstart highlighting on previous visual area

Text objects (only in Visual mode or after an operator)

StatusCommandDescription
:running::1234: awSelect "a word"
:running::1234: iwSelect "inner word"
:running::1234: aWSelect "a WORD"
:running::1234: iWSelect "inner WORD"
:running::1234: asSelect "a sentence"
:running::1234: isSelect "inner sentence"
:running::1234: apSelect "a paragraph"
:running::1234: ipSelect "inner paragraph"
:running::1234: a], a[select '[' ']' blocks
:running::1234: i], i[select inner '[' ']' blocks
:running::1234: ab, a(, a)Select "a block" (from "[(" to "])")
:running::1234: ib, i), i(Select "inner block" (from "[(" to "])")
:running::1234: a>, a<Select "a <> block"
:running::1234: i>, i<Select "inner <> block"
:running::1234: aB, a{, a}Select "a Block" (from "[{" to "]}")
:running::1234: iB, i{, i}Select "inner Block" (from "[{" to "]}")
:running::1234: atSelect "a tag block" (from <aaa> to </aaa>)
:running::1234: itSelect "inner tag block" (from <aaa> to </aaa>)
:running::1234: a'Select "a single quoted string"
:running::1234: i'Select "inner single quoted string"
:running::1234: a"Select "a double quoted string"
:running::1234: i"Select "inner double quoted string"
:running::1234: a`Select "a backward quoted string"
:running::1234: i`Select "inner backward quoted string"
:running::1234: iaSelect "inner argument" from the targets.vim plugin
:running::1234: aaSelect "an argument" from the targets.vim plugin

Repeating commands

StatusCommandDescriptionNote
:running::1234: .repeat last change (with count replaced with N)
:running:q{a-z}record typed characters into register {a-z}
:arrow_down:q{A-Z}record typed characters, appended to register {a-z}
:running:qstop recording
:running::1234: @{a-z}execute the contents of register {a-z} (N times)
:running::1234: @@repeat previous @{a-z} (N times)
:arrow_down::@{a-z}execute the contents of register {a-z} as an Ex command
:arrow_down::@@repeat previous :@{a-z}
:arrow_down::[range]g[lobal]/{pattern}/[cmd]execute Ex command cmd on the lines within [range] where {pattern} matches
:arrow_down::[range]g[lobal]!/{pattern}/[cmd]execute Ex command cmd on the lines within [range] where {pattern} does NOT match
:arrow_down::so[urce] {file}read Ex commands from {file}
:arrow_down::so[urce]! {file}read Vim commands from {file}
:arrow_down::sl[eep][sec]don't do anything for [sec] seconds
:arrow_down::1234: gsgoto Sleep for N seconds

Undo/Redo commands

StatusCommandDescriptionNote
:running::1234: uundo last N changesCurrent implementation may not cover every case perfectly.
:running::1234: CTRL-Rredo last N undone changesAs above.
:running:Urestore last changed line

External commands

StatusCommandDescription
:running::sh[ell]start a shell
:running::!{command}execute {command} with a shell
:arrow_down:Klookup keyword under the cursor with 'keywordprg' program (default: "man")

Ex ranges

StatusCommandDescriptionNote
:running:,separates two line numbers
:running:;idem, set cursor to the first line number before interpreting the second one
:running:{number}an absolute line number
:running:.the current line
:running:$the last line in the file
:running:%equal to 1,$ (the entire file)
:running:*equal to '<,'> (visual area)
:running:'tposition of mark t
:arrow_down:/{pattern}[/]the next line where {pattern} matches
:arrow_down:?{pattern}[?]the previous line where {pattern} matches
:running:+[num]add [num] to the preceding line number (default: 1)
:running:-[num]subtract [num] from the preceding line number (default: 1)

Editing a file

StatusCommandDescriptionNote
:running::e[dit] {file}Edit {file}.

Multi-window commands

StatusCommandDescriptionNote
:running::e[dit] {file}Edit {file}.
:running:<ctrl-w> hlSwitching between windows.
:running::sp {file}Split current window in two.
:running::vsp {file}Split vertically current window in two.
:running:<ctrl-w> sSplit current window in two.
:running:<ctrl-w> vSplit vertically current window in two.
:running:<ctrl-w> oClose other editor groups.
:running::newCreate a new window horizontally and start editing an empty file in it.
:running::vne[w]Create a new window vertically and start editing an empty file in it.

Tabs

StatusCommandDescriptionNote
:running::tabn[ext] :1234:Go to next tab page or tab page {count}. The first tab page has number one.
:running:{count}<C-PageDown>, {count}gtSame as above
:running::tabp[revious] :1234:Go to the previous tab page. Wraps around from the first one to the last one.
:running::tabN[ext] :1234:Same as above
:running:{count}<C-PageUp>, {count}gTSame as above
:running::tabfir[st]Go to the first tab page.
:running::tabl[ast]Go to the last tab page.
:running::tabe[dit] {file}Open a new tab page with an empty window, after the current tab page
:arrow_down::[count]tabe[dit], :[count]tabnewSame as above
:running::tabnew {file}Open a new tab page with an empty window, after the current tab page
:arrow_down::[count]tab {cmd}Execute {cmd} and when it opens a new window open a new tab page instead.
:running::tabc[lose][!] :1234:Close current tab page or close tab page {count}.
:running::tabo[nly][!]Close all other tab pages.
:running::tabm[ove][n]Move the current tab page to after tab page N.
:arrow_down::tabsList the tab pages and the windows they contain.
:arrow_down::tabd[o] {cmd}Execute {cmd} in each tab page.