sublime text的vim模式分原生vi_mode、内置vintage、第三方vintageous三条互斥路径:状态栏显示normal/insert为vi_mode;hjkl可动但无标识多为vintage;支持visual/.重复等即vintageous;三者不可共存,改配置后须彻底重启才生效。

Sublime Text 的 Vim 模式不是“开个开关就 Vim 了”,它分三类实现路径:原生 vi_mode、内置 Vintage 插件、第三方 Vintageous。选错路径,dd 不删行、ciw 直接报错、:set number 永远不生效——不是你配错了,是根本没走对那条路。
怎么确认自己用的是哪套 Vim 模式
打开任意文件,按 Esc 后立刻看状态栏右下角:
- 显示
NORMAL或INSERT→ 用的是 Sublime Text 4+ 原生vi_mode(需用户设置含"vi_mode": true) - 显示空白或无反应,但
h/j/k/l能移动光标 → 很可能是Vintage(检查ignored_packages是否已移除"Vintage") - 显示
VISUAL、REPLACE或支持"ayy、.重复 → 那是Vintageous,且Vintage必须已被禁用(ignored_packages里必须含"Vintage")
三者互斥,不能共存。改配置后必须彻底退出 Sublime 再重开,热重载不加载新模式。
dd、yy、p 不工作?先查模式再补绑定
原生 vi_mode 默认只支持导航和模式切换,dd 等操作符-动作组合需手动加键绑定;Vintage 支持 dd/yy/p,但不支持 ciw 或寄存器;Vintageous 全支持,但安装后会自动把 Vintage 加回 ignored_packages。
若用 vi_mode 且想启用 dd,在 Preferences → Key Bindings – User 中添加:
[
{"keys": ["d", "d"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Line.sublime-macro"}},
{"keys": ["y", "y"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Copy Line.sublime-macro"}},
{"keys": ["p"], "command": "paste"}
]
注意:Vintage 和 Vintageous 的键绑定规则不同,不能混用同一套 JSON;vi_mode 下 Ctrl+[ 等价于 Esc,且更稳定(避开输入法劫持)。
为什么 :w 成功但 :q 报错或静默失败
这是设计限制,不是 bug。只有 Vintage 实现了极简 Ex 命令子集::w 和 :q! 可用,:q、:e、:set number 全部不识别。因为 Vintage 没有命令行解析器,只硬编码响应两个字符串。
行号必须通过菜单开启:View → Line Numbers,或设 "line_numbers": true 在用户设置中;搜索用 /keyword + Enter,n/N 跳转是完整的;:wq 会失败,保存并关闭请分两步::w → :q!。
别试图用 :set paste —— 这个命令在 Vintage 和 vi_mode 中都不存在,粘贴前只需确保在命令模式下按 i 进入插入模式即可,缩进混乱问题靠 auto_indent 和 detect_indentation 设置控制。
自定义退出键(比如 jj)必须加 context 判断
直接写 {"keys": ["j", "j"], "command": "exit_insert_mode"} 会导致在正常编辑时误触发——比如你真想打 jj 两个字符,结果光标突然跳回命令模式。
正确写法必须加 context,限定只在插入模式下生效:
[
{
"keys": ["j", "j"],
"command": "exit_insert_mode",
"context": [
{ "key": "setting.command_mode", "operand": false },
{ "key": "setting.vintage", "operand": true }
]
}
]
其中 "setting.vintage" 为 true 表示当前启用的是 Vintage(不是 vi_mode);若用 Vintageous,context 应改为 "setting.vintageous_mode";原生 vi_mode 不支持这种双键退出,只能用 Esc 或 Ctrl+[。
最易被忽略的点:不同模式下,同一个快捷键可能对应完全不同的底层 command 名称,复制粘贴别人的键绑定前,先确认你用的是哪一套 Vim 路径。











