标识

其他 / Vim

返回目录

✅ - 已完成

✅ ⭐️ - 已完成,基于 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 插入 <Tab>时使用空格
✅ 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 的配置.