答案:需先用sublime.log_input(true)验证按键是否进入编辑器,再按default→插件default→user顺序排查绑定文件,注意json语法正确性及esc等硬编码键不可配置。

Sublime 的快捷键不是“改了就生效”,而是按加载顺序层层覆盖,且容易被系统或输入法截胡。真正起作用的那条绑定,往往藏在你没注意的插件目录里,或者压根没进编辑器。
怎么确认按键到底进没进 Sublime?
很多“Ctrl+C 复制失效”问题,根本不是 Sublime 忘了复制,而是系统、显卡控制面板或输入法先按下了它。
- 按
Ctrl+`打开控制台,输入sublime.log_input(True)回车 - 再按你想测试的组合键(比如
Ctrl+C或Cmd+Shift+P) - 如果控制台**完全没输出**,说明按键在进 Sublime 前就被拦截了
常见拦截点:NVIDIA 控制面板 里的热键、macOS 的 Spotlight(Cmd+Space)、搜狗/QQ 拼音的中英文切换(常占 Ctrl+Space 或 Ctrl+Shift)。
为什么改了 User 文件还是不生效?
Sublime 的快捷键加载顺序是:Default → 插件自带的 Default.sublime-keymap → User。后加载者胜,但前提是 context 匹配。
- 打开
Preferences → Key Bindings,左右文件同时对比 - 在左侧(Default)搜
"ctrl+/",确认它原本绑定的是toggle_comment - 在右侧(User)和所有插件目录(
Preferences → Browse Packages)里全局搜索同一组"keys" - 找到最后定义它的那个文件——它才是当前生效的
别只盯着 User 文件;Vintage、Emmet、GitGutter 这些插件常在自己的 Default 绑定里悄悄覆盖原生行为。
自定义快捷键写错 JSON 就等于没写
User.sublime-keymap 是 JSON 数组,语法错一个字符,整段配置就静默失效,Sublime 不报错也不提示。
- 必须用双引号包裹键名和字符串值,例如:
"keys"、"command"、"ctrl+alt+f" - 数组末尾不能多逗号,对象末尾也不能多逗号
- 删掉某条绑定 ≠ 注释掉:JSON 不支持
//或/* */,要禁用就删整行,或改成"command": "not_a_real_command" - 保存(
Ctrl+S)后立即生效,无需重启
一个典型有效示例:{"keys": ["ctrl+alt+f"], "command": "format_code"}。少个引号、多个逗号,这条就彻底消失。
Esc 键不能靠 key bindings 修改
Escape 关闭搜索框、命令面板等行为是 Sublime 内核硬编码的,不走任何 .sublime-keymap 文件。
- 你在 User 或插件里手动加
{"keys": ["escape"], "command": "xxx"},只会破坏原生功能 - 验证方式:开控制台输
sublime.log_input(True),按 Esc —— 如果无输出,问题在系统层(如 macOS 未勾选「使用 F1、F2 等键作为标准功能键」) - 如果有输出但 UI 不关闭,大概率是
Vintage、Emacs Pro Essentials这类插件劫持了它,应去对应插件设置里关掉exit_insert_mode_on_escape或close_on_escape
真正难排查的,从来不是哪条 JSON 写错了,而是你根本不知道 Esc 根本不归 key bindings 管。











