sublime自定义快捷键需在user.sublime-keymap中编写json格式规则,通过preferences→key bindings打开并编辑右侧文件,保存即生效;command名须用ctrl+shift+p或控制台log_commands实测获取,避免覆盖高频键导致功能失效,冲突时优先换组合键或加context限定。

Sublime 的快捷键不是“修改默认配置”,而是靠在 User.sublime-keymap 里写新规则来覆盖——写对就生效,写错就静默失效,不报错也不提醒。
怎么打开并编辑正确的配置文件
点菜单 Preferences → Key Bindings,会并排打开两个文件:左侧是只读的 Default (Windows).sublime-keymap(或对应系统名),右侧是可编辑的 User.sublime-keymap。所有自定义都必须写在这里,改其他地方无效,还可能被更新覆盖。
首次打开时右侧常为空,但必须保持合法 JSON 数组格式——哪怕只加一条规则,也得用方括号 [ ] 包裹,里面是对象列表:
[{"keys": ["ctrl+alt+d"], "command": "duplicate_line"}]
保存后立即生效,不用重启、不用 reload。
- 右下角弹红字?90% 是 JSON 格式问题:末尾多逗号、引号没闭合、用了中文标点
- 别手动敲大括号和引号——用编辑器自带的 JSON 高亮或装
SublimeLinter-json实时校验 - 想查某功能原本怎么绑的?直接在左侧 Default 文件里搜索关键词,比如
"delete line"
怎么找到准确的 command 名,而不是靠猜
命令名写错,快捷键等于白配。网上搜到的旧名字(比如 js_format)很可能已废弃,必须实测获取当前版本的真实值。
- 最稳方法:按
Ctrl+Shift+P打开命令面板,输入功能关键词(如 “delete line”),看到的条目名就是你要的command值(例如run_macro_file) - 更准的方法:按
Ctrl+`打开控制台,输入sublime.log_commands(True),再手动执行一次目标操作(比如菜单里点“删除行”),控制台会输出类似:command: run_macro_file {"file": "res://Packages/Default/Delete Line.sublime-macro"} - 插件命令名随版本变化频繁,比如
eslint_fix可能替代了旧的fix_js,必须以控制台日志为准
覆盖高频键(如 Ctrl+D、Ctrl+S)要特别小心
直接覆盖 Ctrl+D(原为“选词”)或 Ctrl+S(保存),原有功能就彻底消失,不是变好,是变卡。
- 优先换组合键:用
["ctrl+alt+d"]或["ctrl+shift+delete"],避开系统级劫持(某些 Windows 输入法或显卡驱动会吃掉Ctrl+Alt) - 真要复用,加
context条件区分场景,例如让Ctrl+D在无选区时复制整行,有选区时仍执行原逻辑:{"keys": ["ctrl+d"], "command": "duplicate_line", "context": [{"key": "selection_empty", "operator": "equal", "operand": true}]} - 彻底禁用某个默认键?设
"command": "unbound",比如{"keys": ["ctrl+s"], "command": "unbound"}
带参数和条件的高级绑定怎么写才不报错
args 和 context 不是可有可无的装饰,它们必须作为同级字段,跟 keys 和 command 并列,且格式严格:
-
args是字典,必须嵌套在命令对象里,例如格式化代码常用:{"keys": ["ctrl+alt+f"], "command": "show_overlay", "args": {"overlay": "goto", "text": "@"}} -
context控制生效条件,常见判断项有:"selection_empty"、"preceding_text"、"auto_complete_visible" - 多个
context条件是“且”关系;想实现“或”,得拆成两条独立规则 - 正则匹配要用
"not_regex_contains"或"regex_contains",比如屏蔽注释行:{"key": "preceding_text", "operator": "not_regex_contains", "operand": "^\s*//|^\s*#"}
鼠标快捷键不能写在这里,得另建 .sublime-mousemap 文件——这点常被忽略,一写就失效。











