自定义命令需在packages/user/default.sublime-commands中显式声明caption和command字段才能显示在命令面板;command名须严格按类名转小写下划线规则(如togglecommentcommand→toggle_comment),且插件类必须正确继承textcommand或windowcommand。

命令面板(Ctrl+Shift+P)里看不到你写的命令?不是插件没生效,而是没注册进命令列表。 Sublime 不会自动把所有 TextCommand 或 WindowCommand 暴露到命令面板,必须显式声明才能出现。
怎么让自定义命令出现在命令面板里
Sublime 通过 Default.sublime-commands(或用户目录下的同名文件)控制命令面板显示项。它只读取 JSON 数组里的对象,每个对象需含 "caption" 和 "command" 字段:
-
"caption"是面板里显示的中文/英文描述,支持嵌套菜单格式,如"My Plugin: Toggle Flag" -
"command"必须和插件类名转成的小写下划线完全一致,例如ConvertToUppercaseCommand→convert_to_uppercase - 可选
"args"字段传参,比如{"reverse": true};不写则用默认参数 - 文件路径必须是
Packages/User/Default.sublime-commands,新建即可,无需重启,保存即生效
示例内容:
[{
"caption": "My Tools: Duplicate Line & Uppercase",
"command": "duplicate_line_and_uppercase"
}]
为什么 command 名对不上就永远不显示
类名到命令名的转换规则严格:首字母小写 + 大写字母前加下划线 + 去掉 Command 后缀。常见错误包括:
-
MyCustomCommand→ 错误写成mycustom(漏下划线)或my_custom_command(多写了_command) -
ToggleCommentCommand→ 正确是toggle_comment,不是toggle_comment_command - 类继承错类型:
TextCommand不能响应窗口级操作(如新建文件),此时即使命令名对,执行也会静默失败
验证方式:打开控制台 Ctrl+`,输入 sublime.log_commands(True),再手动从命令面板触发一次,看输出的 command: 是不是你配的值。
如何限制命令只在特定语法或上下文出现
纯靠 Default.sublime-commands 无法做条件过滤。要实现“只在 Python 文件里显示”或“仅当有选区时可用”,得改用 Context.sublime-menu 配合 "context" 规则——但注意:这只能控制右键菜单,**命令面板本身不支持 context 过滤**。
- 真正可行的绕过方式:在插件
run()开头主动判断self.view.score_selector(0, "source.python") > 0,不满足就直接return,命令仍可见但点击无反应 - 更干净的做法:用
is_enabled()方法(TextCommand可选实现),返回False时命令在面板中置灰不可点 -
is_enabled()里能访问self.view,可查语法、选区、光标位置等,比硬编码判断更可靠
插件 reload 后命令面板不更新的常见原因
改完 Default.sublime-commands 或插件代码后,命令面板卡在旧状态,通常是因为:
- JSON 格式错误:多逗号、缺引号、用了中文冒号,导致整个文件加载失败(控制台会报
error loading syntax类似提示) - 命令名大小写不一致:Linux/macOS 下文件系统区分大小写,
myplugin.py里定义MyPluginCommand,但配置里写成myplugin就匹配不上 - 插件未被识别:类没继承
sublime_plugin.TextCommand,或文件没放对路径(必须在Packages/User/下,且以.py结尾) - 缓存残留:极少数情况需执行
Developer: Reload Plugin(Ctrl+Shift+P 输入),但多数时候改完保存就立刻生效
最省事的排查顺序:先确认控制台有没有报错 → 再检查插件类是否被加载(sublime.log_commands(True) 看能否触发)→ 最后核对 Default.sublime-commands 的 JSON 结构和字段拼写。











