sublime快捷键失效主因是user.sublime-keymap格式错误、command名不准确或context配置不当;须用命令面板或控制台日志获取真实command,严格遵循json语法和上下文规则。

Sublime 的快捷键改不了,是因为你没写对 User.sublime-keymap 文件——不是功能缺失,是格式、命令名、上下文三处任一出错,它就静默失效。
怎么找到真实可用的 command 名
别猜、别搜旧教程、别信插件 README 里写的“推荐快捷键”。Sublime 不校验 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"} - 插件命令(如格式化)必须查当前插件文档或实测:
js_format已基本被eslint_fix、black或autopep8替代,填错名等于白配
User.sublime-keymap 文件怎么写才不报错
右下角弹红条?90% 是 JSON 格式崩了。这个文件对语法极其敏感,一个中文引号、多一个逗号、少一个方括号,整条规则都失效。
- 文件必须是合法 JSON 数组:以
[开头、]结尾,哪怕只加一条规则也要包进去 - 每条规则是对象,至少含
"keys"和"command"两个字段,例如:{ "keys": ["ctrl+alt+l"], "command": "eslint_fix" } - 多条规则之间用英文逗号分隔,末尾不能有逗号
- 所有标点必须是英文半角,引号必须是英文双引号,
keys里的键名要小写、用短横线连接("ctrl+shift+k"✅,不是"Ctrl+Shift+K"❌)
怎么让快捷键只在特定场景生效
想让 Tab 只在非注释行补全,或让 Ctrl+D 在无选区时复制整行、有选区时仍选词?靠 context 字段。
-
context是个数组,里面每个对象是“且”关系,全部满足才触发 - 常见判断项:
"selection_empty"(是否无选区)、"selector"(当前语法类型,如"source.python")、"preceding_text"(光标前文本) - 屏蔽注释行示例:
{"key": "preceding_text", "operator": "not_regex_contains", "operand": "^\s*//|^\s*#"} - 想实现“或”逻辑?不行,得拆成两条独立规则,分别写不同
context
带参数的命令怎么传 args
很多命令没 args 就根本不干活,比如打开命令面板、跳转函数列表、运行宏——args 必须是字典,嵌套在命令对象里,不能平级写。
- 错误写法:
{ "keys": ["ctrl+p"], "command": "show_overlay", "overlay": "goto", "text": "@" }(overlay平级了) - 正确写法:
{ "keys": ["ctrl+p"], "command": "show_overlay", "args": { "overlay": "goto", "text": "@" } } - 原生“删除整行”不是
delete_line,而是run_macro_file+args.file路径,漏掉args就没反应 - 鼠标快捷键(如右键菜单、双击)必须另建
Default.sublime-mousemap,不在同一个文件里管
真正容易被忽略的不是语法细节,而是 context 的边界条件——比如 "setting.is_widget" 漏判,就会在命令面板里误触;又比如 preceding_text 正则没写 ^ 锚定开头,可能匹配到中间注释。这些地方不实测,光看文档永远调不对。











