sublime text侧边栏右键菜单仅识别packages/user/context.sublime-menu文件,command值须对应真实命令(如side_bar_create_symlink),json格式必须严格正确,变量仅在args中有效,系统级软链创建依赖权限、path及安全调用。

侧边栏右键菜单文件路径必须严格为 Packages/User/Context.sublime-menu
Sublime Text 只认这一个路径的 Context.sublime-menu 文件,放错位置就完全不生效——没报错、没提示、右键菜单也不变。常见错误是丢进 Packages/Default/ 或 Packages/SideBarEnhancements/,甚至新建个 Packages/MyMenu/ 目录也白搭。
正确路径按系统区分:
- macOS:
~/Library/Application Support/Sublime Text/Packages/User/Context.sublime-menu - Windows:
%APPDATA%\Sublime Text\Packages\User\Context.sublime-menu - Linux:
~/.config/sublime-text/Packages/User/Context.sublime-menu
最快确认方式:菜单栏 → Preferences → Browse Packages… → 进入弹出的 User 文件夹,直接在此新建或编辑文件。
command 值必须对应真实可用的命令名,不能拼错或凭空造
菜单项里写的 "command": "create_symlink" 这类值,不是随便起的。Sublime 本身不提供 create_symlink 或 create_hardlink 命令,必须靠插件或自定义插件实现。否则点击菜单项毫无反应,控制台也看不到任何错误。
可行方案有两类:
- 装插件如
SideBarEnhancements,它自带side_bar_create_symlink和side_bar_create_hardlink命令(注意命名细节,多一个side_bar_前缀) - 自己写 Python 插件,放在
Packages/User/下,类名继承sublime_plugin.WindowCommand,并确保def run(self, paths):方法能接收paths参数(即右键选中的文件/文件夹路径)
示例菜单项(依赖 SideBarEnhancements):
[{"caption": "Create Symlink", "command": "side_bar_create_symlink"}, {"caption": "Create Hardlink", "command": "side_bar_create_hardlink"}]
JSON 格式错误会导致整个文件静默失效
Sublime 对 Context.sublime-menu 的 JSON 解析非常严格:末尾多一个逗号、漏引号、用中文标点、缩进混用 tab/spaces,都会让整个文件被忽略。不会报错,右键菜单也不会更新。
检查要点:
- 全部使用英文双引号
",不用单引号或中文引号 - 数组最后一项后面不能有逗号
-
$file_path、$file等变量只在args中有效,不能写在caption里当字符串拼接 - 如果要用变量传参,必须配合支持该变量的命令(比如
side_bar_create_symlink内部会自动处理$file)
软链接命令在 macOS 上需确保 subl 已加入 PATH,且权限正常
即使菜单项能触发命令,最终创建链接仍依赖系统级 ln -s 执行。macOS 下常见卡点:
-
subl命令未配置:执行sudo ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl,再确认/usr/local/bin在$PATH中 - 目标目录无写入权限:比如想在
/usr/local/下建软链,但当前用户没权限,命令会失败(插件通常不反馈具体错误) - 路径含空格或特殊字符:SideBarEnhancements 默认对路径做了 shell 转义,但自定义插件若直接拼接
os.system("ln -s " + path)就可能崩
最稳妥的做法是:在自定义插件中用 subprocess.run() 并显式传参,避免 shell 注入风险,同时捕获 stderr 输出到状态栏便于调试。
真正麻烦的不是写 JSON,而是命令背后那一层系统调用是否干净——路径权限、shell 环境、变量展开时机,任何一个环节断掉,菜单就变成摆设。











