VSCode扩展API:如何通过contributes commands判断Markdown预览是否聚焦?
解决VSCode中
markdownPreviewFocus无法在全局when条件中使用的问题 我明白你遇到的痛点了——你参考了VSCode官方仓库里markdown-language-features扩展的配置,想在编辑器标题栏的命令中用markdownPreviewFocus==false来控制命令显示,但实际测试发现这个条件根本不生效。
问题根源
markdownPreviewFocus这个上下文键是Markdown预览Webview内部专属的状态,只有在预览面板自身的交互(比如右键菜单、预览内的快捷键触发)场景下,VSCode才会识别这个键。而编辑器标题栏属于全局UI区域,全局上下文无法读取Webview内部的聚焦状态,所以这个条件在这里完全不起作用。
替代解决方案
我们可以用VSCode全局可访问的上下文键组合来实现相同的需求:
场景1:仅在Markdown编辑器激活且预览未聚焦时显示命令
如果你的命令只针对Markdown文件场景,用这个配置:
"editor/title": [ { "command": "extension.my_command", "when": "editorLangId == markdown && !(activeWebviewPanelId == markdown.preview)", "group": "navigation" } ]
场景2:任何非Markdown预览聚焦的场景都显示命令
如果不需要限制为Markdown编辑器,简化条件即可:
"editor/title": [ { "command": "extension.my_command", "when": "!(activeWebviewPanelId == markdown.preview)", "group": "navigation" } ]
原理说明
activeWebviewPanelId是VSCode提供的全局上下文键,代表当前聚焦的Webview面板ID,而Markdown预览面板的固定ID就是markdown.preview。- 通过
!(activeWebviewPanelId == markdown.preview)就能准确判断当前焦点不在Markdown预览面板上。 - 搭配
editorLangId == markdown可以进一步缩小生效范围,只在Markdown编辑器激活时显示命令。
内容的提问来源于stack exchange,提问作者GorvGoyl
相关产品推荐
相关产品推荐

