Sublime的context字段通过node_type等key判断右键位置:{"key":"node_type","operand":"file"}限定侧边栏文件节点,{"key":"node_type","operand":"folder"}限定文件夹,{"key":"node_type","operand":"sidebar"}限定侧边栏整体,{"key":"selection_empty","operator":"equal","operand":false}限定有选中文本时生效。

Context字段怎么判断右键位置?
Sublime 的 context 字段不是用来“识别光标所在语法”或“当前文件类型”的,它只管右键点击时鼠标落在哪类 UI 元素上。真正起作用的是 node_type 和 key 的组合判断。
常见有效判断方式:
-
{"key":"node_type","operator":"equal","operand":"file"}→ 只在侧边栏点文件时生效 -
{"key":"node_type","operator":"equal","operand":"folder"}→ 只对侧边栏文件夹生效 -
{"key":"selection_empty","operator":"equal","operand":false}→ 仅当有文本选中时才显示菜单项 -
{"key":"selector","operator":"equal","operand":"source.python"}→ 在 Python 文件编辑区右键才出现(注意:这是基于语法高亮 scope,不是文件后缀)
别写 {"key":"file_name","operator":"regex_contains","operand":".py$"} —— Sublime 不支持这种写法,file_name 不是合法的 context key,会静默失效。
为什么加了 context 还是不显示菜单项?
最常被忽略的三个硬性条件:
-
Context.sublime-menu必须放在Packages/User/下,放错路径(比如丢进Packages/Default/或插件目录)就完全不加载 - JSON 格式必须合法:末尾不能多逗号,字符串必须双引号,
command名必须和插件实际注册的一致(区分大小写,copy_path≠copyfilepath) -
context是“与”逻辑:多个条件同时满足才显示。比如同时写了node_type和selection_empty,那必须是“侧边栏点文件”且“当前没选中文本”,两个都成立才行
调试建议:打开控制台(Ctrl+`),输入 sublime.log_commands(True),再右键——如果控制台没输出任何命令名,说明菜单项根本没被加载或匹配失败。
如何让同一个命令在不同位置显示不同文字?
Sublime 不支持动态 caption,但可以用多个独立菜单项实现“视觉差异化”。例如想让 delete_line 在编辑区叫“删当前行”,在侧边栏叫“删该文件”,就得写两条:
[{
"caption": "删当前行",
"command": "delete_line",
"context": [{"key":"is_widget","operator":"equal","operand":false}]
}, {
"caption": "删该文件",
"command": "delete_file",
"context": [{"key":"node_type","operator":"equal","operand":"file"}]
}]注意:is_widget 是判断是否在编辑区(非侧边栏、非面板)的可靠方式;而 delete_file 是 SideBarEnhancements 提供的命令,不是内置命令——用之前得确认插件已安装并注册成功。
Context 配合变量传参容易踩什么坑?
$file_path、$file_name 这类变量只能在 args 里用,且不能加引号。写成 "path": "$file_path" 是对的;写成 "path": "$file_path"(带单引号或双引号包裹)就变成字面字符串,传给命令的就是 "$file_path" 四个字符。
另外两个高频错误:
-
args里传路径用了反斜杠:Windows 下必须写成"path": "$file_path\sub"或直接用正斜杠"path": "$file_path/sub"(Sublime 内部兼容) - 想在
caption里显示变量:不行。caption是静态字符串,不解析变量。别试"caption": "Open $file_name",它只会原样显示
复杂点在于:context 判断和 args 变量是两套机制,前者决定“显不显示”,后者决定“传什么值”,它们互不感知。一个菜单项能否生效,只取决于 context 是否匹配;它点下去之后执行什么,才取决于 command + args 的组合是否合法。


















