右键菜单不生效需检查Context.sublime-menu文件路径是否为Packages/User/Context.sublime-menu、命名是否正确、命令是否存在且已注册、context条件是否匹配,以及JSON语法是否规范。

右键菜单项不生效?检查 Context.sublime-menu 文件位置和命名
Sublime 的右键菜单由 Context.sublime-menu 控制,但它必须放在正确的 Packages 目录下才被识别。常见错误是新建在用户目录外、或文件名拼错(比如写成 context.sublime-menu 小写,或漏掉 .sublime-menu 后缀)。
- 正确路径:
Packages/User/Context.sublime-menu(Windows/macOS/Linux 通用) - 如果用的是插件包(如 SideBarEnhancements),它的右键菜单会叠加在默认之上,但不会覆盖你自己的
Context.sublime-menu - 修改后无需重启 Sublime,保存即生效;若没反应,右键任意位置 → “Show Console”,输入
sublime.log_commands(True),再点右键看控制台是否输出命令——没输出说明文件根本没加载
添加自定义命令到右键菜单:必须匹配命令名且确保已注册
想让右键出现“格式化 JSON”这类选项,光写菜单项不够,command 字段必须对应一个真实存在的命令。这个命令要么是内置的(如 sort_lines),要么是你自己写的插件里的 TextCommand 或 WindowCommand。
- 示例有效条目:
[{"caption": "排序行", "command": "sort_lines", "args": {"case_sensitive": false}}] -
"command"值必须全小写、无空格,和命令类名去掉Command后缀一致(比如JsonFormatCommand对应"command": "json_format") - 如果命令带参数(
args),确保参数名和类型匹配目标命令要求,否则点击后静默失败 - 不确定命令是否存在?打开命令面板(
Ctrl+Shift+P/Cmd+Shift+P),搜关键词,看列出的命令 ID 是什么
菜单显示条件控制:用 context 过滤适用场景
不是所有菜单项都该永远显示。比如“运行 Python 脚本”只应在 .py 文件里出现,“插入时间戳”适合纯文本或 Markdown。靠 context 数组做条件判断。
- 常用上下文键:
key(如selection_empty、is_source)、operator(equal、not_equal)、operand(如source.python、text.html) - 想只在有选中文本时显示“转大写”:
{"caption": "转为大写", "command": "upper_case", "context": [{"key": "selection_empty", "operator": "equal", "operand": false}]} - 多个条件用数组并列,全部满足才显示;
operand值区分大小写,source.python不等于source.Python - 调试技巧:临时加一条
{"caption": "DEBUG: show scope", "command": "echo", "args": {"message": "$scope"}},可看到当前光标处的语法作用域
图标、分隔线、子菜单:简单但容易错格式
Sublime 支持给菜单项加图标(仅限内置图标名)和分隔线,也支持嵌套子菜单,但 JSON 结构稍不注意就解析失败,导致整个菜单不加载。
- 图标只认固定字符串:
"kind": [0, 0, ""](无图标)、"kind": [1, 0, ""](小圆点)、"kind": [2, 0, ""](箭头);不要尝试自定义图片路径 - 分隔线写法:
{"caption": "-", "id": "sep1"},必须是独立对象,不能混在其他项的caption里 - 子菜单靠
children数组,且父项必须有"id"和"children",例如:{"caption": "我的工具", "id": "my-tools", "children": [{"caption": "清理空行", "command": "delete_empty_lines"}]} - JSON 中任何逗号遗漏、引号不闭合、尾随逗号,都会让整个
Context.sublime-menu失效——建议用 Sublime 自带的 JSON 语法高亮+校验(保存时自动提示)
最常被忽略的是作用域匹配精度和命令注册时机:改完菜单文件,如果对应命令来自刚安装的插件,得先触发一次该插件(比如打开对应类型文件),确保它完成初始化,否则菜单项点了也没响应。

















