如何在VSCode中枚举所有打开文档(包括previewHTML)?
获取VSCode中previewHTML创建的打开文档
要解决workspace.textDocuments不包含previewHTML创建的文档这个问题,得先明白:这类文档属于自定义编辑器文档,VSCode的标准文本文档集合不会把它们纳入进去。下面给你两种实用的解决方案:
方法一:遍历可见编辑器筛选
所有打开的编辑器(包括previewHTML创建的)都会出现在vscode.window.visibleTextEditors列表里,你可以遍历这个列表,提取对应的文档并筛选出你需要的URI:
// 获取所有可见编辑器关联的文档 const allOpenEditors = vscode.window.visibleTextEditors; const myOpenDocs = allOpenEditors .map(editor => editor.document) // 替换成你的provider对应的URI scheme或其他标识 .filter(doc => doc.uri.scheme === "your-custom-scheme");
不过要注意:这个方法只能获取当前可见的标签页文档,如果有后台隐藏的标签,可能不会被包含进来。
方法二:在自定义编辑器提供者内部跟踪(推荐)
最可靠的方式是在你注册的CustomEditorProvider里自己维护一个已打开文档的集合,利用openCustomDocument和closeCustomDocument生命周期事件来更新这个集合:
import * as vscode from "vscode"; export class MyPreviewEditorProvider implements vscode.CustomEditorProvider { // 用Set存储已打开的文档URI,避免重复 private readonly openDocuments = new Set<vscode.Uri>(); async openCustomDocument(uri: vscode.Uri): Promise<vscode.CustomDocument> { // 文档打开时加入集合 this.openDocuments.add(uri); return { uri, // 文档关闭时从集合移除 dispose: () => this.openDocuments.delete(uri) }; } // 对外提供获取已打开文档的方法 public getOpenDocuments(): vscode.Uri[] { return Array.from(this.openDocuments); } // 其他provider必要方法(比如resolveCustomEditor)... }
之后,当你需要对比URI时,直接调用getOpenDocuments()就能拿到所有通过你的previewHTML打开的文档URI了。这种方法能准确跟踪所有打开的文档,不管是不是可见状态。
补充说明
workspace.textDocuments只包含VSCode认定的"标准文本文档"(比如代码文件、markdown文件等),而previewHTML创建的自定义编辑器文档不属于这个范畴,所以不会被收录。上面两种方法分别对应临时查询和长期跟踪的场景,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者Mike Lischke
相关产品推荐
相关产品推荐

