Context.sublime-menu文件必须放在Packages/User/目录下

想给Sublime Text的右键菜单添点“私房菜”?这事儿成败的关键,往往就藏在第一步——文件放对地方了吗?
必须明确一点:Sublime Text只认一个“地址”——Packages/User/Context.sublime-menu。这个文件要是放错了位置,比如误入Packages/Default/或者某个插件的文件夹里,那结果就是菜单项“人间蒸发”,而且整个过程静悄悄的,不会弹出任何错误提示。这大概是配置时最让人头疼的“坑”了。
正确的操作路径很清晰:通过菜单栏的 Preferences > Browse Packages… 打开目录,进入其中的 User 文件夹,然后新建或者编辑那个名为 Context.sublime-menu 的文件。这里有两个细节务必留意:文件后缀必须是 .sublime-menu(可别手滑存成了 .txt),文件编码建议选择 UTF-8,以防出现乱码。
- 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
command 名必须与插件注册名完全一致
文件位置对了,菜单项还是不显示?下一个需要排查的,就是命令(command)名称。
你在配置里写 "command": "copy_path",前提是必须安装了能提供这个命令的插件(比如“CopyFilePath”),并且名称要一字不差。把 copy_path 写成 copy_filepath,或者大小写弄错,菜单项照样不会出现。命令名是区分大小写的,而且它必须已经成功注册到了Sublime的命令系统中。
怎么验证一个命令是否存在?有个很实用的方法:按下 Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS)调出命令面板,直接输入你打算使用的命令关键词搜索。如果搜不到 copy_path,那通常意味着:对应的插件根本没安装、被禁用了,或者你把命令名记错了。
另外几个配置时的小贴士:
- 命令来源:像
sort_lines是Sublime内置命令,open_in_terminal通常由Terminal插件提供,reveal_in_finder(或对应Windows的reveal_in_explorer)也是内置的。 - 参数变量:在
"args"里使用像$file_path这样的变量时,注意它们是运行时由Sublime自动替换的,不要自己加引号写成"$file_path",否则传递出去的就是这个带美元符号的字符串字面量,而非真实的文件路径。 - 添加分割线:想在菜单项之间加一条分隔线,使用
{"caption": "-"}即可,caption这个字段不能省略。
用 context 控制菜单只在侧边栏或文件上出现
默认情况下,你在 Context.sublime-menu 里定义的每一项,会在编辑区、侧边栏、文件标签页的右键菜单里统统出现。但有时候,我们只希望某个功能出现在特定场景,比如“在终端中打开当前目录”这个选项,显然只应该在侧边栏的文件夹上点击右键时才出现。
这时候,就得请出 context 这个过滤数组了。它就像一组条件判断,告诉Sublime在什么上下文环境下才显示这个菜单项。
其中,node_type 是最常用也最可靠的判断依据:在侧边栏点击时,它的值是 "sidebar";在编辑区点击,是 "text";在文件标签页点击,则是 "tab"。你可以在 context 数组里放置多个条件,它们之间是“且(AND)”的关系,必须全部满足才会显示。
- 仅限侧边栏显示:
"context": [{"key": "node_type", "operand": "sidebar"}] - 仅限Python文件的编辑区显示:
"context": [{"key": "selector", "operator": "equal", "operand": "source.python"}] - 同时满足侧边栏且已有文件被选中:
"context": [{"key": "node_type", "operand": "sidebar"}, {"key": "selection_empty", "operator": "equal", "operand": false}]
系统级右键(资源管理器)和 Sublime 内部右键是两套机制
这里有个非常重要的概念区分:你在Windows资源管理器(或macOS的Finder)里,对文件右键看到的“Open with Sublime Text”选项,与你在Sublime Text软件内部的侧边栏里右键看到的菜单,完全是两套独立的系统。
前者是通过修改操作系统注册表(Windows)或创建`.dmg`服务(macOS)来实现的,后者才完全由我们正在讨论的 Context.sublime-menu 文件控制。两者互不干扰。
如果你想在系统右键菜单中添加Sublime Text的入口,以Windows为例,需要操作注册表:
- 针对文件右键:修改
HKEY_CLASSES_ROOT*shell下的键值,调用参数通常使用%1代表文件路径。 - 针对文件夹空白处右键:修改
HKEY_CLASSES_ROOTDirectoryBackgroundshell下的键值,参数使用%V代表目录路径。 - 命令格式:可执行文件的路径必须用双引号包裹,并且路径中的反斜杠需要双写。一个完整的命令示例看起来是这样的:
"C:\Program Files\Sublime Text\sublime_text.exe" -n "%V"。其中的-n参数很关键,它能确保每次都打开一个新窗口;如果缺少这个参数,可能会复用已存在的窗口,导致新打开的文件不聚焦。
话说回来,在配置Sublime内部右键菜单时,还有一个隐蔽的“坑”值得警惕:那就是 context 条件与变量作用域的耦合问题。举个例子,如果你的菜单项命令中使用了 $file_path 这个变量,却没有用 context 限定 node_type 为 sidebar,那么当你在编辑区(没有具体文件节点)点击右键时,这个变量就是空的。这可能导致命令执行失败或者被跳过,但Sublime通常不会给出明确提示。遇到这种菜单项“时灵时不灵”的情况,就得仔细检查一下上下文条件和变量的匹配关系了。
