跳到主要内容

条件子句怎么写,菜单不出现先查什么?

结论​

when 用上下文键写布尔表达式,决定菜单、快捷键、视图何时出现。菜单不出现时,先对一下命令 id、菜单贡献点、when 的键和当前真实上下文,而不是先怀疑 registerCommand 没执行。

展开​

{
"command": "myext.extract",
"when": "editorLangId == typescript && !editorReadonly",
"group": "navigation"
}

常用键:

  • editorLangId、editorReadonly、editorHasSelection、resourceScheme、resourceExtname
  • view == myext.explorer、viewItem == folder
  • 自己用 setContext 放进去的键,例如 myext.loggedIn

表达式支持 ==、!=、&&、||、!、=~ 正则,以及 in。字符串字面量一般不加引号,和键名的区分靠上下文键规则。

排查顺序:

  1. 命令 id 在 commands、menus、registerCommand 三处是否同一个。
  2. 菜单挂的位置对不对。编辑器右键是 editor/context,视图标题是 view/title,树节点右键是 view/item/context。
  3. 打开开发人员工具里的「检查上下文键」,看 when 里每个键的当前值。
  4. 视图菜单还要看是不是写了 when: view == 你的视图id。没写的话,这个按钮会出现在所有视图上;写错 id 则永远不出现。
  5. 插件是否激活不影响菜单声明本身。声明在激活前就应该可见。看不见通常是 when 或贡献点,不是 activate 没跑。

group 决定同一菜单里的分段和排序,例如 navigation@1。

容易讲错的点​

  • 上下文键区分大小写,和配置项不是一回事。
  • 资源管理器的资源要用 resourceScheme、resourceLangId,不要用只在编辑器焦点下才有的 editorLangId。
  • 正则 =~ 写错容易让整个子句为假,而且没有明显报错。