現已釋出!閱讀關於 11 月新增功能和修復的內容。

文件選擇器

擴充套件可以根據文件選擇器(按語言、檔案型別和位置)過濾其功能。本主題討論文件選擇器、文件方案,以及擴充套件作者應注意的事項。

不在磁碟上的文字文件

並非所有文字文件都儲存在磁碟上,例如,新建立的文件。除非另有指定,否則文件選擇器適用於所有文件型別。使用 DocumentFilter scheme 屬性來縮小到特定方案,例如 { scheme: 'file', language: 'typescript' } 用於儲存在磁碟上的 TypeScript 檔案。

文件選擇器

Visual Studio Code 擴充套件 API 透過 DocumentSelector 型別將特定語言的功能(如 IntelliSense)與文件選擇器相結合。它們是一種將功能縮小到特定語言的簡單機制。

下面的程式碼片段為 TypeScript 檔案註冊了一個 HoverProvider,文件選擇器是 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}`);
  }
});

上面的 hover provider 想要顯示磁碟上文件的大小,但它沒有檢查文件是否真的儲存在磁碟上。例如,它可能是新建立的且尚未儲存。正確的方法是告訴 VS Code,該 provider 只能處理磁碟上的檔案。

// 👍 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}`);
    }
  }
);

總結

文件通常儲存在檔案系統上,但並非總是如此:有 untitled 文件、Git 使用的快取文件、來自 FTP 等遠端源的文件等等。如果您的功能依賴於磁碟訪問,請確保使用帶有 file 方案的文件選擇器。

後續步驟

要了解有關 VS Code 可擴充套件性模型的更多資訊,請嘗試以下主題

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