跳到主要内容

设置上下文是同步还是异步?

结论​

vscode.commands.executeCommand("setContext", key, value) 返回 Thenable,上下文键不会在调用的同一刻就保证被所有菜单读到。要等它完成,再依赖新键去改界面。

展开​

await vscode.commands.executeCommand("setContext", "myext.loggedIn", true);

这是一条发给工作台的命令,不是改一个本地对象。工作台更新键之后,when 才会重算,菜单可能因此出现或消失。

实践上:

  • 登录成功、语言服务器就绪、树选中了特殊节点,再用它驱动菜单。
  • 不要在 setContext 之后立刻假设右键菜单已经变了。
  • 键名加插件前缀,避免覆盖别人的 isActive 这类泛名。
  • 值尽量用布尔、数字、字符串。菜单表达式不好表达复杂对象。

和「视图选中项」相关的上下文,很多时候不必手写 setContext。树节点的 contextValue 会暴露成 viewItem,菜单写 viewItem == method 即可。

插件停用时,自己设置的键不会总被自动清成初始值。如果这个键会把别的菜单卡住,停用前设回 false。

容易讲错的点​

  • 没有 vscode.context.setContext 这种直接 API,就是走 setContext 命令。
  • 把它当成同步函数、不 await,紧接着 executeCommand 一条依赖该键才注册的逻辑,会偶发失败。
  • 上下文键不能替代真正的权限校验。