先确认按键是否进入Sublime:执行sublime.log_input(True)后无输出说明被系统/输入法/驱动截断;有输出则检查加载顺序(Default→插件Default→User)、插件冲突及User.sublime-keymap的JSON语法错误。

快捷键没反应,90% 不是 Sublime 坏了,而是被插件或系统劫走了——改 User.sublime-keymap 只能解决“内部覆盖”问题,不能抢回被截断的按键。
怎么确认按键到底进没进 Sublime
这是所有排查的第一步。按 Ctrl+` 打开控制台,输入 sublime.log_input(True) 回车,再按你怀疑失效的组合键(比如 ctrl+/ 或 ctrl+shift+p):
- 控制台完全没输出 → 按键在进 Sublime 前就被吃掉了:Windows 用户重点查 NVIDIA 控制面板、Intel Graphics Command Center 的热键;macOS 用户检查「系统设置 → 键盘 → 快捷键」里 Spotlight 或输入源是否占用了同名组合
- 有输出类似
key evt: ctrl+shift+k→ 按键进了 Sublime,问题出在绑定加载顺序或规则冲突 - 中文输入法(搜狗、QQ 拼音)默认拦截
ctrl+shift,切英文输入法再试一次
为什么改了 User.sublime-keymap 还是不生效
Sublime 加载快捷键的顺序是:Default → 插件自带的 Default.sublime-keymap → User.sublime-keymap。后加载的规则会静默覆盖前面的,且不报错。
- 用
Ctrl+Shift+P输入Preferences: Key Bindings,左右并排打开文件,在左侧 Default 里搜你想用的组合(比如"ctrl+/"),确认它原本对应toggle_comment - 在右侧 User 和所有插件目录(
Preferences → Browse Packages)里全局搜索同一"keys"字段——只要某个插件(如 Vintage、Emmet、Origami)在自己的Default.sublime-keymap里写了相同组合,你的 User 配置就压根不会执行 - 临时验证:运行
subl --safe-mode(命令行启动),如果这时快捷键正常,基本坐实是插件冲突
User.sublime-keymap 写错 JSON 就等于没写
这个文件是纯 JSON 数组,不是 JS 对象,也不是配置文件。一个字符错误就会导致整份配置静默失效,右下角可能只闪一下红字提示,稍不注意就错过。
- 必须用英文双引号包裹所有键名和字符串值:
"keys"不是keys,"ctrl+alt+f"不是"Ctrl+Alt+F" - 数组结尾不能多逗号:
["ctrl+alt+f"],是错的,["ctrl+alt+f"]才对 - 不支持
//或/* */注释;要禁用某条绑定,直接删整行,或改成"command": "unbound" - 保存后立即生效,不用重启,但得确保没其他插件在更靠后的位置又绑了一次
Esc 键关不了面板?别碰 Key Bindings
escape 关命令面板、关搜索框、关替换栏,是 Sublime 内核硬编码行为,不走任何 .sublime-keymap 流程。
- 你在
User.sublime-keymap里加{"keys": ["escape"], "command": "hide_panel"}不仅无效,还会破坏原生逻辑(比如按 Esc 后面板卡住不隐藏) - Esc 失效且
sublime.log_input(True)无输出 → macOS 检查是否勾选「使用 F1、F2 等键作为标准功能键」,或键盘固件层问题 - Esc 失效但
log_input有输出 → 很可能是 Vintage 或 Origami 插件劫持,需进对应插件设置关掉exit_insert_mode_on_escape或close_on_escape
真正难处理的从来不是怎么写新规则,而是搞清“谁在最后说话”——系统、驱动、输入法、插件、Default、User,层层叠加,而 Sublime 从不告诉你哪一层赢了。


















