次の方法で共有


エディターの拡張機能の概念

この記事では、Visual Studio エディターを表す機能拡張オブジェクト モデルと、編集用に開かれたテキスト ドキュメントについて説明します。 エディター拡張機能の使用の概要については、「Visual Studio エディターの機能拡張を使用する」を参照してください。

Visual Studio エディターの機能拡張オブジェクト モデルは、いくつかの不可欠な部分で構成されています。 この記事では、 ITextViewSnapshotITextDocumentSnapshot、およびドキュメント全体のその他の抽象表現について説明します。 この記事では 、テキスト の場所とスパンをそれぞれ表す TextPosition と TextRange についても説明します。

ITextViewSnapshot

ITextViewSnapshot クラスには、ITextDocumentSnapshot クラスの取得に必要な URI とバージョン情報、およびテキスト ビューの一部のプロパティ (選択など) が含まれています。

  • このオブジェクトは不変であり、作成後に変更されることはありません。
  • ITextViewSnapshot.GetTextDocumentAsync() を使用して、ドキュメントからコンテンツを取得できます。 このメソッドの呼び出しはコストが高く、ドキュメント コンテンツが必要な場合にのみ行う必要があります。
  • ITextViewSnapshot クラスを直接変更することはできません。 すべての変更は、変異によって要求されます。 詳細については、「 拡張機能からテキスト ドキュメントを変更する」を参照してください。

ITextDocumentSnapshot (テキストドキュメントスナップショット)

ITextDocumentSnapshot クラスには、特定の時点またはバージョンのテキスト ドキュメントの内容が含まれています。

  • このオブジェクトは不変であり、作成後に変更されることはありません。
  • ITextDocumentSnapshot クラスを直接変更することはできません。 すべての変更は、変異によって要求されます。 詳細については、「 拡張機能からテキスト ドキュメントを変更する」を参照してください。

従来の Visual Studio 拡張機能に慣れている場合、ITextDocumentSnapshot は ITextSnapshot とほぼ同じであり、テキストにアクセスするための同じ方法のほとんどをサポートします。

ベスト プラクティス

  • 文字列をコピーまたは割り当てることで、リソースを解放せずにドキュメント内の部分文字列を表すには、位置と範囲を使用します。 ほとんどの API は、これらのプリミティブの観点から動作します。
  • インデクサー構文 ( textDocument[0]) を使用して、文字列にコピーせずにドキュメント内の文字単位で文字を読み取ります。
  • 辞書キーとして使用するなどの文字列を作成する必要がある場合は、 Range を受け取るオーバーロードを使用して、行全体またはドキュメント全体から大きな捨て文字列が作成されないようにします。
  • 行またはドキュメントが短いという前提は避けてください。 多くの言語は、大きな行に縮小したり、大きなファイルを使用したりします。
  • ITextDocumentSnapshot クラスは、十分な古いバージョンが格納されている場合にメモリを消費する可能性がある大きなデータ構造を参照します。 長期保存している位置と範囲を最新のドキュメントバージョンに定期的に更新することがベストプラクティスです。これにより、古いTranslateTo()バージョンをガーベージコレクションできるように、ITextDocumentSnapshotメソッドを使用します。

職位

TextPosition クラスは、テキスト ドキュメント内の位置を表します。 int位置とは対照的に、TextPosition型は元の ITextDocumentSnapshot クラスを認識し、その時点で文字を直接取得するためのGetChar()をサポートします。

従来の Visual Studio 拡張機能に慣れている場合、 TextPositionSnapshotPoint とほぼ同じであり、ほとんどの同じ方法をサポートしています。

範囲

TextRange クラスは、ITextDocumentSnapshot クラス内の文字の連続した部分文字列を表します。 string.Substring()またはITextDocumentSnapshot.CopyToString()で作成された文字列とは対照的に、TextRange クラスを作成する場合、割り当てや追加のメモリは必要ありません。 後で CopyToString() を呼び出して、遅延形式で文字列に変換できます。

従来の Visual Studio 拡張機能に慣れている場合、TextRangeSnapshotSpan とほぼ同じであり、ほとんどの同じ方法をサポートしています。

追跡モード

TextPositionクラスとTextRange クラスは、特定のITextDocumentSnapshot クラスに関連付けられます。これは、特定の時刻におけるドキュメントの状態です。 TranslateToメソッドを使用して、そのような位置と範囲を別のスナップショットに変換できます。 このような翻訳では、位置または範囲の前、後 (または範囲の場合は中央) に追加または削除されたテキストが考慮されます。 これらの編集のいずれかが範囲の正確な位置または端で行われる場合、 TextPositionTrackingModeTextRangeTrackingMode を使用して翻訳の動作を指定します。

タグ

タガー は、データ ( タグ) をテキストのスパンに関連付けるために使用されます。 Visual Studio のその他の機能 ( CodeLens分類など) では、このようなデータが使用されます。

  • DocumentSelectorSample の単純なエディター ベースの拡張機能のサンプル コードを確認します。