标识
✅ - 已完成
✅ ⭐ - 已完成,基于 VSCode 的实现
⚠️ - 不支持此命令的某些特殊用法
🏃 - 开发中
⬇️ - 低优先级;如果希望使用它,请提交相关 issue
❌ - 此命令在当前 VSCode 版本中无法实现
🔢 - 接受数字类型的前缀
翻译名词释义
光标: 普通模式下的光标
向前: 光标相对于当前位置向右或向下移动
向后: 光标相对于当前位置向左或向上移动
开发进度
以下为 vim 的重要功能,开发计划通常按以下顺序依次实现相关功能。
状态 |
命令 |
✅ |
普通模式 |
✅ |
插入模式 |
✅ |
可视模式 |
✅ |
行内可视模式 |
✅ |
数字前缀 |
✅ |
'.' 操作符 |
✅ |
使用 '/' '?' 搜索 |
✅ |
撤消/恢复 |
⚠️ |
命令重映射 |
⚠️ |
标记 |
✅ |
文本对象 |
✅ |
可视块模式 |
✅ |
替换模式 |
✅ |
多选模式 |
⚠️ |
宏 |
⚠️ |
Buffer/Window/Tab |
以下列表展示了在本插件中可以使用的 Vim 命令
自定义命令
gh
- 显示鼠标 hover 在当前位置时的提示信息
gb
- 在下一个匹配当前光标所处单词的地方增加一个光标
左右移动
状态 |
命令 |
描述 |
✅ |
🔢 h |
左移 (或者: CTRL-H, BS, 或左方向键) |
✅ |
🔢 l |
右移 (或者: 空格键或右方向键) |
✅ |
0 |
移动到当前行的第一个字符处 (或者: Home 键) |
✅ |
^ |
移动到当前行的第一个非空字符处 |
✅ |
🔢 $ |
移动到当前行的最后一个字符处 (N-1 lines lower) (或者: End 键) |
✅ |
g0 |
移动到屏幕上显示行的第一个字符处(当有多行被折叠时,行为与 '0' 不同) |
✅ |
g^ |
移动到屏幕上显示行的第一个非空白字符处(当有多行被折叠时,行为与 '^' 不同) |
✅ |
🔢 g$ |
移动到屏幕上显示行的最后一个字符处(当有多行被折叠时,行为与 '$' 不同) |
✅ |
gm |
移动到屏幕上显示行的中央 |
✅ |
🔢 \ |
移动到指定列 (默认: 1) |
✅ |
🔢 f{char} |
向右移动到第 N 个指定字符处 |
✅ |
🔢 F{char} |
向左移动到第 N 个指定字符处 |
✅ |
🔢 t{char} |
向右移动到第 N 个指定字符的前一个字符处 |
✅ |
🔢 T{char} |
向左移动到第 N 个指定字符的前一个字符处 |
✅ |
🔢 ; |
重复执行 N 次上一次的 "f", "F", "t", 或 "T" 命令 |
✅ |
🔢 , |
反向重复执行 N 次上一次的 “f“,“F“,“t“,或“T“命令 |
上下移动
状态 |
命令 |
描述 |
✅ |
🔢 k |
上移 (或者: CTRL-P and Up) |
✅ |
🔢 j |
下移 (或者: CTRL-J, CTRL-N, NL, and Down) |
✅ |
🔢 - |
上移,光标将位于第一个非空白字符上 |
✅ |
🔢 + |
下移,光标将位于第一个非空白字符上 (或者: CTRL-M and CR) |
✅ |
🔢 _ |
下移 N-1 行,光标将位于第一个非空白字符上 |
✅ |
🔢 G |
移动到第 N 行,光标将位于第一个非空白字符上(默认: 最后一行) |
✅ |
🔢 gg |
移动到第 N 行,光标将位于第一个非空白字符上(默认: 第一行) |
✅ |
🔢 % |
移动到当前文件的第 N%行,必须指定 N,否则将执行’%‘命令 |
✅ |
🔢 gk |
上移 N 行(当有折叠行时与'k’命令的行为不同,折叠行被视作一行) |
✅ |
🔢 gj |
下移 N 行(当有折叠行时与'j’命令的行为不同,折叠行被视作一行) |
针对文本对象的移动方式
状态 |
命令 |
描述 |
✅ |
🔢 w |
向前移动 N 个单词 |
✅ |
🔢 W |
向前移动 N 个单词,忽略分割符 |
✅ |
🔢 e |
向前移动 N 个单词,光标位于第 N 个单词的结尾 |
✅ |
🔢 E |
向前移动 N 个单词,光标位于第 N 个单词的结尾,忽略分割符 |
✅ |
🔢 b |
向后移动 N 个单词 |
✅ |
🔢 B |
向后移动 N 个单词,忽略分割符 |
✅ |
🔢 ge |
向后移动 N 个单词,光标位于第 N 个单词的结尾 |
✅ |
🔢 gE |
向后移动 N 个单词,光标位于第 N 个单词的结尾,忽略分割符 |
✅ |
🔢 ) |
向前移动 N 个句子 |
✅ |
🔢 ( |
向后移动 N 个句子 |
✅ |
🔢 } |
向前移动 N 个段落 |
✅ |
🔢 { |
向后移动 N 个段落 |
✅ |
🔢 ]] |
向前移动 N 个缓冲区,光标位于开始位置 |
✅ |
🔢 [[ |
向后移动 N 个缓冲区,光标位于开始位置 |
✅ |
🔢 ][ |
向前移动 N 个缓冲区,光标位于结束位置 |
✅ |
🔢 [] |
向后移动 N 个缓冲区,光标位于结束位置 |
✅ |
🔢 [( |
向后移动到第 N 个未闭合的'('处 |
✅ |
🔢 [{ |
向后移动到第 N 个未闭合的'{'处 |
⬇️ |
🔢 [m |
向后移动到第 N 个方法的开始位置(Java) |
⬇️ |
🔢 [M |
向后移动到第 N 个方法的结束位置(Java) |
✅ |
🔢 ]) |
向前移动到第 N 个未闭合的')'处 |
✅ |
🔢 ]} |
向前移动到第 N 个未闭合的'}'处 |
⬇️ |
🔢 ]m |
向前移动到第 N 个方法的开始位置(Java) |
⬇️ |
🔢 ]M |
向前移动到第 N 个方法的结束位置(Java) |
⬇️ |
🔢 [# |
向后移动到第 N 个未匹配的 #if、#else |
⬇️ |
🔢 ]# |
向前移动到第 N 个未匹配的 #else、#endif |
⬇️ |
🔢 [* |
向后移动到第 N 个 C 注释的开始位置 |
⬇️ |
🔢 ]* |
向前移动到第 N 个 C 注释的开始位置 |
按模式搜索
状态 |
命令 |
描述 |
备注 |
✅ ⭐ |
🔢 /{pattern}[/[offset]]<CR> |
向前搜索{pattern}的第 N 次出现 |
当前仅支持 JavaScript 的正则引擎,不支持 Vim 的内置正则引擎 |
✅ ⭐ |
🔢 ?{pattern}[?[offset]]<CR> |
向后搜索{pattern}的第 N 次出现 |
当前仅支持 JavaScript 的正则引擎,不支持 Vim 的内置正则引擎 |
⚠️ |
🔢 /<CR> |
向前重复最后一次搜索 |
不支持数量参数 |
⚠️ |
🔢 ?<CR> |
向后重复最后一次搜索 |
不支持数量参数 |
✅ |
🔢 n |
重复上一次搜索 |
|
✅ |
🔢 N |
反方向重复上一次搜索 |
|
✅ |
🔢 * |
向前搜索当前光标所处的单词 |
|
✅ |
🔢 # |
向后搜索当前光标所处的单词 |
|
✅ |
🔢 g* |
类似于 "*", 执行部分匹配 |
|
✅ |
🔢 g# |
类似于 "#", 执行部分匹配 |
|
✅ |
gd |
跳转到当前光标所处标识的声明处 |
|
⬇️ |
gD |
跳转到当前光标所处标识的声明处 |
|
标记定位
状态 |
命令 |
描述 |
✅ |
m{a-zA-Z} |
使用{a-zA-Z}标记当前位置 |
✅ |
`{a-z} |
跳转到当文件中的{a-z}标记处 |
✅ |
`{A-Z} |
跳转到任意文件中的{A-Z} |
✅ |
`{0-9} |
跳转到 Vim 上次退出时的位置 |
✅ |
`` |
跳转到 Vim 最后一次跳转之前的位置 |
⬇️ |
`" |
跳转到当前文件中最后一次编辑的位置 |
✅ |
`[ |
跳转到上一次操作或输入文本的开始位置 |
✅ |
'[ |
跳转到上一次操作或输入文本的开始位置 |
✅ |
`] |
跳转到上一次操作或输入文本的结束位置 |
✅ |
'] |
跳转到上一次操作或输入文本的结束位置 |
⬇️ |
`< |
跳转到(上一个)可视区开始 |
⬇️ |
`> |
跳转到(上一个)可视区末尾 |
✅ |
`. |
跳转到此文件的最后一次修改处 |
✅ |
'. |
跳转到此文件的最后一次修改处 |
⬇️ |
'{a-zA-Z0-9[]'"<>.} |
与`命令的意义相同,除了会定位到所在行的第一个非空白字符 |
⬇️ |
:marks |
打印当前活动的标记 |
✅ |
🔢 CTRL-O |
跳转到跳转列表的第 N 个旧位置 |
✅ |
🔢 CTRL-I |
跳转到跳转列表的第 N 个新位置 |
⬇️ |
:ju[mps] |
打印跳转列表 |
其它移动方式
状态 |
命令 |
描述 |
✅ |
% |
在当前行中查找下一个大括号,中括号,小括号或者"#if"/ "#else"/"#endif",并且跳转到与之匹配的结束标记处 |
✅ |
🔢 H |
跳转到距离视口首行第 N 行的第一个非空字符处 |
✅ |
M |
跳转到视口中央行的第一个非空字符处 |
✅ |
🔢 L |
跳转到距离视口最后一行第 N 行的第一个非空字符处 |
⬇️ |
🔢 go |
跳转到 buffer 中的第 N 个字节 |
⬇️ |
:[range]go[to][off] |
跳转到 buffer 开始后[off]个字节的位置 |
tag 的使用方法
以下命令均为低优先级,VSCode 对于可跳转标签有很好的支持,你可以通过命令面板来尝试使用它们。
状态 |
命令 |
描述 |
⬇️ |
:ta[g][!] {tag} |
跳转到{tag}处 |
⬇️ |
:[count]ta[g][!] |
跳转到 tag 列表中的第[count]个 tag 处 |
⬇️ |
CTRL-] |
跳转到当前光标下的 tag 处,除非修改已经发生 |
⬇️ |
:ts[elect][!] [tag] |
列出匹配的 tag,选择并跳转 |
⬇️ |
:tj[ump][!] [tag] |
跳转到[tag]tag 处,如果有多个匹配将列出匹配项供选择 |
⬇️ |
:lt[ag][!] [tag] |
跳转到[tag]tag 处,将其添加到本地的 tag 列表 |
⬇️ |
:tagsa |
输出 tag 列表 |
⬇️ |
🔢 CTRL-T |
从 tag 列表中的第 N 个旧 tag 跳回来 |
⬇️ |
:[count]po[p][!] |
从 tag 列表中的第[count]个旧 tag 跳转回来 |
⬇️ |
:[count]tn[ext][!] |
跳转到接下来的第[count]个匹配的 tag 处 |
⬇️ |
:[count]tp[revious][!] |
跳转到之前的第[count]个匹配的 tag 处 |
⬇️ |
:[count]tr[ewind][!] |
跳转到第[count]个匹配的标签处 |
⬇️ |
:tl[ast][!] |
跳转到最后一个匹配的 tag 处 |
⬇️ |
:pt[ag] {tag} |
打开预览窗口以显示 tag{tag} |
⬇️ |
CTRL-W } |
类似于 CTRL-],但是在预览窗口中显示 tag |
⬇️ |
:pts[elect] |
类似于":tselect",但是在预览窗口中显示 tag |
⬇️ |
:ptj[ump] |
类似于":tjump",但是在预览窗口中显示 tag |
⬇️ |
:pc[lose] |
关闭 tag 预览窗口 |
⬇️ |
CTRL-W z |
关闭 tag 预览窗口 |
滚动
状态 |
命令 |
描述 |
✅ |
🔢 CTRL-E |
向下滚动 N 行(默认: 1) |
✅ |
🔢 CTRL-D |
向下滚动 N 个 1/2 屏(默认: 1/2 屏) |
✅ |
🔢 CTRL-F |
向下滚动 N 屏 |
✅ |
🔢 CTRL-Y |
向上滚动 N 行(默认: 1) |
✅ |
🔢 CTRL-U |
向上滚动 N 个 1/2 屏(默认: 1/2 屏) |
✅ |
🔢 CTRL-B |
向上滚动 N 屏 |
✅ |
z CR or zt |
将当前行移到屏幕顶部 |
✅ |
z. or zz |
将当前行移到屏幕中央 |
✅ |
z- or zb |
将当前行移到屏幕底部 |
以下命令仅在换行关闭时有效:
状态 |
命令 |
描述 |
备注 |
✅ ⭐ |
🔢 zh |
向右滚动 N 个字符 |
在 VSCode 中,当运行此命令时,无论水平滚动条是否移动,光标总会移动 |
✅ ⭐ |
🔢 zl |
向右滚动 N 个字符 |
同上 |
✅ ⭐ |
🔢 zH |
向右滚动半个屏幕宽度 |
同上 |
✅ ⭐ |
🔢 zL |
向左滚动半个屏幕宽度 |
同上 |
插入文本
状态 |
命令 |
描述 |
✅ |
🔢 a |
在光标后方插入文本 |
✅ |
🔢 A |
在行尾插入文本 |
✅ |
🔢 i |
在光标前方插入文本 |
✅ |
🔢 I |
在本行第一个非空字符前插入文本 |
✅ |
🔢 gI |
在第一列前插入文本 |
✅ |
gi |
在最后一次改动处插入文本 |
✅ |
🔢 o |
在当前行的下方插入新行 |
✅ |
🔢 O |
在当前行的上方插入新行 |
以下命令在可视模式下的行为 :
状态 |
命令 |
描述 |
✅ |
I |
在所选行的前方插入相同的文本 |
✅ |
A |
在所选行的后方插入相同的文本 |
插入模式
退出插入模式 :
状态 |
命令 |
描述 |
✅ |
Esc |
退出插入模式 |
✅ |
CTRL-C |
和 Esc 相同,但是不使用缩写 |
✅ |
CTRL-O {command} |
执行命令并返回插入模式 |
其它移动命令 :
状态 |
命令 |
描述 |
✅ |
cursor keys |
移动光标 上/右/左/下 |
✅ |
shift-left/right |
向左(右)移动一个单词 |
✅ |
shift-up/down |
向前或后移动一屏 |
✅ |
End |
将光标移动到当前行的最后一个字符后 |
✅ |
Home |
将光标移动到当前行的第一个字符 |
插入模式下的特殊命令
状态 |
命令 |
描述 |
备注 |
⬇️ |
CTRL-V {char}.. |
插入字符或十进制字节值 |
|
⚠️ |
NL or CR or CTRL-M or CTRL-J |
开启新行 |
不支持 CTRL-M 和 CTRL-J |
✅ |
CTRL-E |
从光标下方插入字符 |
|
✅ |
CTRL-Y |
从光标上方插入字符 |
|
✅ ⭐ |
CTRL-A |
插入之前插入过的文本 |
使用上一个 "插入" 会话中所做的更改, 并且只应用在光标插入下发生的更改 |
✅ ⭐ |
CTRL-@ |
插入之前插入过的文本,然后退出插入模式 |
同上 |
✅ |
CTRL-R {0-9a-z%#:.-="} |
插入寄存器中的内容 |
|
✅ |
CTRL-N |
在光标前插入标识符的下一个匹配项 |
|
✅ |
CTRL-P |
在光标前插入标识符的上一个匹配项 |
|
⬇️ |
CTRL-X ... |
补全光标前的单词 |
|
✅ |
BS or CTRL-H |
删除光标前的字符 |
|
✅ |
Del |
删除光标所在的字符 |
|
✅ |
CTRL-W |
删除光标前的单词 |
|
✅ |
CTRL-U |
删除当前行中所有输入的字符 |
|
✅ |
CTRL-T |
在当前行首插入一个缩进的位移宽度 |
|
✅ |
CTRL-D |
在当前行首删除一个缩进的位移宽度 |
|
⬇️ |
0 CTRL-D |
删除当前行的所有缩进 |
|
⬇️ |
^ CTRL-D |
删除当前行中的所有缩进,在下一行中恢复缩进 |
|
导向图
状态 |
命令 |
描述 |
✅ |
:dig[raphs] |
显示当前导向图列表 |
⬇️ |
:dig[raphs] {char1}{char2} {number} ... |
向列表中添加新的导向图 |
插入特殊内容
状态 |
命令 |
描述 |
⚠️ |
:r [file] |
在光标下面插入[file]的内容 |
⚠️ |
:r! {command} |
在光标下方插入{command}的标准输出 |
删除文本
状态 |
命令 |
描述 |
✅ |
🔢 x |
从光标所处的当前字符开始删除 N 个字符 |
✅ |
🔢 Del |
从光标所处的当前字符开始删除 N 个字符 |
✅ |
🔢 X |
删除光标前的 N 个字符 |
✅ |
🔢 d{motion} |
删除{motion}移动时经过的文本 |
✅ |
{visual}d |
删除高亮文本 |
✅ |
🔢 dd |
删除 N 行 |
✅ |
🔢 D |
删除到行尾 |
✅ |
🔢 J |
连接当前行和下一行(删除空行) |
✅ |
{visual}J |
连接所有高亮的行 |
✅ |
🔢 gJ |
和"J"命令相同, 但是不会在连接处插入空格 |
✅ |
{visual}gJ |
和"{visual}J"命令相同, 但是不会在连接处插入空格 |
✅ |
:[range]d [x] |
删除[range]行,并添加到寄存器 |
文本复制和移动
状态 |
命令 |
描述 |
✅ |
"{char} |
使用寄存器中的{char}进行下一次的删除、复制或粘贴 |
✅ |
"* |
使用寄存器* 访问系统剪贴板 |
✅ |
:reg |
显示寄存器中的所有内容 |
✅ |
:reg {arg} |
显示寄存器中{arg}的内容 |
✅ |
🔢 y{motion} |
把 {motion} 过程覆盖的文本放入寄存器 |
✅ |
{visual}y |
把高亮文本放入寄存器 |
✅ |
🔢 yy |
把当前行开始的 N 行放入寄存器(包含当前行) |
✅ |
🔢 Y |
把当前行开始的 N 行放入寄存器(包含当前行) |
✅ |
🔢 p |
把寄存器中的内容放置到光标后方(执行 N 次) |
✅ |
🔢 P |
把寄存器中的内容放置到光标前方(执行 N 次) |
✅ |
🔢 ]p |
类似于 p,但是会调整当前行的缩进 |
✅ |
🔢 [p |
类似于 p,但是会调整当前行的缩进 |
✅ |
🔢 gp |
类似于 p,但是会在新的文本后留下光标 |
✅ |
🔢 gP |
类似于 p,但是会在新的文本后留下光标 |
修改文本
状态 |
命令 |
描述 |
备注 |
✅ |
🔢 r{char} |
使用{char}替换 N 个字符 |
|
⬇️ |
🔢 gr{char} |
在不影响布局的情况下替换 N 个字符 |
|
✅ ⭐ |
🔢 R |
进入替换模式(重复 N 次输入的文本) |
不支持{count} |
⬇️ |
🔢 gR |
进入可视替换模式: 和替换模式类似,但不会影响布局 |
|
✅ |
{visual}r{char} |
在可视模式中把所有选中的文本替换成{char} |
|
(以下命令为删除文本同时进入插入模式)
状态 |
命令 |
描述 |
✅ |
🔢 c{motion} |
修改移动命令{motion}经过的文本 |
✅ |
{visual}c |
修改高亮文本 |
✅ |
🔢 cc |
修改 N 行(包含当前行) |
✅ |
🔢 S |
修改 N 行(包含当前行) |
✅ |
🔢 C |
修到行尾的内容(包括 N-1 行) |
✅ |
🔢 s |
修改 N 个字符 |
✅ |
{visual}c |
在可视模式下:将选中的内容修改为输入的文本 |
✅ |
{visual}C |
在可视模式下:将选中的行修改为输入的文本 |
✅ |
{visual}~ |
在可视模式下:切换选中内容的大小写状态 |
✅ |
{visual}u |
在可视模式下:将选中的内容切换为小写 |
✅ |
{visual}U |
在可视模式下:将选中的内容切换为大写 |
✅ |
g~{motion} |
切换移动命令{motion}经过文本的大小写状态 |
✅ |
gu{motion} |
将移动命令{motion}经过的文本切换为小写 |
✅ |
gU{motion} |
将移动命令{motion}经过的文本切换为大写 |
✅ |
{visual}g? |
将高亮文本执行 rot13 编码 |
✅ |
g?{motion} |
将移动命令{motion}经过的文本执行 rot13 编码 |
✅ |
🔢 CTRL-A |
将光标处或之后的数字增加 N |
✅ |
🔢 CTRL-X |
将光标处或之后的数字减去 N |
✅ |
🔢 <{motion} |
将移动命令{motion}经过的行向左缩进 |
✅ |
🔢 << |
将 N 行向左缩进 |
✅ |
🔢 >{motion} |
将移动命令{motion}经过的行向左缩进 |
✅ |
🔢 >> |
将 N 行向左缩进 |
✅ |
🔢 gq{motion} |
将移动命令{motion}经过的行格式化到 'textwidth' 长度 |
⬇️ |
:[range]ce[nter][width] |
居中对齐[range]范围内的行 |
⬇️ |
:[range]le[ft][indent] |
左对齐[range]范围内的行 (with [indent]) |
⬇️ |
:[ranee]ri[ght][width] |
左对齐[range]范围内的行 |
复杂的修改
状态 |
命令 |
描述 |
备注 |
⬇️ |
🔢 !{motion}{command}<CR> |
过滤通过{command}移动的行 |
|
⬇️ |
🔢 !!{command}<CR> |
通过{command}过滤 N 行 |
|
⬇️ |
{visual}!{command}<CR> |
通过{command}过滤高亮行 |
|
⬇️ |
:[range]! {command}<CR> |
通过{command}过滤[range]行 |
|
✅ |
🔢 ={motion} |
过滤通过'equalprg'移动的行 |
|
✅ |
🔢 == |
通过 ' 过滤 N 行 |
|
✅ |
{visual}= |
通过'equalprg'过滤高亮行 |
|
✅ ⭐ ⚠️ |
:[range]s[ubstitute]/{pattern}/{string}/[g][c] |
在[range]行中用{string}替换{pattern};用[g]替换所有出现的{pattern};[c],确认每次更换 |
当前只支持 JavaScript 的正则;仅实现了'gi'选项 |
⬇️ |
:[range]s[ubstitute][g][c] |
使用新的范围和选项重复上一个":s" |
|
⬇️ |
& |
在当前行上重得上一个":s",忽略选项 |
|
⬇️ |
:[range]ret[ab][!] [tabstop] |
将'tabstop'设置为新值并调整空格 |
|
可视模式
状态 |
命令 |
描述 |
✅ |
v |
从当前位置开始高亮字符或者停止高亮 |
✅ |
V |
从当前行开始高亮或者停止高亮 |
✅ |
CTRL-V |
高亮块级区域或退出高亮模式 |
✅ |
o |
高亮文本开始与当前光标位置间切换 |
✅ |
gv |
重新打开前一次的高亮区域 |
文本对象 (仅在可视模式下有效)
状态 |
命令 |
描述 |
✅ |
🔢 aw |
选择一个单词 |
✅ |
🔢 iw |
选择一个内置单词 |
✅ |
🔢 aW |
选择一个单词 |
✅ |
🔢 iW |
选择一个内置单词 |
✅ |
🔢 as |
选择一个缓冲区 |
✅ |
🔢 is |
选择一个内置缓冲区 |
✅ |
🔢 ap |
选择一个段落 |
✅ |
🔢 ip |
选择一个内置缓冲区 |
✅ |
🔢 a], a[ |
选择一个中括号区域 |
✅ |
🔢 i], i[ |
选择一个内置中括号区域 |
✅ |
🔢 ab, a(, a) |
选择从"[(" 到 "])"的区域 |
✅ |
🔢 ib, i), i( |
选择从"[(" 到 "])"的内置区域 |
✅ |
🔢 a>, a< |
选择"<>"区域 |
✅ |
🔢 i>, i< |
选择"<>"的内部区域 |
✅ |
🔢 aB, a{, a} |
选择从"[{" 到 "})"的区域 |
✅ |
🔢 iB, i{, i} |
选择从"[{" 到 "})"的内置区域 |
✅ |
🔢 at |
选择标签从<aaa>到 </aaa>的区域 |
✅ |
🔢 it |
选择标签从<aaa>到 </aaa>的内部区域 |
✅ |
🔢 a' |
选择单引号区域 |
✅ |
🔢 i' |
选择单引号内置区域 |
✅ |
🔢 a" |
选择双引号区域 |
✅ |
🔢 i" |
选择双引号内置区域 |
✅ |
🔢 a` |
选择反引号区域 |
✅ |
🔢 i` |
选择反引号内置区域 |
重复性命令
状态 |
命令 |
描述 |
备注 |
✅ ⭐ |
🔢 . |
重复最后一次修改(N:重复次数) |
未发生在光标下的修改无法重复 |
✅ |
q{a-z} |
重复寄存器中{a-z}的字符 |
|
⬇️ |
q{A-Z} |
记录输入的字符,放入寄存器中,对应的标记为小写的{a-z} |
|
✅ |
q |
停止记录 |
|
✅ |
🔢 @{a-z} |
执行 N 次寄存器中{a-z}的内容 |
|
✅ |
🔢 @@ |
重复 N 次前一个:@{a-z} |
|
⬇️ |
:@{a-z} |
将寄存器{a-z}的内容作为 Ex 命令执行 |
|
⬇️ |
:@@ |
重复一次:@{a-z} |
|
⬇️ |
:[range]g[lobal]/{pattern}/[cmd] |
在{pattern}匹配的[range]行上执行 Ex 命令 cmd |
|
⬇️ |
:[range]g[lobal]!/{pattern}/[cmd] |
在{pattern}不匹配的[range]行上执行 Ex 命令 cmd |
|
⬇️ |
:so[urce] {file} |
从{file}读取 Ex 命令 |
|
⬇️ |
:so[urce]! {file} |
从{file}读取 Vim 命令 |
|
⬇️ |
:sl[eep][sec] |
在[sec]秒内不执行任何命令 |
|
⬇️ |
🔢 gs |
休眠 N 秒 |
|
匹配项
状态 |
命令 |
描述 |
备注 |
⬇️ |
:se[t] |
显示所有已修改的选项 |
|
⬇️ |
:se[t] all |
显示所有的 non-termcap 选项 |
|
⬇️ |
:se[t] termcap |
显示所有的 termcap 选项 |
|
✅ |
:se[t] {option} |
设置布尔值选项(打开),显示字符串或数字选项 |
|
✅ |
:se[t] no{option} |
重置布尔值选项(关闭) |
|
✅ |
:se[t] inv{option} |
反转布尔值选项 |
|
✅ |
:se[t] {option}={value} |
将 string/number 选项的值设置成{value} |
|
✅ |
:se[t] {option}+={value} |
将{value}添加到 string 选项, 将{value}添加到 number 选项 |
|
✅ ⭐ |
:se[t] {option}-={value} |
从 string 选项中移除{value}, 从 number 选项中减少{value}的值 |
不支持 string 选项 |
✅ |
:se[t] {option}? |
显示{option}的选项 |
|
⬇️ |
:se[t] {option}& |
重置{option}的值为默认值 |
|
⬇️ |
:setl[ocal] |
类似于":set",但是会给具有本地值的选项设置值 |
|
⬇️ |
:setg[lobal] |
类似于":set",但是会给本地选项设置一个全局值 |
|
⬇️ |
:fix[del] |
根据't_kb'的值设置't_kD'的值 |
|
⬇️ |
:opt[ions] |
打开一个新窗口以查看和设置选项,按功能分组,包含说明和帮助链接 |
|
由于列表太长,这里仅列出已经支持的配置选项
状态 |
命令 |
默认值 |
描述 |
✅ |
tabstop (ts) |
4. 使用 VSCode 而非 Vim 的默认值tabSize |
文件中 tab 代替的空格数 |
✅ |
hlsearch (hls) |
false |
如果存在先前的搜索模式,请突出显示其所有匹配项 |
✅ |
ignorecase (ic) |
true |
在搜索模式中忽略大小写 |
✅ |
smartcase (scs) |
true |
如果搜索模式包含大写字符,则覆盖'ignorecase'选项 |
✅ |
iskeyword (isk) |
@,48-57,_,128-167,224-235 |
关键字包含字母,数字,字符和'_', 如果没有设置 iskeyword,使用 editor.wordSeparators 属性 |
✅ |
scroll (scr) |
20 |
使用 CTRL-U 和 CTRL-D 命令时滚动的行数 |
✅ |
expandtab (et) |
True. 使用 VSCode 而非 Vim 的默认值insertSpaces |
插入时使用空格 |
✅ |
autoindent |
true |
在 noraml 模式下进行 cc 或 S 更换线时保持缩进 |
撤消/恢复 命令
状态 |
命令 |
描述 |
备注 |
✅ |
🔢 u |
撤消前 N 次修改 |
目前的实现可能无法完全涵盖所有情况 |
✅ |
🔢 CTRL-R |
恢复前 N 次撤消的修改 |
同上 |
✅ |
U |
恢复上一次修改过的行 |
|
外部命令
状态 |
命令 |
描述 |
✅ |
:sh[ell] |
开始一个 shell |
✅ |
:!{command} |
在 shell 中执行{command} |
⬇️ |
K |
使用'keyboard prg'程序在光标下查找关键字(默认: "man") |
执行范围
状态 |
命令 |
描述 |
备注 |
✅ |
, |
分隔两个行号 |
|
✅ ⭐ |
; |
同上,在解释第二个行之前将光标设置为第一个行号 |
光标移动不包括在内 |
✅ |
{number} |
绝对行号 |
|
✅ |
. |
当前行 |
|
✅ |
$ |
当前文件的最后一行 |
|
✅ |
% |
等价于 1,$ (整个文件) |
|
✅ |
* |
等价于'<,'> (可视区域) |
|
✅ |
't |
标记 t 的位置 |
|
⬇️ |
/{pattern}[/] |
下一行中匹配{pattern}的地方 |
|
⬇️ |
?{pattern}[?] |
上一行中匹配{pattern}的地方 |
|
✅ |
+[num] |
从前一行号中增加[number](默认值:1) |
|
✅ |
-[num] |
从前一行号中减去[number](默认值:1) |
|
编辑文件
状态 |
命令 |
描述 |
备注 |
✅ ⭐ |
:e[dit] {file} |
编辑 {file}. |
将在当前分组编辑器的新选项卡中打开文件,而不是在当前选项卡中打开 |
多窗口命令
状态 |
命令 |
描述 |
备注 |
✅ ⭐ |
:e[dit] {file} |
编辑 {file}. |
将在当前分组编辑器的新选项卡中打开文件,而不是在当前选项卡中打开 |
✅ ⭐ |
<ctrl-w> hl |
在窗口间进行切换 |
由于在 VSCode 中没有 Window 的概念,这些命令被映射成在分组编辑器之间切换 |
✅ |
:sp {file} |
切分当前窗口 |
|
✅ ⭐ |
:vsp {file} |
将当前窗口在垂直切分 |
|
✅ |
<ctrl-w> s |
将当前窗口一分为二 |
|
✅ ⭐ |
<ctrl-w> v |
垂直方向上将当前窗口一分为二 |
|
✅ |
:new |
水平方向上创建一个新的窗口,同时开始编辑一个空文件 |
|
✅ ⭐ |
:vne[w] |
垂直方向上创建一个新的窗口,同时开始编辑一个空文件 |
|
标签页
状态 |
命令 |
描述 |
备注 |
✅ |
:tabn[ext] 🔢 |
转到下一个标签页或{count}指定的标签页,标签页序号从 1 开始 |
|
✅ |
{count}<C-PageDown>, {count}gt |
同上 |
|
✅ |
:tabp[revious] 🔢 |
转上一个的标签页,在第一个到最后一个标签页间循环 |
|
✅ |
:tabN[ext] 🔢 |
同上 |
|
✅ |
{count}<C-PageUp>, {count}gT |
同上 |
|
✅ |
:tabfir[st] |
跳转到和一个标签页 |
|
✅ |
:tabl[ast] |
跳转到和一个标签页 |
|
✅ |
:tabe[dit] {file} |
在当前标签页之后打开一个新的标签页 |
|
⬇️ |
:[count]tabe[dit], :[count]tabnew |
同上 |
不支持指定数量 |
✅ |
:tabnew {file} |
在当前标签页之后打开一个新的标签页 |
|
⬇️ |
:[count]tab {cmd} |
执行{cmd},当它打开一个新窗口时,打开一个新的标签页 |
|
✅ ⭐ |
:tabc[lose][!] 🔢 |
关闭当前标签页或关闭标签页{count} |
VSCode 将会直接关闭并不会保存文件的修改 |
✅ ⭐ |
:tabo[nly][!] |
关闭其它所有的标签页 |
不支持! , VSCode 将会直接关闭并不会保存文件的修改 |
✅ |
:tabm[ove][n] |
将当前的 tab 页移动到 tab 页 N 之后 |
|
⬇️ |
:tabs |
列出选项卡页面及其包含的窗口 |
可以使用 VSCode 内置的快捷方式: cmd/ctrl+p |
⬇️ |
:tabd[o] {cmd} |
在每一个标签页中执行{cmd}命令 |
|
折叠
折叠方法
可通过‘foldmethod’配置折叠方法。由于依赖于 VSCode 的折叠逻辑,尚不可用。
折叠命令
几乎所有和折叠相关的问题可以在这个issue中找到。
状态 |
命令 |
描述 |
⬇️ |
zf{motion} or {Visual}zf |
创建折叠 |
⬇️ |
zF |
折叠[count]行. 类似于"zf". |
⬇️ |
zd |
删除当前光标下的折叠内容 |
⬇️ |
zD |
递归删除当前光标下所有的折叠内容 |
⬇️ |
zE |
打开窗口中所有的折叠内容 |
✅ |
zo |
打开光标下的折叠内容,当指定数量时,将打开多个折叠内容 |
✅ |
zO |
递归打开当前光标下所有的折叠内容 |
✅ |
zc |
在光标下关闭一个折叠.当给出计数时,关闭多个折叠 |
✅ |
zC |
递归关闭当前光标下所有的折叠内容 |
✅ |
za |
处于关闭的折叠块时,打开折叠块.反之,关闭折叠块 |
⬇️ |
zA |
处于关闭的折叠块时,递归的打开折叠块.反之,递归的关闭折叠块 |
⬇️ |
zv |
查看光标所在行:打开刚好足够的折叠,使光标所在行不折叠 |
⬇️ |
zx |
更新折叠:撤消手动打开和关闭折叠:重新应用'foldlevel',然后执行“zv”:查看光标行 |
⬇️ |
zX |
撤消手动打开和关闭折叠 |
⬇️ |
zm |
折叠更多:从'foldlevel'中减去一个 |
✅ |
zM |
关闭所有的折叠: 将'foldlevel'设为 0. 将设置'foldenable' |
⬇️ |
zr |
减少折叠:在'foldlevel'中添加一个 |
✅ |
zR |
打开所有的折叠. 会将'foldlevel'调整到最高级. |
⬇️ |
zn |
不折叠: 重置'foldenable'. 所有的折叠都会打开 |
⬇️ |
zN |
正常折叠:设置'foldenable'.所有折叠都将像以前一样. |
⬇️ |
zi |
反转'foldenable' |
⬇️ |
[z |
移动到当前打开的折叠块的首部 |
⬇️ |
]z |
移动到当前打开的折叠块的尾部 |
⬇️ |
zj |
向下移动到下一个折叠的开始 |
⬇️ |
zk |
向上移动到上一个折叠的开始 |
折叠配置
当前不支持任何折叠设置,请遵循 VSCode 的配置.