Sublime的右键菜单其实是一个“隐藏菜单”——无法通过常规设置选项直接调出,必须手动编写JSON文件。路径、命名、编码和command名称这四个要素必须完全准确,任何一处错误都会导致菜单彻底消失,且不会显示任何报错或提示信息。

首先需要明确文件存放位置。编辑区(也就是你写代码时右键点击的区域)、标签页或空白编辑区的右键菜单,只识别 Packages/User/Context.sublime-menu 这个路径。而侧边栏(在文件或文件夹上右键)则使用另一套路径:Packages/Context.sublime-menu(注意,此处没有 /User/)。这两个路径互不干扰,如果混用,等于配置无效。
操作上,建议不要手动拼写路径,直接通过菜单栏的 Preferences → Browse Packages… 打开目录,然后进入 User 文件夹操作。Windows系统下路径大致为 %APPDATA%Sublime TextPackagesUserContext.sublime-menu,macOS下为 ~/Library/Application Support/Sublime Text/Packages/User/Context.sublime-menu,Linux下则为 ~/.config/sublime-text/Packages/User/Context.sublime-menu。文件名必须严格命名为 Context.sublime-menu,注意“C”大写,不能包含空格,更不能擅自添加 .txt 或 .json 后缀。
接下来看JSON格式如何编写才能避免“静默失效”。该文件本质上是一个JSON数组,语法稍有偏差——比如漏掉逗号、引号使用中文、多写一个括号——整个文件就会被跳过,你的右键菜单将毫无反应。基础结构必须采用数组形式:[{"caption":"排序行","command":"sort_lines"}]。caption 支持中文,但必须使用英文双引号包裹。如需添加分隔线,写成 {"caption":"-"},不能省略 caption 字段。保存时务必选择 UTF-8 编码,且禁用BOM,带BOM会导致中文乱码或文件加载失败。如果对格式是否合法心存疑虑,不妨将内容粘贴到 jsonlint.com 进行验证。
关于 command 名称,这个字段并非随意填写,必须与命令面板中显示的ID完全一致,大小写敏感,不能有空格,也不能添加 Command 后缀。如何查找?按下 Ctrl+Shift+P(Win/Linux)或 Cmd+Shift+P(macOS),输入关键词搜索,看到相关条目才说明该命令存在。内置命令如 sort_lines、toggle_comment 可直接使用;插件命令如 copy_path、open_in_terminal,则需要先安装对应插件(例如 CopyFilePath、Terminal),且不能禁用。自定义命令如 my_custom,必须由Python插件实际注册,仅修改 Context.sublime-menu 不会生效。
最后提醒一下侧边栏右键菜单的独立配置。很多人误以为一个 Context.sublime-menu 就能覆盖所有右键位置,但侧边栏走的是另一条路径:Packages/Context.sublime-menu(不是 User 目录下)。如果该文件不存在,需要手动创建,而且它不识别 context 字段中的条件判断,只通过路径区分作用域。编辑区右键和侧边栏右键是两套独立配置,不能共用同一个文件。如果希望侧边栏菜单项具备条件(比如只在文件夹上显示),需要借助 context 字段搭配正确的 key 值,例如:{"key": "setting.is_folder", "operator": "equal", "operand": true}。侧边栏文件中的command写错同样会静默失效,验证方法一致:先在命令面板中搜索到该命令,再写入JSON。
最容易被忽视的其实是路径和编码。即便文件放对了位置,但使用了带BOM的UTF-8编码,或者文件名写成 context.sublime-menu(小写c),菜单就会彻底“隐身”。调试时不要凭空猜测,直接打开 Preferences → Browse Packages… 确认当前目录,再检查文件名和编码。这才是真正可靠的排查方法。
