Pojęcia dotyczące rozszerzalności edytora

W tym artykule opisano model obiektów rozszerzalności reprezentujący edytor programu Visual Studio i dokument tekstowy otwarty do edycji. Aby zapoznać się z wprowadzeniem do pracy z funkcją rozszerzenia edytora, zobacz Używanie rozszerzalności edytora programu Visual Studio.

Model obiektu rozszerzalności edytora Visual Studio składa się z kilku części całkowitych. W tym artykule opisano ITextViewSnapshot, ITextDocumentSnapshot i inne abstrakcyjne reprezentacje całego dokumentu, a także Position i Span, które reprezentują odpowiednio lokalizację i zakresy tekstu.

ITextViewSnapshot

Element ITextViewSnapshot zawiera identyfikator URI i informacje o wersji niezbędne do uzyskania elementu ITextDocumentSnapshot , a także niektóre właściwości widoku tekstu, takie jak zaznaczenie.

  • Ten obiekt jest niezmienny i nigdy nie zmieni się po jego utworzeniu.
  • Możesz użyć ITextViewSnapshot.GetTextDocumentAsync() polecenia , aby pobrać zawartość z dokumentu. Wywoływanie tej metody jest kosztowne i należy wykonać tylko wtedy, gdy potrzebujesz zawartości dokumentu.
  • ITextViewSnapshot nie można zmienić bezpośrednio. Wszystkie zmiany są wymagane za pośrednictwem mutacji. Zobacz Wprowadzanie zmian w dokumencie tekstowym z rozszerzenia.

ITextDocumentSnapshot

ITextDocumentSnapshot zawiera zawartość dokumentu tekstowego z punktu w czasie lub wersji.

Jeśli znasz starsze rozszerzenia programu Visual Studio, funkcja ITextDocumentSnapshot jest prawie taka sama jak ITextSnapshot i obsługuje większość tych samych metod uzyskiwania dostępu do tekstu.

Najlepsze rozwiązania:

  • Możesz użyć pozycji i zakresu do reprezentowania podciągów w dokumencie bez eksplodowania zasobów kopiowania lub przydzielania ciągów. Większość interfejsów API działa pod względem tych elementów pierwotnych.
  • Składnia indeksatora , textDocument[0]umożliwia odczytywanie znaków według znaków w dokumencie bez kopiowania go do ciągu.
  • Jeśli musisz utworzyć ciąg, taki jak do użycia jako klucz słownika, użyj przeciążenia, które przyjmuje Span, aby uniknąć tworzenia dużego ciągu rzutu z całego wiersza lub dokumentu.
  • Unikaj przy założeniu, że wiersze lub dokumenty będą krótkie. Wiele języków przekształca je w ogromne wiersze lub zużywa bardzo duże pliki
    • ITextDocumentSnapshot odwołuje się do dużych struktur danych, które mogą zużywać pamięć, jeśli jest przechowywana wystarczająco stara wersja. Najlepszym rozwiązaniem jest okresowe aktualizowanie pozycji i zakresów, które są przechowywane długoterminowe w najnowszej wersji dokumentu za pośrednictwem ich TranslateTo() metody, aby stara ITextDocumentSnapshot wersja mogła zostać odśmiecona.

Position

Reprezentuje pozycję w dokumencie tekstowym. W przeciwieństwie do int pozycji, typ Pozycji jest świadomy ITextDocumentSnapshot pochodzi z i obsługuje GetChar() , aby bezpośrednio uzyskać znak w tym momencie.

Jeśli znasz starsze rozszerzenia programu Visual Studio, pozycja jest prawie taka sama jak program SnapshotPoint i obsługuje większość tych samych metod.

Span

Reprezentuje ciągłe podciąg znaków w obiekcie ITextDocumentSnapshot. W przeciwieństwie do ciągu utworzonego za pomocą string.Substring() polecenia lub ITextDocumentSnapshot.CopyToString(), tworzenie zakresu nie wymaga żadnych alokacji ani dodatkowej pamięci. Później możesz wywołać Span.GetText() metodę , aby zrealizować ją w ciągu w sposób odroczony.

Jeśli znasz starsze rozszerzenia programu Visual Studio, Position jest prawie taka sama jak funkcja SnapshotSpan i obsługuje większość tych samych metod.

Przejrzyj przykładowy kod dla prostego rozszerzenia opartego na edytorze: