本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

文档选择器

扩展可以根据语言、文件类型和位置通过文档选择器过滤其功能。本主题讨论了文档选择器、文档模式以及扩展作者需要注意的内容。

文本文件不在磁盘上

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

文档选择器

Visual Studio Code 扩展 API 将特定语言的功能(如 IntelliSense)与文档选择器结合在一起,通过 DocumentSelector 类型。它们是一种简单的方法来将功能限制在特定语言。

下面的片段注册了一个 HoverProvider 用于 TypeScript 文件,文档选择器是 类型脚本语言识别字符串。

vscode.languages.registerHoverProvider('typescript', {
  provideHover(doc: vscode.TextDocument) {
    return new vscode.Hover('适用于所有 TypeScript 文档。');
  }
});

文档选择器不仅仅是一个语言识别器,更复杂的选择器可以使用DocumentFilter来基于文档进行过滤计划和文件位置通过一个图案路径 glob 模式:

vscode.languages.registerHoverProvider(
  { pattern: '**/test/**' },
  {
    provideHover(doc: vscode.TextDocument) {
      return new vscode.Hover('仅限于 `test` 文件夹内的文档');
    }
  }
);

接下来的片段使用了计划过滤并将其与语言识别器结合。无标题该方案是用于尚未保存到磁盘的新文件。

vscode.languages.registerHoverProvider(
  { scheme: 'untitled', language: 'typescript' },
  {
    provideHover(doc: vscode.TextDocument) {
      return new vscode.Hover('仅适用于新的、未保存的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 ${大小}`);
    }
  }
);

摘要

文件通常存储在文件系统中,但并不总是这样:有些文件没有标题,Git 使用的缓存文件,还有来自 FTP 等远程来源的文件。如果你的功能依赖于磁盘访问,请确保使用带有 的文档选择器文件计划。

下一步

要了解更多关于 VS Code 可扩展性模型的信息,请尝试这些主题: