mirror of
https://github.com/VSCodeVim/Vim.git
synced 2024-09-11 12:25:59 +03:00
20 KiB
20 KiB
Key
✅ - command done
⚠️ - command partially implemented
❌ - 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 ? |
Marks | |
⚠️ | Text Objects |
Command Remapping | |
Correct Undo/Redo | |
Visual Block Mode | |
Macros |
Now follows an exhaustive list of every known Vim command that we could find.
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 | up N lidown 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 |
❌ | 🔢 gk | up N screen lines (differs from "k" when line wraps) |
❌ | 🔢 gj | own N screen lines (differs from "j" when line wraps) |
Text object motions
Status | Command | Description |
---|---|---|
✅ | 🔢 w | N words forward |
✅ | 🔢 W | N blank-separated |
✅ | 🔢 e | N words forward to the end of the Nth word |
✅ | 🔢 E | N words forward to the end of the Nth blank-separated |
✅ | 🔢 b | N words backward |
✅ | 🔢 B | N blank-separated |
✅ | 🔢 ge | N words backward to the end of the Nth word |
✅ | 🔢 gE | N words backward to the end of the Nth blank-separated |
✅ | 🔢 ) | 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 comment "/*" | |
🔢 ]* | N times forward to end of comment "*/" |
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 |
These only work when 'wrap' is off:
Status | Command | Description |
---|---|---|
❌ | 🔢 zh | scroll screen N characters to the right |
❌ | 🔢 zl | scroll screen N characters to the left |
❌ | 🔢 zH | scroll screen half a screenwidth to the right |
❌ | 🔢 zL | scroll screen half a screenwidth to the left |
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) |
✅ | 🔢 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 |
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 | |
: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 |
---|---|---|
⚠️ | 🔢 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) | |
🔢 gR | enter virtual Replace mode: Like Replace mode but without affecting layout | |
v_b_r |
(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 | |
⚠️ | 🔢 ~ | switch case for N characters and advance cursor |
{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] |
Visual mode
Status | Command | Description |
---|---|---|
✅ | v | start highlighting characters |
✅ | V | start highlighting linewise |
CTRL-V | start highlighting blockwise | |
o | exchange cursor position with start of highlighting | |
gv | start highlighting on previous visual area | |
✅ | v | highlight characters or stop highlighting |
✅ | V | highlight linewise or stop highlighting |
CTRL-V | highlight blockwise or stop highlighting |
Text objects (only in Visual mode or after an operator)
Status | Command | Description |
---|---|---|
⚠️ | 🔢 aw | Select "a word" |
⚠️ | 🔢 iw | Select "inner word" |
🔢 aW | Select "a | WORD |
🔢 iW | Select "inner | WORD |
🔢 as | Select "a sentence" | |
🔢 is | Select "inner sentence" | |
🔢 ap | Select "a paragraph" | |
🔢 ip | Select "inner paragraph" | |
🔢 ab | Select "a block" (from "[(" to "])") | |
🔢 ib | Select "inner block" (from "[(" to "])") | |
🔢 aB | Select "a Block" (from "[{" to "]}") | |
🔢 iB | Select "inner Block" (from "[{" to "]}") | |
🔢 a> | Select "a <> block" | |
🔢 i> | Select "inner <> block" | |
🔢 at | Select "a tag block" (from to ) | |
🔢 it | Select "inner tag block" (from to ) | |
🔢 a' | Select "a single quoted string" | |
🔢 i' | Select "inner single quoted string" | |
🔢 a" | Select "a double quoted string" | |
🔢 i" | Select "inner double quoted string" | |
🔢 a` | Select "a backward quoted string" | |
🔢 i` | Select "inner backward quoted string" |
Repeating commands
Status | Command | Description |
---|---|---|
✅ | 🔢 . | repeat last change (with count replaced with N) |
q{a-z} | record typed characters into register {a-z} | |
q{A-Z} | record typed characters, appended to register {a-z} | |
q | stop recording | |
🔢 @{a-z} | execute the contents of register {a-z} (N times) | |
🔢 @@ | repeat previous @{a-z} (N times) | |
:@{a-z} | execute the contents of register {a-z} as an Ex command | |
:@@ | repeat previous :@{a-z} | |
:[range]g[lobal]/{pattern}/[cmd] | execute Ex command [cmd] (default: ":p") on the lines within [range] where {pattern} matches | |
:[range]g[lobal]!/{pattern}/[cmd] | execute Ex command [cmd] (default: ":p") on the lines within [range] where {pattern} does NOT match | |
:so[urce] {file} | read Ex commands from {file} | |
:so[urce]! {file} | read Vim commands from {file} | |
:sl[eep] [sec] | don't do anything for [sec] seconds | |
🔢 gs | goto Sleep for N seconds |
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 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 | 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 |
Complex changes
Status | Command | Description |
---|---|---|
🔢 !{motion}{command} | filter the lines that are moved over through {command} | |
🔢 !!{command} | filter N lines through {command} | |
{visual}!{command} | filter the highlighted lines through {command} | |
:[range]! {command} | 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 | |
:[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 |
Special keys in Insert mode
Status | Command | Description |
---|---|---|
CTRL-V {char}.. | insert character literally, or enter decimal byte value | |
⚠️ | NL or CR or CTRL-M or CTRL-J | begin new line |
CTRL-E | insert the character from below the cursor | |
CTRL-Y | insert the character from above the cursor | |
CTRL-A | insert previously inserted text | |
CTRL-@ | insert previously inserted text and stop Insert mode | |
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 |
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 |
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 |
Tabs
Status | Command | Description |
---|---|---|
✅ | :tabn[ext] 🔢 | Go to tab page {count}. The first tab page has number one. |
✅ | :tabp[revious] 🔢 | Go to the previous tab page. Wraps around from the first one to the last one. |
✅ | :tabfir[st] | Go to the first tab page. |
✅ | :tabl[ast] | Go to the last tab page. |