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.
- Ten obiekt jest niezmienny i nigdy nie zmieni się po jego utworzeniu.
ITextDocumentSnapshot
nie można zmienić bezpośrednio. Wszystkie zmiany są wymagane za pośrednictwem mutacji. Zobacz Wprowadzanie zmian w dokumencie tekstowym z rozszerzenia.
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 staraITextDocumentSnapshot
wersja mogła zostać odśmiecona.
- 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
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.
Powiązana zawartość
Przejrzyj przykładowy kod dla prostego rozszerzenia opartego na edytorze: