エディターの拡張機能の概念
この記事では、Visual Studio エディターを表す機能拡張オブジェクト モデルと、編集用に開かれたテキスト ドキュメントについて説明します。 エディター拡張機能の使用の概要については、「Visual Studio エディターの機能拡張を使用する」を参照してください。
Visual Studio エディターの機能拡張オブジェクト モデルは、いくつかの不可欠な部分で構成されています。 この記事では、ITextViewSnapshot、ITextDocumentSnapshot、ドキュメント全体のその他の抽象表現、およびテキストの場所とスパンを表す Position
と Span
について説明します。
ITextViewSnapshot
ITextViewSnapshot には、ITextDocumentSnapshot の取得に必要な URI とバージョン情報、およびテキスト ビューの一部のプロパティ (選択など) が含まれます。
- このオブジェクトは不変であり、作成後に変更されることはありません。
ITextViewSnapshot.GetTextDocumentAsync()
を使用して、ドキュメントからコンテンツを取得できます。 このメソッドの呼び出しはコストがかかり、ドキュメントコンテンツが必要な場合にのみ行う必要があります。ITextViewSnapshot
を直接変更することはできません。 すべての変更は、変異によって要求されます。 テキストドキュメントに変更を加えるために、拡張 からを参照してください。
ITextDocumentSnapshot (テキストドキュメントスナップショット)
ITextDocumentSnapshot には、特定の時点またはバージョンのテキスト ドキュメントの内容が含まれます。
- このオブジェクトは不変であり、作成後に変更されることはありません。
ITextDocumentSnapshot
を直接変更することはできません。 すべての変更はミューテーションを介して要求されます。 「拡張機能からテキスト ドキュメントに変更を加える」を参照してください。
従来の Visual Studio 拡張機能に慣れている場合、ITextDocumentSnapshot は ITextSnapshot とほぼ同じであり、テキストにアクセスするための同じ方法のほとんどをサポートします。
ベスト プラクティス:
- Position と Span を使用すると、リソースをコピーしたり、文字列を割り当てたりすることなく、ドキュメント内の部分文字列を表すことができます。 ほとんどの API は、これらのプリミティブの観点から動作します。
- インデクサー構文 (
textDocument[0]
) を使用すると、文字列にコピーせずにドキュメント内の文字単位で文字を読み取ることができます。 - 辞書キーとして使用するなどの文字列を作成する必要がある場合は、
Span
を受け取るオーバーロードを使用して、行またはドキュメント全体から大きな捨て文字列が作成されないようにします。 - 行やドキュメントが短いと想定しないでください。 多くの言語が巨大な行に縮小したり、非常に大きなファイルを使用したりする
-
- ITextDocumentSnapshot は、十分な古いバージョンが格納されている場合にメモリを消費する可能性がある大きなデータ構造を参照します。 ベスト プラクティスは、古い
ITextDocumentSnapshot
バージョンをガベージ コレクションできるように、TranslateTo()
メソッドを使用して、長期保存している位置とスパンを最新のドキュメント バージョンに定期的に更新することです。
- ITextDocumentSnapshot は、十分な古いバージョンが格納されている場合にメモリを消費する可能性がある大きなデータ構造を参照します。 ベスト プラクティスは、古い
職位
テキスト ドキュメント内の位置を表します。 int
位置とは対照的に、Position 型は関連する ITextDocumentSnapshot を認識し、その時点で文字を直接取得するために GetChar()
をサポートします。
従来の Visual Studio 拡張機能に慣れている場合、Position は SnapshotPoint とほぼ同じであり、ほとんどの同じ方法をサポートします。
スパン
ITextDocumentSnapshot 内の文字の隣接した部分文字列を表します。 string.Substring()
または ITextDocumentSnapshot.CopyToString()
で作成された文字列とは対照的に、スパンを作成するには、割り当てや追加のメモリは必要ありません。 後で Span.GetText()
を呼び出して、遅延形式で文字列に実現できます。
従来の Visual Studio 拡張機能に慣れている場合、Position
は SnapshotSpan とほぼ同じであり、ほとんどの同じ方法をサポートしています。
関連コンテンツ
単純なエディター ベースの拡張機能のサンプル コードを確認します。