– 代理会话日,2月19日

文档选择器

扩展可以通过语言、文件类型和位置来基于文档选择器过滤其功能。 本主题讨论文档选择器、文档模式以及扩展作者应该了解的内容。

未保存在磁盘上的文本文档

并非所有文本文档都存储在磁盘上,例如,新创建的文档。 除非另有说明,否则文档选择器适用于所有文档类型。 使用 DocumentFilterscheme 属性来缩小到特定模式,例如 { scheme: 'file', language: 'typescript' } 用于存储在磁盘上的 TypeScript 文件。

文档选择器

Visual Studio Code 扩展 API 通过 DocumentSelector 类型将特定于语言的功能(如 IntelliSense)与文档选择器结合起来。 它们是一种轻松缩小功能范围到特定语言的机制。

以下代码片段注册了一个 HoverProvider 用于 TypeScript 文件,文档选择器是 typescript 语言标识符字符串。

vscode.languages.registerHoverProvider('typescript', {
  provideHover(doc: vscode.TextDocument) {
    return new vscode.Hover('For *all* TypeScript documents.');
  }
});

文档选择器不仅仅可以是语言标识符,更复杂的选择器可以使用 DocumentFilter 通过 scheme 和文件位置通过 pattern 路径 glob 模式进行过滤

vscode.languages.registerHoverProvider(
  { pattern: '**/test/**' },
  {
    provideHover(doc: vscode.TextDocument) {
      return new vscode.Hover('For documents inside `test`-folders only');
    }
  }
);

下一个代码片段使用 scheme 过滤器并将其与语言标识符结合使用。 untitled 模式用于尚未保存到磁盘的新文件。

vscode.languages.registerHoverProvider(
  { scheme: 'untitled', language: 'typescript' },
  {
    provideHover(doc: vscode.TextDocument) {
      return new vscode.Hover('For new, unsaved TypeScript documents only');
    }
  }
);

文档模式

文档的 scheme 常常被忽视,但它是重要信息。 大多数文档都保存在磁盘上,扩展作者通常假设他们正在处理磁盘上的文件。 例如,使用简单的 typescript 选择器,假设是磁盘上的 TypeScript 文件。 但是,在某些情况下,该假设过于宽松,应该使用更明确的选择器,例如 { scheme: 'file', language: 'typescript' }

当功能依赖于从/向磁盘读取/写入文件时,这一点的重要性就显现出来了。 请查看下面的代码片段

// 👎 too lax
vscode.languages.registerHoverProvider('typescript', {
  provideHover(doc: vscode.TextDocument) {
    const { size } = fs.statSync(doc.uri.fsPath); // ⚠️ what about 'untitled:/Untitled1.ts' or others?
    return new vscode.Hover(`Size in bytes is ${size}`);
  }
});

上面的悬停提供程序想要显示磁盘上文档的大小,但它未能检查文档是否实际存储在磁盘上。 例如,它可能是新创建的并且尚未保存。 正确的方法是告诉 VS Code 提供程序只能处理磁盘上的文件。

// 👍 only works with files on disk
vscode.languages.registerHoverProvider(
  { scheme: 'file', language: 'typescript' },
  {
    provideHover(doc: vscode.TextDocument) {
      const { size } = fs.statSync(doc.uri.fsPath);
      return new vscode.Hover(`Size in bytes is ${size}`);
    }
  }
);

总结

文档通常存储在文件系统上,但并非总是如此:有未命名的文档、Git 使用的缓存文档、来自 FTP 等远程源的文档等等。 如果您的功能依赖于磁盘访问,请确保使用带有 file 模式的文档选择器。

后续步骤

要了解有关 VS Code 可扩展性模型的更多信息,请尝试以下主题

© . This site is unofficial and not affiliated with Microsoft.