文件選擇器
擴充套件可以根據文件選擇器(按語言、檔案型別和位置)過濾其功能。本主題討論文件選擇器、文件方案,以及擴充套件作者應注意的事項。
不在磁碟上的文字文件
並非所有文字文件都儲存在磁碟上,例如,新建立的文件。除非另有指定,否則文件選擇器適用於所有文件型別。使用 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 可擴充套件性模型的更多資訊,請嘗試以下主題