ドキュメントセレクター
拡張機能は、言語、ファイルの種類、場所に基づいて、ドキュメントセレクターによって機能をフィルター処理できます。このトピックでは、ドキュメントセレクター、ドキュメントスキーム、および拡張機能の作成者が注意すべき点について説明します。
ディスク上にないテキストドキュメント
すべてのテキストドキュメントがディスクに保存されているわけではありません。たとえば、新しく作成されたドキュメントなどです。特に指定しない限り、ドキュメントセレクターはすべてのドキュメントタイプに適用されます。DocumentFilterのscheme
プロパティを使用して、特定のスキームに絞り込むことができます。たとえば、ディスクに保存されているTypeScriptファイルの場合は{ scheme: 'file', language: '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}`);
}
});
上記のホバープロバイダーはディスク上のドキュメントのサイズを表示しようとしますが、ドキュメントが実際にディスクに保存されているかどうかを確認していません。たとえば、新しく作成され、まだ保存されていない可能性があります。正しい方法は、プロバイダーがディスク上のファイルでのみ機能することを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の拡張性モデルについて詳しく知るには、次のトピックを参照してください。
- 拡張機能マニフェストファイル - VS Code package.json拡張機能マニフェストファイルの参照
- 貢献ポイント - VS Code 貢献ポイントのリファレンス