You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:42:35