Concepts d’extensibilité de l’éditeur
Cet article décrit le modèle objet d’extensibilité qui représente l’éditeur Visual Studio et le document texte ouvert pour modification. Pour une présentation de l’utilisation de la fonctionnalité d’extension de l’éditeur, consultez Utiliser l’extensibilité de l’éditeur Visual Studio.
Le modèle objet d’extensibilité de Visual Studio Editor se compose de quelques parties intégrales. Cet article traite ITextViewSnapshot, ITextDocumentSnapshot, ainsi que d’autres représentations abstraites de l’ensemble du document, ainsi que Position
et Span
, qui représentent respectivement l’emplacement et les étendues de texte.
ITextViewSnapshot
ITextViewSnapshot contient les informations d’URI et de version nécessaires pour acquérir un ITextDocumentSnapshot ainsi que certaines propriétés de la vue de texte, telles que les sélections.
- Cet objet est immuable et ne change jamais après sa création.
- Vous pouvez utiliser
ITextViewSnapshot.GetTextDocumentAsync()
pour obtenir le contenu du document. L’appel de cette méthode est coûteux et ne doit être effectué que si vous avez besoin du contenu du document. ITextViewSnapshot
ne peuvent pas être modifiés directement. Toutes les modifications sont demandées via la mutation. Voir Apporter des modifications dans un document texte via une extension.
ITextDocumentSnapshot
ITextDocumentSnapshot contient le contenu du document texte à partir d’un instant ou une version donnée.
- Cet objet est immuable et ne change jamais après sa création.
ITextDocumentSnapshot
ne peuvent pas être modifiés directement. Toutes les modifications sont demandées via une transformation. Voir Apporter des modifications à un document texte à partir d’une extension.
Si vous êtes familiarisé avec les extensions Visual Studio héritées, ITextDocumentSnapshot est presque identique à ITextSnapshot et prend en charge la plupart des mêmes méthodes pour accéder au texte.
Bonnes pratiques :
- Vous pouvez utiliser Position et Étendue pour représenter des sous-chaînes dans le document sans dépenser de ressources en copiant ou en allouant des chaînes. La plupart des API fonctionnent en termes de ces primitives.
- Vous pouvez utiliser la syntaxe de l’indexeur,
textDocument[0]
, pour lire le caractère par caractère du document sans le copier dans une chaîne. - Si vous devez créer une chaîne à utiliser comme clé de dictionnaire, utilisez la surcharge qui prend un
Span
afin d'éviter de créer une grande chaîne temporaire à partir de la ligne ou du document entier. - Évitez de supposer que les lignes ou les documents seront courts. De nombreux langages minifient en lignes énormes ou consomment des fichiers très volumineux
-
- ITextDocumentSnapshot fait référence à des structures de données volumineuses qui peuvent consommer de la mémoire si une ancienne version est stockée. La meilleure pratique consiste à mettre à jour périodiquement les positions et les étendues que vous stockez à long terme vers la dernière version du document via leur méthode
TranslateTo()
afin que l'ancienne versionITextDocumentSnapshot
puisse être nettoyée.
- ITextDocumentSnapshot fait référence à des structures de données volumineuses qui peuvent consommer de la mémoire si une ancienne version est stockée. La meilleure pratique consiste à mettre à jour périodiquement les positions et les étendues que vous stockez à long terme vers la dernière version du document via leur méthode
Position
Représente une position dans le document texte. Contrairement aux positions int
, le type Position est conscient de l’image ITextDocumentSnapshot dont il provient et prend en charge GetChar()
pour obtenir directement le caractère à cet endroit.
Si vous êtes familiarisé avec les extensions Visual Studio héritées, Position est presque identique à snapshotPoint et prend en charge la plupart des mêmes méthodes.
Étendue
Représente une sous-chaîne contiguë de caractères dans un ITextDocumentSnapshot. Contrairement à une chaîne créée avec string.Substring()
ou ITextDocumentSnapshot.CopyToString()
, la création d’un Span ne nécessite pas d’allocations ni de mémoire supplémentaire. Vous pouvez ensuite appeler Span.GetText()
pour le convertir en chaîne de manière différée.
Si vous connaissez les extensions Visual Studio héritées, Position
est presque identique à snapshotSpan et prend en charge la plupart des mêmes méthodes.
Contenu connexe
Passez en revue un exemple de code pour une extension simple basée sur l’éditeur :