右键菜单未生效需检查三方面:一是Context.sublime-menu文件路径和命名是否正确;二是command值是否与实际命令名一致,可通过控制台日志确认;三是context条件是否合理,避免逻辑冲突导致菜单隐藏。

右键菜单文件没生效?先确认路径和文件名
Sublime 的右键菜单由 Context.sublime-menu 文件控制,它必须放在正确的 Packages 目录下,且文件名不能拼错(大小写敏感、不能带空格或后缀错误)。常见错误是把文件丢进 Packages/User/ 但命名为 context_menu.json 或 Context Menu.sublime-menu —— 正确名称只能是 Context.sublime-menu。
验证路径是否正确:
- Windows:
%APPDATA%\Sublime Text\Packages\User\ -
macOS:
~/Library/Application Support/Sublime Text/Packages/User/ - Linux:
~/.config/sublime-text/Packages/User/
如果已有同名文件但不生效,用 Sublime 菜单 Preferences → Browse Packages… 打开目录,直接在 User/ 下新建或替换,避免多层嵌套或放错位置。
添加自定义命令:用 command + args 调用内置或插件功能
右键菜单项本质是触发一个 Sublime 命令,可以是内置命令(如 copy、toggle_comment)或已安装插件提供的命令(如 expand_selection 或第三方插件的 js_format)。关键在 command 字段值必须与命令实际注册名完全一致;查命令名最可靠方式是打开 Tools → Developer → Show Console,然后执行 sublime.log_commands(True),再手动点一次对应功能,控制台会输出类似 command: copy {"event": {"button": 2}} 的日志——里面的 copy 就是你要填的 command 值。
示例:在右键加一个「复制当前行」功能:
[
{
"caption": "复制当前行",
"command": "copy",
"args": {"scope": "line"}
}
]
注意:args 不是所有命令都支持,比如 copy 默认复制选区,加 {"scope": "line"} 才能自动扩展到整行;而 toggle_comment 则通常不需要 args,直接调用即可。
控制显示条件:用 context 限定菜单出现时机
没有 context 的菜单项默认始终显示,容易污染右键。实际中应按场景过滤,比如只在编辑器区域(非侧边栏)、只在有选中文本时、或只在特定语法(如 Python)下才出现。
context 是一个数组,每项是键值对,常用字段包括:
-
"key": "selection_empty"→ 值为false表示“有选区时显示” -
"key": "selector"→ 值为"source.python"表示仅 Python 文件生效 -
"key": "is_sidebar_visible"→ 值为false表示“不在侧边栏时显示”
示例:只在 Python 文件中、有选区时显示「格式化选区」(假设已装 Black 插件并注册了 black 命令):
[
{
"caption": "格式化选区(Black)",
"command": "black",
"context": [
{"key": "selector", "operator": "equal", "operand": "source.python"},
{"key": "selection_empty", "operator": "equal", "operand": false}
]
}
]
调试失败:JSON 格式、命令不存在、权限或缓存问题
菜单不更新最常见的三个原因:
- JSON 语法错误(缺逗号、引号不闭合、末尾多逗号)→ Sublime 启动时会静默忽略整个文件,不会报错,建议用在线 JSON 验证器检查
- 命令名拼错或插件未启用 → 在控制台运行
view.run_command("your_command_name")测试是否报AttributeError: 'NoneType' object has no attribute 'run_command'或Unknown command - 修改后没重启 Sublime 或没刷新上下文 → 修改
Context.sublime-menu后,关闭所有窗口再重开;或者用快捷键Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Reload Context Menu(需安装插件ContextReload)
真正麻烦的是 context 条件组合太复杂导致逻辑失效,比如同时判断 selector 和 selection_empty 时,其中一个条件不满足就整个菜单项消失——建议每次只加一个条件,逐步验证。










