必须用sublime.log_input(true)和sublime.log_commands(true)定位拦截层:无key evt输出说明被系统/输入法/驱动截断;有key evt但无command输出说明绑定被覆盖或command名错误;加载顺序为default→插件default→user,后加载者静默覆盖。

Sublime Text 插件默认按键冲突不能靠猜,必须用 sublime.log_input(True) 和 sublime.log_commands(True) 定位真实拦截层——90% 的“失效”根本不是配置问题,而是按键压根没进编辑器,或被插件静默覆盖。
按键是否进了 Sublime?先看控制台有没有 key evt 输出
按 Ctrl+` 打开控制台,输入 sublime.log_input(True) 回车,再按你怀疑失效的组合键(如 Ctrl+/、Esc、Cmd+Shift+P):
- 控制台完全没输出 → 按键被系统/输入法/显卡驱动截断,Sublime 根本没收到
- Windows 常见拦截点:
NVIDIA 控制面板 → 热键、Intel Graphics Command Center → 快捷键、搜狗/QQ 拼音的Ctrl+Shift切换 - macOS 常见拦截点:系统设置 → 键盘 → 快捷键 →
输入源(禁用Cmd+Space或Cmd+Shift+P)、未勾选「使用 F1、F2 等键作为标准功能键」时Esc可能被键盘固件吞掉
按键进了 Sublime 但功能不对?查 command: 日志和加载顺序
如果 sublime.log_input(True) 有输出(如 key evt: ctrl+k),再输 sublime.log_commands(True),重按同一组合键:
- 出现
command: emmet_expand_abbreviation→ 不是没绑定,而是被 Emmet 插件抢了 - 出现
command: not_a_real_command或无command:行 → 绑定被覆盖、command名拼错(如toggle_comments多了个s),或context条件不满足 - Sublime 加载顺序固定为:
Default→ 插件自带的Default.sublime-keymap→User.sublime-keymap;后加载者静默覆盖前一个,不报错也不提示
User.sublime-keymap 写错 JSON 就等于没写
这个文件是纯 JSON 数组,语法错一点整份配置就静默失效,右下角红字一闪而过极易忽略:
- 所有键名和字符串值必须用英文双引号:
"keys"不是keys,"toggle_comment"不是toggle_comment - 数组结尾不能多逗号:
["ctrl+alt+f"],是错的,["ctrl+alt+f"]才对 - 不支持
//或/* */注释;要临时禁用某条绑定,删整行,或改成"command": "not_a_real_command" - 保存后立即生效,无需重启,但得确保没其他插件在更靠后位置又绑了一次相同组合
某些键根本不走 .sublime-keymap 流程
Esc 关命令面板、搜索框、替换栏,是 Sublime 内核硬编码行为,不经过任何 keymap 文件:
- 你在
User.sublime-keymap里加{"keys": ["escape"], "command": "hide_panel"}不仅无效,还可能破坏原生逻辑 -
Esc失效时,先运行subl --safe-mode:若恢复,说明是插件劫持(常见于Vintage、Origami);Vintage需进Preferences → Package Settings → Vintage → Settings设"exit_insert_mode_on_escape": false -
Cmd+B在 macOS 下常被 Finder 或 Dock 占用,排查路径是:系统设置 → 键盘 → 快捷键 → 应用快捷键,搜索并删掉对应条目
真正难处理的不是怎么改配置,而是确认哪一层在起作用——系统拦截、插件覆盖、JSON 格式错误、还是内核硬编码,四类问题必须分清,否则改半天也白搭。











