自定义快捷键必须写入User.sublime-keymap文件,保持合法JSON数组格式;command名须通过命令面板或控制台实测获取;高频键如Ctrl+D需用context区分场景;鼠标键和跨平台键名需单独处理。

直接编辑 User.sublime-keymap 文件,不是改默认配置
Sublime Text 的快捷键机制是“覆盖式绑定”,不是“修改默认值”。你无法在 Default (Windows).sublime-keymap 里改东西生效——它只读,而且每次升级可能重置。所有自定义必须写在右侧打开的 User.sublime-keymap 文件里,保存即生效,无需重启。
首次打开时该文件常为空,但必须保持合法 JSON 数组格式:哪怕只加一条规则,也得用方括号 [ ] 包裹,例如:
[{"keys": ["ctrl+alt+s"], "command": "save"}]
常见静默失效原因:末尾多逗号、引号用成中文、括号不匹配、混入空格或制表符。右下角弹红字?90% 是这里错了。
command 名必须实测获取,不能靠搜或猜
网上教程里写的 delete_line、js_format 这类命令名,在当前版本(2026 年主流安装)基本都已失效。写错 command 字段,快捷键就完全不响应,且不报错。
- 最稳方法:按
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"} - 注意:很多“原生功能”实际由
run_macro_file驱动,漏掉args或路径写错,照样不触发
覆盖 Ctrl+D、Ctrl+S 这类高频键要加 context 限定
直接把 ctrl+d 绑给 duplicate_line,多光标选择功能就永久丢失;把 ctrl+s 改成别的,保存动作就卡死——这不是增强,是破坏工作流。
真要复用这些键,必须用 context 拆分场景:
[<br> {<br> "keys": ["ctrl+d"],<br> "command": "duplicate_line",<br> "context": [<br> {"key": "selection_empty", "operator": "equal", "operand": true}<br> ]<br> },<br> {<br> "keys": ["ctrl+d"],<br> "command": "find_under_expand",<br> "context": [<br> {"key": "selection_empty", "operator": "equal", "operand": false}<br> ]<br> }<br>]
其他常用 context 判断项:
-
{"key": "selector", "operator": "equal", "operand": "source.python"}—— 仅在 Python 文件中生效 -
{"key": "setting.auto_indent", "operator": "equal", "operand": true}—— 仅当开启自动缩进时生效 - 查当前作用域:在目标文件中按
Ctrl+Shift+P→ 输入show_scope_name,看状态栏显示的最前缀(如source.json)
鼠标快捷键和跨平台键名要单独处理
鼠标按键(如右键、滚轮点击)的绑定不走 User.sublime-keymap,得新建 Default (Windows).sublime-mousemap(Linux/macOS 同理),并放在相同路径下。文件名必须带系统后缀,否则不加载。
键名大小写和平台差异也很关键:
-
keys字段里的键名必须全小写:"ctrl+d"✅,"Ctrl+D"❌ -
super在 Windows/Linux 上对应 Win 键,在 macOS 上才对应 Cmd 键 - 某些组合键(如
ctrl+alt)在 Windows 下可能被输入法或显卡驱动劫持,建议优先测试ctrl+shift或ctrl+alt+shift
真正容易被忽略的是 context 的粒度——写 "selector": "source" 看似宽泛,但实际匹配不到任何文件;必须精确到 source.python 或 text.html.basic 才能生效。没反应?先 show_scope_name,别急着删重写。










