条件子句怎么写,菜单不出现先查什么?
结论
when 用上下文键写布尔表达式,决定菜单、快捷键、视图何时出现。菜单不出现时,先对一下命令 id、菜单贡献点、when 的键和当前真实上下文,而不是先怀疑 registerCommand 没执行。
展开
{
"command": "myext.extract",
"when": "editorLangId == typescript && !editorReadonly",
"group": "navigation"
}
常用键:
editorLangId、editorReadonly、editorHasSelection、resourceScheme、resourceExtnameview == myext.explorer、viewItem == folder- 自己用
setContext放进去的键,例如myext.loggedIn
表达式支持 ==、!=、&&、||、!、=~ 正则,以及 in。字符串字面量一般不加引号,和键名的区分靠上下文键规则。
排查顺序:
- 命令 id 在
commands、menus、registerCommand三处是否同一个。 - 菜单挂的位置对不对。编辑器右键是
editor/context,视图标题是view/title,树节点右键是view/item/context。 - 打开开发人员工具里的「检查上下文键」,看
when里每个键的当前值。 - 视图菜单还要看是不是写了
when: view == 你的视图id。没写的话,这个按钮会出现在所有视图上;写错 id 则永远不出现。 - 插件是否激活不影响菜单声明本身。声明在激活前就应该可见。看不见通常是
when或贡献点,不是 activate 没跑。
group 决定同一菜单里的分段和排序,例如 navigation@1。
容易讲错的点
- 上下文键区分大小写,和配置项不是一回事。
- 资源管理器的资源要用
resourceScheme、resourceLangId,不要用只在编辑器焦点下才有的editorLangId。 - 正则
=~写错容易让整个子句为假,而且没有明显报错。