You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
✅ ⭐ - command done with VS Code specific customization
⚠️ - some variations of the command are not supported
🏃 - work in progress
⬇️ - command is low priority; open an issue (or thumbs up the relevant issue) if you want to see it sooner
❌ - command impossible with current VSCode API
🔢 - command accepts numeric prefix
Roadmap
These are the big Vim features, put generally in the order in which we plan to implement them.
Status
Command
✅
Normal Mode
✅
Insert Mode
✅
Visual Mode
✅
Visual Line Mode
✅
Number Prefixes
✅
. Operator
✅
Searching with / and ?
✅
Correct Undo/Redo
⚠️
Command Remapping
⚠️
Marks
✅
Text Objects
✅
Visual Block Mode
✅
Replace Mode
✅
Multiple Select Mode
⚠️
Macros
⚠️
Buffer/Window/Tab
Now follows an exhaustive list of every known Vim command that we could find.
Custom commands
gh - show the hover tooltip.
gb - add an additional cursor at the next place that matches *.
Left-right motions
Status
Command
Description
✅
🔢 h
left (also: CTRL-H, BS, or Left key)
✅
🔢 l
right (also: Space or Right key)
✅
0
to first character in the line (also: Home key)
✅
^
to first non-blank character in the line
✅
🔢 $
to the last character in the line (N-1 lines lower) (also: End key)
✅
g0
to first character in screen line (differs from "0" when lines wrap)
✅
g^
to first non-blank character in screen line (differs from "^" when lines wrap)
✅
🔢 g$
to last character in screen line (differs from "$" when lines wrap)
✅
gm
to middle of the screen line
✅
🔢 |
to column N (default: 1)
✅
🔢 f{char}
to the Nth occurrence of {char} to the right
✅
🔢 F{char}
to the Nth occurrence of {char} to the left
✅
🔢 t{char}
till before the Nth occurrence of {char} to the right
✅
🔢 T{char}
till before the Nth occurrence of {char} to the left
✅
🔢 ;
repeat the last "f", "F", "t", or "T" N times
✅
🔢 ,
repeat the last "f", "F", "t", or "T" N times in opposite direction
Up-down motions
Status
Command
Description
✅
🔢 k
up N lines (also: CTRL-P and Up)
✅
🔢 j
down N lines (also: CTRL-J, CTRL-N, NL, and Down)
✅
🔢 -
up N lines, on the first non-blank character
✅
🔢 +
down N lines, on the first non-blank character (also: CTRL-M and CR)
✅
🔢 _
down N-1 lines, on the first non-blank character
✅
🔢 G
goto line N (default: last line), on the first non-blank character
✅
🔢 gg
goto line N (default: first line), on the first non-blank character
✅
🔢 %
goto line N percentage down in the file; N must be given, otherwise it is the % command
✅
🔢 gk
up N screen lines (differs from "k" when line wraps)
✅
🔢 gj
down N screen lines (differs from "j" when line wraps)
Text object motions
Status
Command
Description
✅
🔢 w
N words forward
✅
🔢 W
N blank-separated WORDs forward
✅
🔢 e
N words forward to the end of the Nth word
✅
🔢 E
N words forward to the end of the Nth blank-separated WORD
✅
🔢 b
N words backward
✅
🔢 B
N blank-separated WORDs backward
✅
🔢 ge
N words backward to the end of the Nth word
✅
🔢 gE
N words backward to the end of the Nth blank-separated WORD
✅
🔢 )
N sentences forward
✅
🔢 (
N sentences backward
✅
🔢 }
N paragraphs forward
✅
🔢 {
N paragraphs backward
✅
🔢 ]]
N sections forward, at start of section
✅
🔢 [[
N sections backward, at start of section
✅
🔢 ][
N sections forward, at end of section
✅
🔢 []
N sections backward, at end of section
✅
🔢 [(
N times back to unclosed '('
✅
🔢 [{
N times back to unclosed '{'
⬇️
🔢 [m
N times back to start of method (for Java)
⬇️
🔢 [M
N times back to end of method (for Java)
✅
🔢 ])
N times forward to unclosed ')'
✅
🔢 ]}
N times forward to unclosed '}'
⬇️
🔢 ]m
N times forward to start of method (for Java)
⬇️
🔢 ]M
N times forward to end of method (for Java)
⬇️
🔢 [#
N times back to unclosed "#if" or "#else"
⬇️
🔢 ]#
N times forward to unclosed "#else" or "#endif"
⬇️
🔢 [*
N times back to start of a C comment "/*"
⬇️
🔢 ]*
N times forward to end of a C comment "*/"
Pattern searches
Status
Command
Description
Note
✅ ⭐
🔢 /{pattern}[/[offset]]<CR>
search forward for the Nth occurrence of {pattern}
Currently we only support JavaScript Regex but not Vim's in-house Regex engine.
✅ ⭐
🔢 ?{pattern}[?[offset]]<CR>
search backward for the Nth occurrence of {pattern}
Currently we only support JavaScript Regex but not Vim's in-house Regex engine.
⚠️
🔢 /<CR>
repeat last search, in the forward direction
{count} is not supported.
⚠️
🔢 ?<CR>
repeat last search, in the backward direction
{count} is not supported.
✅
🔢 n
repeat last search
✅
🔢 N
repeat last search, in opposite direction
✅
🔢 *
search forward for the identifier under the cursor
✅
🔢 #
search backward for the identifier under the cursor
✅
🔢 g*
like "*", but also find partial matches
✅
🔢 g#
like "#", but also find partial matches
✅
gd
goto local declaration of identifier under the cursor
⬇️
gD
goto global declaration of identifier under the cursor
Marks and motions
Status
Command
Description
✅
m{a-zA-Z}
mark current position with mark {a-zA-Z}
✅
`{a-z}
go to mark {a-z} within current file
✅
`{A-Z}
go to mark {A-Z} in any file
✅
`{0-9}
go to the position where Vim was previously exited
✅
``
go to the position before the last jump
⬇️
`"
go to the position when last editing this file
✅
`[
go to the start of the previously operated or put text
✅
'[
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 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
✅
'.
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
print the active marks
✅
🔢 CTRL-O
go to Nth older position in jump list
✅
🔢 CTRL-I
go to Nth newer position in jump list
⬇️
:ju[mps]
print the jump list
Various motions
Status
Command
Description
✅
%
find the next brace, bracket, comment, or "#if"/ "#else"/"#endif" in this line and go to its match
✅
🔢 H
go to the Nth line in the window, on the first non-blank
✅
M
go to the middle line in the window, on the first non-blank
✅
🔢 L
go to the Nth line from the bottom, on the first non-blank
⬇️
🔢 go
go to Nth byte in the buffer
⬇️
:[range]go[to][off]
go to [off] byte in the buffer
Using tags
The following are all marked low priority because VSCode has very good support for tags with Goto Symbol. Try it from the command palette if you haven't yet!
Status
Command
Description
⬇️
:ta[g][!] {tag}
jump to tag {tag}
⬇️
:[count]ta[g][!]
jump to [count]'th newer tag in tag list
⬇️
CTRL-]
jump to the tag under cursor, unless changes have been made
⬇️
:ts[elect][!] [tag]
list matching tags and select one to jump to
⬇️
:tj[ump][!] [tag]
jump to tag [tag] or select from list when there are multiple matches
⬇️
:lt[ag][!] [tag]
jump to tag [tag] and add matching tags to the location list
⬇️
:tagsa
print tag list
⬇️
🔢 CTRL-T
jump back from Nth older tag in tag list
⬇️
:[count]po[p][!]
jump back from [count]'th older tag in tag list
⬇️
:[count]tn[ext][!]
jump to [count]'th next matching tag
⬇️
:[count]tp[revious][!]
jump to [count]'th previous matching tag
⬇️
:[count]tr[ewind][!]
jump to [count]'th matching tag
⬇️
:tl[ast][!]
jump to last matching tag
⬇️
:pt[ag] {tag}
open a preview window to show tag {tag}
⬇️
CTRL-W }
like CTRL-] but show tag in preview window
⬇️
:pts[elect]
like ":tselect" but show tag in preview window
⬇️
:ptj[ump]
like ":tjump" but show tag in preview window
⬇️
:pc[lose]
close tag preview window
⬇️
CTRL-W z
close tag preview window`
Scrolling
Status
Command
Description
✅
🔢 CTRL-E
window N lines downwards (default: 1)
✅
🔢 CTRL-D
window N lines Downwards (default: 1/2 window)
✅
🔢 CTRL-F
window N pages Forwards (downwards)
✅
🔢 CTRL-Y
window N lines upwards (default: 1)
✅
🔢 CTRL-U
window N lines Upwards (default: 1/2 window)
✅
🔢 CTRL-B
window N pages Backwards (upwards)
✅
z CR or zt
redraw, current line at top of window
✅
z. or zz
redraw, current line at center of window
✅
z- or zb
redraw, current line at bottom of window
These only work when 'wrap' is off:
Status
Command
Description
Note
✅ ⭐
🔢 zh
scroll screen N characters to the right
In Code, the cursor will always move when you run this command, whether the horizontal scrollbar moves or not.
✅ ⭐
🔢 zl
scroll screen N characters to the left
As above
✅ ⭐
🔢 zH
scroll screen half a screenwidth to the right
As above
✅ ⭐
🔢 zL
scroll screen half a screenwidth to the left
As above
Inserting text
Status
Command
Description
✅
🔢 a
append text after the cursor (N times)
✅
🔢 A
append text at the end of the line (N times)
✅
🔢 i
insert text before the cursor (N times) (also: Insert)
✅
🔢 I
insert text before the first non-blank in the line (N times)
✅
🔢 gI
insert text in column 1 (N times)
✅
gi
insert at the end of the last change
✅
🔢 o
open a new line below the current line, append text (N times)
✅
🔢 O
open a new line above the current line, append text (N times)
in Visual block mode:
Status
Command
Description
✅
I
insert the same text in front of all the selected lines
✅
A
append the same text after all the selected lines
Insert mode keys
leaving Insert mode:
Status
Command
Description
✅
Esc
end Insert mode, back to Normal mode
✅
CTRL-C
like Esc, but do not use an abbreviation
✅
CTRL-O {command}
execute {command} and return to Insert mode
moving around:
Status
Command
Description
✅
cursor keys
move cursor left/right/up/down
✅
shift-left/right
one word left/right
✅
shift-up/down
one screenful backward/forward
✅
End
cursor after last character in the line
✅
Home
cursor to first character in the line
Special keys in Insert mode
Status
Command
Description
Note
⬇️
CTRL-V {char}..
insert character literally, or enter decimal byte value
⚠️
NL or CR or CTRL-M or CTRL-J
begin new line
CTRL-M and CTRL-J are not supported
✅
CTRL-E
insert the character from below the cursor
✅
CTRL-Y
insert the character from above the cursor
✅ ⭐
CTRL-A
insert previously inserted text
We apply previously document change made in previous Insert session and we only apply changes that happen under cursor
✅ ⭐
CTRL-@
insert previously inserted text and stop Insert mode
As above
✅
CTRL-R {0-9a-z%#:.-="}
insert the contents of a register
✅
CTRL-N
insert next match of identifier before the cursor
✅
CTRL-P
insert previous match of identifier before the cursor
⬇️
CTRL-X ...
complete the word before the cursor in various ways
✅
BS or CTRL-H
delete the character before the cursor
✅
Del
delete the character under the cursor
✅
CTRL-W
delete word before the cursor
✅
CTRL-U
delete all entered characters in the current line
✅
CTRL-T
insert one shiftwidth of indent in front of the current line
✅
CTRL-D
delete one shiftwidth of indent in front of the current line
⬇️
0 CTRL-D
delete all indent in the current line
⬇️
^ CTRL-D
delete all indent in the current line, restore indent in next line
Digraphs
Status
Command
Description
✅
:dig[raphs]
show current list of digraphs
⬇️
:dig[raphs] {char1}{char2} {number} ...
add digraph(s) to the list
Special inserts
Status
Command
Description
⚠️
:r [file]
insert the contents of [file] below the cursor
⚠️
:r! {command}
insert the standard output of {command} below the cursor
Deleting text
Status
Command
Description
✅
🔢 x
delete N characters under and after the cursor
✅
🔢 Del
delete N characters under and after the cursor
✅
🔢 X
delete N characters before the cursor
✅
🔢 d{motion}
delete the text that is moved over with {motion}
✅
{visual}d
delete the highlighted text
✅
🔢 dd
delete N lines
✅
🔢 D
delete to the end of the line (and N-1 more lines)
✅
🔢 J
join N-1 lines (delete EOLs)
✅
{visual}J
join the highlighted lines
✅
🔢 gJ
like "J", but without inserting spaces
✅
{visual}gJ
like "{visual}J", but without inserting spaces
✅
:[range]d [x]
delete [range] lines [into register x]
Copying and moving text
Status
Command
Description
✅
"{char}
use register {char} for the next delete, yank, or put
✅
"*
use register * to access system clipboard
✅
:reg
show the contents of all registers
✅
:reg {arg}
show the contents of registers mentioned in {arg}
✅
🔢 y{motion}
yank the text moved over with {motion} into a register
✅
{visual}y
yank the highlighted text into a register
✅
🔢 yy
yank N lines into a register
✅
🔢 Y
yank N lines into a register
✅
🔢 p
put a register after the cursor position (N times)
✅
🔢 P
put a register before the cursor position (N times)
✅
🔢 ]p
like p, but adjust indent to current line
✅
🔢 [p
like P, but adjust indent to current line
✅
🔢 gp
like p, but leave cursor after the new text
✅
🔢 gP
like P, but leave cursor after the new text
Changing text
Status
Command
Description
Note
✅
🔢 r{char}
replace N characters with {char}
⬇️
🔢 gr{char}
replace N characters without affecting layout
✅ ⭐
🔢 R
enter Replace mode (repeat the entered text N times)
{count} is not supported
⬇️
🔢 gR
enter virtual Replace mode: Like Replace mode but without affecting layout
✅
{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)
Status
Command
Description
✅
🔢 c{motion}
change the text that is moved over with {motion}
✅
{visual}c
change the highlighted text
✅
🔢 cc
change N lines
✅
🔢 S
change N lines
✅
🔢 C
change to the end of the line (and N-1 more lines)
✅
🔢 s
change N characters
✅
{visual}c
in Visual block mode: Change each of the selected lines with the entered text
✅
{visual}C
in Visual block mode: Change each of the selected lines until end-of-line with the entered text
✅
{visual}~
switch case for highlighted text
✅
{visual}u
make highlighted text lowercase
✅
{visual}U
make highlighted text uppercase
✅
g~{motion}
switch case for the text that is moved over with {motion}
✅
gu{motion}
make the text that is moved over with {motion} lowercase
✅
gU{motion}
make the text that is moved over with {motion} uppercase
✅
{visual}g?
perform rot13 encoding on highlighted text
✅
g?{motion}
perform rot13 encoding on the text that is moved over with {motion}
✅
🔢 CTRL-A
add N to the number at or after the cursor
✅
🔢 CTRL-X
subtract N from the number at or after the cursor
✅
🔢 <{motion}
move the lines that are moved over with {motion} one shiftwidth left
✅
🔢 <<
move N lines one shiftwidth left
✅
🔢 >{motion}
move the lines that are moved over with {motion} one shiftwidth right
✅
🔢 >>
move N lines one shiftwidth right
✅
🔢 gq{motion}
format the lines that are moved over with {motion} to 'textwidth' length
⬇️
:[range]ce[nter][width]
center the lines in [range]
⬇️
:[range]le[ft][indent]
left-align the lines in [range] (with [indent])
⬇️
:[range]ri[ght][width]
right-align the lines in [range]
Complex changes
Status
Command
Description
Note
⬇️
🔢 !{motion}{command}<CR>
filter the lines that are moved over through {command}
⬇️
🔢 !!{command}<CR>
filter N lines through {command}
⬇️
{visual}!{command}<CR>
filter the highlighted lines through {command}
⬇️
:[range]! {command}<CR>
filter [range] lines through {command}
✅
🔢 ={motion}
filter the lines that are moved over through 'equalprg'
✅
🔢 ==
filter N lines through 'equalprg'
✅
{visual}=
filter the highlighted lines through 'equalprg'
✅ ⭐ ⚠️
:[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
Currently we only support JavaScript Regex and only options gi are implemented
⬇️
:[range]s[ubstitute][g][c]
repeat previous ":s" with new range and options
⬇️
&
Repeat previous ":s" on current line without options
⬇️
:[range]ret[ab][!] [tabstop]
set 'tabstop' to new value and adjust white space accordingly
Visual mode
Status
Command
Description
✅
v
start highlighting characters or stop highlighting
✅
V
start highlighting linewise or stop highlighting
✅
CTRL-V
start highlighting blockwise or stop highlighting
✅
o
exchange cursor position with start of highlighting
✅
gv
start highlighting on previous visual area
Text objects (only in Visual mode or after an operator)