Sublime Text 3 快捷键修改必须在 User.sublime-keymap 中以合法 JSON 数组格式添加规则,command 名需通过命令面板或控制台精确获取,避免格式错误、命名错误或 context 缺失导致静默失效。

Sublime Text 3 的快捷键改不了,基本就是 User.sublime-keymap 文件写错了——不是功能不行,是 JSON 格式、command 名、context 条件三者中至少一个没对上。
怎么打开并编辑正确的快捷键文件
点菜单 Preferences → Key Bindings,会并排打开两个文件:左侧是只读的 Default (Windows).sublime-keymap(或对应系统名),右侧才是你要编辑的 User.sublime-keymap。所有自定义必须写在这里,改其他地方无效,升级后还可能被覆盖。
首次打开时右侧常为空,但必须是合法 JSON 数组格式——哪怕只加一条规则,也得用方括号 [ ] 包裹。保存后立即生效,不用重启。
- 右下角弹红字?90% 是 JSON 错:多写了逗号、引号没闭合、用了中文标点、或者
keys里写了"Ctrl+D"(正确是"ctrl+d") - 别手动创建或重命名文件:路径和文件名必须严格为
User.sublime-keymap,大小写不能错 - Windows 用户注意:
super指 Win 键;macOS 才对应 Cmd 键
怎么找对真实的 command 名
写错 command 字段,快捷键就静默失效,不报错也不提醒。网上搜到的旧教程常写 js_format 或 beautify,但这些早已被 eslint_fix、black、autopep8 等替代。
最稳方法只有两个:
- 按
Ctrl+Shift+P打开命令面板,输入功能关键词(如delete line),看到的完整条目就是真实command值,比如run_macro_file - 按
Ctrl+`打开控制台,输入sublime.log_commands(True),再手动点一次菜单操作(如Edit → Line → Delete Line),控制台会输出类似:command: run_macro_file {"file": "res://Packages/Default/Delete Line.sublime-macro"} - 像“删除整行”这种原生功能,根本没叫
delete_line的命令,直接写就白配
怎么安全覆盖默认快捷键(比如 ctrl+d)
直接写 {"keys": ["ctrl+d"], "command": "duplicate_line"},原有“选词”功能就彻底没了,而且没法撤销——Sublime 不提供快捷键回滚机制。
真要覆盖高频键,必须加 context 限定,或显式禁用原键:
- 想让
ctrl+d在无选区时复制整行、有选区时仍选词?得拆成两条规则,分别用"selection_empty": true和"selection_empty": false - 想彻底禁用某个默认键(如屏蔽
ctrl+alt+s防误触),写:{"keys": ["ctrl+alt+s"], "command": "unbound"} - 带参数的命令(如格式化)必须传
args,且必须嵌套在命令对象里:{"keys": ["ctrl+alt+l"], "command": "eslint_fix", "args": {"fix": true}},平级写args无效
怎么让快捷键只在特定场景生效
context 是个数组,里面每个对象是“且”关系,全部满足才触发。常见判断项有:selection_empty、selector(如 "source.python")、preceding_text。
想实现“或”逻辑?不行,得拆成两条独立规则。
- 让 Tab 只在非注释行补全:
{"key": "preceding_text", "operator": "not_regex_contains", "operand": "^\s*//|^\s*#"} - 让
ctrl+enter只在空行插入新行:{"key": "following_text", "operator": "regex_contains", "operand": "^\s*$"} -
context字段必须跟keys、command同级,漏写或位置错,整条规则就静默失效
最常被忽略的是:args 必须是字典,context 必须是数组,JSON 中所有标点必须英文半角,keys 里的键名必须小写、用短横线连接——这些细节错一处,快捷键就等于没配。

















