À l’intérieur de l’éditeur
L’éditeur se compose de plusieurs sous-systèmes différents, qui sont conçus pour séparer le modèle de texte de l’éditeur de la vue de texte et de l’interface utilisateur.
Ces sections décrivent différents aspects de l’éditeur :
Ces sections décrivent les fonctionnalités de l’éditeur :
Sous-systèmes
Sous-système de modèle de texte
Le sous-système du modèle de texte est chargé de représenter du texte et d’activer sa manipulation. Le sous-système du modèle texte contient l’interface ITextBuffer , qui décrit la séquence de caractères à afficher par l’éditeur. Ce texte peut être modifié, suivi et manipulé autrement de plusieurs manières. Le modèle de texte fournit également des types pour les aspects suivants :
Service qui associe du texte à des fichiers et gère la lecture et l’écriture dans le système de fichiers.
Service de différenciation qui trouve les différences minimales entre deux séquences d’objets.
Système permettant de décrire le texte dans une mémoire tampon en termes de sous-ensembles du texte dans d’autres mémoires tampons.
Le sous-système de modèle de texte est libre des concepts de l’interface utilisateur. Par exemple, il n’est pas responsable de la mise en forme de texte ou de la disposition du texte, et il n’a aucune connaissance des ornements visuels qui peuvent être associés au texte.
Les types publics du sous-système de modèle de texte sont contenus dans Microsoft.VisualStudio.Text.Data.dll et Microsoft.VisualStudio.CoreUtility.dll, qui dépendent uniquement de la bibliothèque de classes de base .NET Framework et de l’infrastructure d’extensibilité managée (MEF).
Sous-système d’affichage de texte
Le sous-système d’affichage de texte est responsable de la mise en forme et de l’affichage du texte. Les types de ce sous-système sont divisés en deux couches, selon que les types s’appuient sur Windows Presentation Foundation (WPF). Les types les plus importants sont ITextView et IWpfTextView, qui contrôlent l’ensemble de lignes de texte à afficher, ainsi que les caresses, la sélection et les installations permettant d’orner le texte à l’aide d’éléments d’interface utilisateur WPF. Ce sous-système fournit également des marges autour de la zone d’affichage de texte. Ces marges peuvent être étendues et peuvent contenir différents types de contenu et d’effets visuels. Les marges sont des affichages de numéros de ligne et des barres de défilement.
Les types publics du sous-système d’affichage de texte sont contenus dans Microsoft.VisualStudio.Text.UI.dll et Microsoft.VisualStudio.Text.UI.Wpf.dll. Le premier assembly contient les éléments indépendants de la plateforme, et le second contient les éléments propres à WPF.
Sous-système de classification
Le sous-système de classification est chargé de déterminer les propriétés de police pour le texte. Un classifieur décompose le texte en différentes classes, par exemple « mot clé » ou « commentaire ». Le mappage de format de classification associe ces classes aux propriétés de police réelles, par exemple « Blue Consolas 10 pt ». Ces informations sont utilisées par la vue de texte lorsqu’elle met en forme et restitue du texte. Le balisage, décrit plus en détail plus loin dans cette rubrique, permet d’associer des données à des étendues de texte.
Les types publics du sous-système de classification sont contenus dans Microsoft.VisualStudio.Text.Logic.dll et interagissent avec les aspects visuels de la classification, qui sont contenus dans Microsoft.VisualStudio.Text.UI.Wpf.dll.
Sous-système d’opérations
Le sous-système des opérations définit le comportement de l’éditeur. Il fournit l’implémentation des commandes de l’éditeur Visual Studio et du système d’annulation.
Un aperçu plus approfondi du modèle de texte et de la vue de texte
Modèle de texte
Le sous-système du modèle de texte se compose de différents regroupements de types de texte. Il s’agit notamment de la mémoire tampon de texte, des instantané de texte et des étendues de texte.
Mémoires tampons de texte et instantané de texte
L’interface ITextBuffer représente une séquence de caractères Unicode codés à l’aide de UTF-16, qui est l’encodage utilisé par le String
type dans le .NET Framework. Une mémoire tampon de texte peut être conservée en tant que document de système de fichiers, mais cela n’est pas obligatoire.
Il ITextBufferFactoryService est utilisé pour créer une mémoire tampon de texte vide ou une mémoire tampon de texte initialisée à partir d’une chaîne ou d’une base de données TextReader. La mémoire tampon de texte peut être conservée dans le système de fichiers en tant que ITextDocument.
N’importe quel thread peut modifier la mémoire tampon de texte jusqu’à ce qu’un thread prenne possession de la mémoire tampon de texte en appelant TakeThreadOwnership. Après cela, seul ce thread peut effectuer des modifications.
Une mémoire tampon de texte peut parcourir de nombreuses versions pendant sa durée de vie. Une nouvelle version est générée chaque fois que la mémoire tampon est modifiée et qu’une valeur immuable ITextSnapshot représente le contenu de cette version de la mémoire tampon. Étant donné que les instantané de texte sont immuables, vous pouvez accéder à un instantané de texte sur n’importe quel thread, sans restrictions, même si la mémoire tampon de texte qu’elle représente continue de changer.
Lignes de instantané de texte et de texte instantané
Vous pouvez afficher le contenu d’un texte instantané sous la forme d’une séquence de caractères ou d’une séquence de lignes. Les caractères et les lignes sont tous les deux indexés à partir de zéro. Un texte vide instantané contient zéro caractères et une ligne vide. Une ligne est délimitée par n’importe quelle séquence de caractères de saut de ligne Unicode valide, ou au début ou à la fin de la mémoire tampon. Les caractères de saut de ligne sont explicitement représentés dans le texte instantané, et les sauts de ligne d’un texte instantané ne doivent pas tous être identiques.
Remarque
Pour plus d’informations sur les caractères de saut de ligne dans l’éditeur Visual Studio, consultez Encodages et sauts de ligne.
Une ligne de texte est représentée par un ITextSnapshotLine objet, qui peut être obtenu à partir d’un texte instantané pour un numéro de ligne particulier ou pour une position de caractère particulière.
SnapshotPoints, SnapshotSpans et NormalizedSnapshotSpanCollections
Représente SnapshotPoint une position de caractère dans un instantané. La position est garantie de se trouver entre zéro et la longueur de la instantané. Représente SnapshotSpan une étendue de texte dans un instantané. Sa position de fin est garantie de se trouver entre zéro et la longueur de la instantané. Se NormalizedSnapshotSpanCollection compose d’un ensemble d’objets SnapshotSpan de la même instantané.
Spans et NormalizedSpanCollections
Représente Span un intervalle qui peut être appliqué à une étendue de texte dans un texte instantané. Les positions d’instantané sont basées sur zéro. Les étendues peuvent donc commencer à n’importe quelle position, y compris zéro. La End
propriété d’une étendue est égale à la somme de sa Start
propriété et de sa Length
propriété. A Span
n’inclut pas le caractère indexé par la End
propriété. Par exemple, une étendue qui a Start=5 et Length=3 a End=8, et inclut les caractères aux positions 5, 6 et 7. La notation de cette étendue est [5..8).
Deux étendues se croisent si elles ont des positions en commun, y compris la position de fin. Par conséquent, l’intersection de [3, 5) et [2, 7) est [3, 5) et l’intersection de [3, 5) et [5, 7) est [5, 5). (Notez que [5, 5) est une étendue vide.)
Deux étendues se chevauchent si elles ont des positions en commun, à l’exception de la position de fin. Une étendue vide ne chevauche jamais une autre étendue, et le chevauchement de deux étendues n’est jamais vide.
Il NormalizedSpanCollection s’agit d’une liste d’étendues dans l’ordre des propriétés Start des étendues. Dans la liste, les étendues qui se chevauchent ou s’étendent sont fusionnées. Par exemple, étant donné l’ensemble des étendues [5..9), [0..1), [3..6) et [9..10), la liste normalisée des étendues est [0..1), [3..10).
Notifications de modification de texte, ITextEdit, TextVersion et texte
Le contenu d’une mémoire tampon de texte peut être modifié à l’aide d’un ITextEdit objet. La création d’un tel objet (à l’aide de l’une CreateEdit()
des méthodes de ITextBuffer) démarre une transaction de texte composée de modifications de texte. Chaque modification est un remplacement d’une étendue de texte dans la mémoire tampon par une chaîne. Les coordonnées et le contenu de chaque modification sont exprimés par rapport à la instantané de la mémoire tampon lors du démarrage de la transaction. L’objet ITextEdit ajuste les coordonnées des modifications affectées par d’autres modifications dans la même transaction.
Par exemple, considérez une mémoire tampon de texte qui contient cette chaîne :
abcdefghij
Appliquez une transaction qui contient deux modifications, une modification qui remplace l’étendue à [2..4) à l’aide du caractère X
et d’une deuxième modification qui remplace l’étendue à [6..9) à l’aide du caractère Y
. Le résultat est cette mémoire tampon :
abXefYj
Les coordonnées de la deuxième modification ont été calculées par rapport au contenu de la mémoire tampon au début de la transaction, avant l’application de la première modification.
Les modifications apportées à la mémoire tampon prennent effet lorsque l’objet ITextEdit est validé en appelant sa Apply()
méthode. S’il y avait au moins une modification non vide, une nouvelle ITextVersion est créée, une nouvelle ITextSnapshot est créée et un Changed
événement est déclenché. Chaque version de texte a un texte différent instantané. Un texte instantané représente l’état complet de la mémoire tampon de texte après une transaction de modification, mais une version de texte décrit uniquement les modifications d’un instantané à l’autre. En règle générale, les instantané de texte sont destinées à être utilisées une fois, puis dis carte ed, tandis que les versions de texte doivent rester actives pendant un certain temps.
Une version de texte contient un INormalizedTextChangeCollection. Cette collection décrit les modifications qui, lorsqu’elles sont appliquées au instantané, produisent les instantané suivantes. Chaque ITextChange élément de la collection contient la position de caractère de la modification, de la chaîne remplacée et de la chaîne de remplacement. La chaîne remplacée est vide pour une insertion de base et la chaîne de remplacement est vide pour une suppression de base. La collection normalisée est toujours null
pour la version la plus récente de la mémoire tampon de texte.
ITextEdit Un seul objet peut être instancié pour une mémoire tampon de texte à tout moment, et toutes les modifications de texte doivent être effectuées sur le thread propriétaire de la mémoire tampon de texte (si la propriété a été revendiquée). Une modification de texte peut être abandonnée en appelant sa Cancel
méthode ou sa Dispose
méthode.
ITextBuffer fournit Insert()
également , Delete()
et Replace()
des méthodes qui ressemblent à celles trouvées sur l’interface ITextEdit . L’appel de ceux-ci a le même effet que la création d’un ITextEdit objet, l’appel similaire, puis l’application de la modification.
Points de suivi et étendues de suivi
Représente ITrackingPoint une position de caractère dans une mémoire tampon de texte. Si la mémoire tampon est modifiée d’une manière qui entraîne le décalage de la position du caractère, le point de suivi se déplace avec lui. Par exemple, si un point de suivi fait référence à la position 10 dans une mémoire tampon et que cinq caractères sont insérés au début de la mémoire tampon, le point de suivi fait ensuite référence à la position 15. Si une insertion se produit exactement à la position indiquée par le point de suivi, son comportement est déterminé par son PointTrackingMode, qui peut être ou Positive
Negative
. Si le mode de suivi est positif, le point de suivi fait référence au même caractère, qui se trouve maintenant à la fin de l’insertion. Si le mode de suivi est négatif, le point de suivi fait référence au premier caractère inséré à la position d’origine. Si le caractère à la position représentée par un point de suivi est supprimé, le point de suivi passe au premier caractère qui suit la plage supprimée. Par exemple, si un point de suivi fait référence au caractère à la position 5 et que les caractères aux positions 3 à 6 sont supprimés, le point de suivi fait référence au caractère à la position 3.
Représente ITrackingSpan une plage de caractères au lieu d’une seule position. Son comportement est déterminé par son SpanTrackingMode. Si le mode de suivi d’étendue est SpanTrackingMode.EdgeInclusive, l’étendue de suivi augmente pour incorporer du texte inséré à ses bords. Si le mode de suivi d’étendue est SpanTrackingMode.EdgeExclusive, l’étendue de suivi n’incorpore pas de texte inséré à ses bords. Toutefois, si le mode de suivi de l’étendue est SpanTrackingMode.EdgePositive, une insertion envoie la position actuelle vers le début et si le mode de suivi de l’étendue est SpanTrackingMode.EdgeNegative, une insertion envoie la position actuelle vers la fin.
Vous pouvez obtenir la position d’un point de suivi ou l’étendue d’une étendue de suivi pour toute instantané de la mémoire tampon de texte à laquelle elles appartiennent. Les points de suivi et les étendues de suivi peuvent être référencés en toute sécurité à partir de n’importe quel thread.
Types de contenu
Les types de contenu sont un mécanisme permettant de définir différents types de contenu. Un type de contenu peut être un type de fichier tel que « text », « code » ou « binary », ou un type de technologie tel que « xml », « vb » ou « c# ». Par exemple, le mot « using » est un mot clé en C# et Visual Basic, mais pas dans d’autres langages de programmation. Par conséquent, la définition de cette mot clé serait limitée aux types de contenu « c# » et « vb ».
Les types de contenu sont utilisés comme filtre pour les ornements et d’autres éléments de l’éditeur. De nombreuses fonctionnalités de l’éditeur et points d’extension sont définis par type de contenu. Par exemple, la coloration de texte est différente pour les fichiers texte brut, les fichiers XML et les fichiers de code source Visual Basic. Les mémoires tampons de texte sont généralement affectées à un type de contenu lorsqu’elles sont créées, et le type de contenu d’une mémoire tampon de texte peut être modifié.
Les types de contenu peuvent hériter plusieurs fois d’autres types de contenu. Vous ContentTypeDefinition pouvez spécifier plusieurs types de base comme parents d’un type de contenu donné.
Les développeurs peuvent définir leurs propres types de contenu et les inscrire à l’aide du IContentTypeRegistryService. De nombreuses fonctionnalités de l’éditeur peuvent être définies par rapport à un type de contenu spécifique à l’aide du ContentTypeAttribute. Par exemple, les marges de l’éditeur, les ornements et les gestionnaires de souris peuvent être définis afin qu’ils s’appliquent uniquement aux éditeurs qui affichent des types de contenu particuliers.
Affichage texte
La partie vue du modèle MVC définit la vue de texte, la mise en forme de l’affichage, les éléments graphiques tels que la barre de défilement et le pointage. Tous les éléments de présentation de l’éditeur Visual Studio sont basés sur WPF.
Affichages de texte
L’interface ITextView est une représentation indépendante de la plateforme d’une vue de texte. Il est principalement utilisé pour afficher des documents texte dans une fenêtre, mais il peut également être utilisé à d’autres fins, par exemple dans une info-bulle.
La vue de texte fait référence à différents types de mémoires tampons de texte. La TextViewModel propriété fait référence à un ITextViewModel objet qui pointe vers ces trois mémoires tampons de texte différentes : la mémoire tampon de données, qui est la mémoire tampon de niveau données supérieure, la mémoire tampon d’édition, dans laquelle se produit la modification et la mémoire tampon visuelle, qui est la mémoire tampon affichée dans l’affichage de texte.
Le texte est mis en forme en fonction des classifieurs attachés à la mémoire tampon de texte sous-jacente et est orné à l’aide des fournisseurs d’ornements attachés à la vue de texte elle-même.
Système de coordonnées de la vue de texte
Le système de coordonnées de l’affichage texte spécifie des positions dans l’affichage de texte. Dans ce système de coordonnées, la valeur x 0.0 correspond au bord gauche du texte affiché, et la valeur y 0.0 correspond au bord supérieur du texte affiché. La coordonnée x augmente de gauche à droite, et la coordonnée y augmente de haut en bas.
Une fenêtre d’affichage (la partie du texte visible dans la fenêtre de texte) ne peut pas faire défiler horizontalement de la même manière qu’elle est défilement verticalement. Une fenêtre d’affichage fait défiler horizontalement en modifiant sa coordonnée gauche afin qu’elle se déplace par rapport à la surface de dessin. Toutefois, une fenêtre d’affichage peut être défilement verticalement uniquement en modifiant le texte rendu, ce qui provoque le levée d’un LayoutChanged événement.
Les distances dans le système de coordonnées correspondent aux pixels logiques. Si l’aire de rendu du texte est affichée sans transformation de mise à l’échelle, une unité dans le système de coordonnées de rendu de texte correspond à un pixel sur l’affichage.
Marges
L’interface ITextViewMargin représente une marge et active le contrôle de la visibilité de la marge et de sa taille. Il existe quatre marges prédéfinies, nommées « Haut », « Gauche », « Droite » et « Bas » et attachées au bord supérieur, inférieur, gauche ou droit d’une vue. Ces marges sont des conteneurs dans lesquels d’autres marges peuvent être placées. L’interface définit des méthodes qui retournent la taille de la marge et la visibilité d’une marge. Les marges sont des éléments visuels qui fournissent des informations supplémentaires sur la vue de texte à laquelle elles sont attachées. Par exemple, la marge de numéro de ligne affiche les numéros de ligne de l’affichage de texte. La marge de glyphe affiche les éléments de l’interface utilisateur.
L’interface IWpfTextViewMarginProvider gère la création et le placement des marges. Les marges peuvent être ordonnées par rapport à d’autres marges. Les marges de priorité supérieure se trouvent plus près de la vue de texte. Par exemple, s’il existe deux marges gauches, la marge A et la marge B, et la marge B a une priorité inférieure à la marge A, la marge B apparaît à gauche de la marge A.
Hôte d’affichage de texte
L’interface IWpfTextViewHost contient l’affichage de texte et toutes les décorations qui accompagnent la vue, par exemple, des barres de défilement. L’hôte d’affichage de texte contient également des marges attachées à une bordure de la vue.
Texte mis en forme
Le texte affiché dans une vue de texte est composé d’objets ITextViewLine . Chaque ligne d’affichage de texte correspond à une ligne de texte dans l’affichage texte. Les lignes longues dans la mémoire tampon de texte sous-jacente peuvent être partiellement masquées (si l’habillage de mots n’est pas activé) ou divisées en plusieurs lignes d’affichage de texte. L’interface ITextViewLine contient des méthodes et des propriétés pour le mappage entre les coordonnées et les caractères, ainsi que pour les ornements qui peuvent être associés à la ligne.
ITextViewLine les objets sont créés à l’aide d’une IFormattedLineSource interface. Si vous vous inquiétez simplement du texte actuellement affiché dans l’affichage, vous pouvez ignorer la source de mise en forme. Si vous êtes intéressé par le format de texte qui n’est pas affiché dans l’affichage (par exemple, pour prendre en charge un texte enrichi couper et coller), vous pouvez utiliser IFormattedLineSource pour mettre en forme du texte dans une mémoire tampon de texte.
L’affichage de texte met en forme un à la ITextSnapshotLine fois.
Fonctionnalités de l’éditeur
Les fonctionnalités de l’éditeur sont conçues afin que la définition de la fonctionnalité soit distincte de son implémentation. L’éditeur inclut ces fonctionnalités :
Balises et classifieurs
Ornements
Projection
mode Plan
Liaisons souris et touches
Opérations et primitives
IntelliSense
Balises et classifieurs
Les balises sont des marqueurs associés à une étendue de texte. Elles peuvent être présentées de différentes manières, par exemple, à l’aide de couleurs de texte, de soulignements, de graphiques ou de fenêtres contextuelles. Les classifieurs sont un type de balise.
D’autres types de balises sont TextMarkerTag destinés à la mise en surbrillance du texte, OutliningRegionTag à la mise en plan et ErrorTag aux erreurs de compilation.
Types de classification
Une IClassificationType interface représente une classe d’équivalence, qui est une catégorie abstraite de texte. Les types de classification peuvent hériter plusieurs fois d’autres types de classification. Par exemple, les classifications de langage de programmation peuvent inclure « mot clé », « commentaire » et « identificateur », qui héritent tous de « code ». Les types de classification du langage naturel peuvent inclure « nom », « verbe » et « adjectif », qui héritent tous de « langage naturel ».
Classifications
Une classification est une instance d’un type de classification particulier, généralement sur une étendue de texte. Un ClassificationSpan est utilisé pour représenter une classification. Une étendue de classification peut être considérée comme une étiquette qui couvre une étendue de texte particulière et indique au système que cette étendue de texte est d’un type de classification particulier.
Classifieurs
Il IClassifier s’agit d’un mécanisme qui décompose le texte en un ensemble de classifications. Les classifieurs doivent être définis pour des types de contenu spécifiques et instanciés pour des mémoires tampons de texte spécifiques. Les clients doivent implémenter IClassifier pour participer à la classification de texte.
Aggregators classifieur
Un agrégateur de classifieur est un mécanisme qui combine tous les classifieurs d’une mémoire tampon de texte en un seul ensemble de classifications. Par exemple, un classifieur C# et un classifieur de langue anglaise peuvent créer des classifications sur un commentaire dans un fichier C#. Tenez compte de ce commentaire :
// This method produces a classifier
Un classifieur C# peut étiqueter l’ensemble de l’étendue sous forme de commentaire, et le classifieur de langue anglaise peut classifier « produit » en tant que « verbe » et « méthode » en tant que « nom ». L’agrégateur produit un ensemble de classifications qui ne se chevauchent pas, et le type de l’ensemble est basé sur toutes les contributions.
Un aggregator classifieur est également un classifieur, car il divise le texte en un ensemble de classifications. L’agrégateur classifieur garantit également qu’il n’y a pas de classifications qui se chevauchent et que les classifications sont triées. Les classifieurs individuels sont libres de retourner n’importe quel ensemble de classifications, dans n’importe quel ordre, et se chevauchent de quelque manière que ce soit.
Mise en forme de classification et coloration de texte
La mise en forme du texte est un exemple de fonctionnalité basée sur la classification de texte. Il est utilisé par la couche d’affichage de texte pour déterminer l’affichage du texte dans une application. La zone de mise en forme du texte dépend de WPF, mais la définition logique des classifications ne le fait pas.
Un format de classification est un ensemble de propriétés de mise en forme pour un type de classification spécifique. Ces formats héritent du format du parent du type de classification.
Il IClassificationFormatMap s’agit d’une carte d’un type de classification à un ensemble de propriétés de mise en forme de texte. L’implémentation du mappage de format dans l’éditeur gère toutes les exportations de formats de classification.
Ornements
Les ornements sont des effets graphiques qui ne sont pas directement liés à la police et à la couleur des caractères dans la vue de texte. Par exemple, le trait de soulignement rouge qui est utilisé pour marquer le code non compilé dans de nombreux langages de programmation est un ornement incorporé, et les info-bulles sont des ornements contextuels. Les ornements sont dérivés UIElement et implémentent ITag. Deux types spécialisés de balise d’ornement sont le SpaceNegotiatingAdornmentTag, pour les ornements qui occupent le même espace que le texte dans une vue, et le ErrorTag, pour le trait de soulignement à bascule.
Les ornements incorporés sont des graphiques qui font partie de la vue de texte mise en forme. Ils sont organisés dans différentes couches de l’ordre Z. Il existe trois couches intégrées, comme suit : texte, insertion et sélection. Toutefois, les développeurs peuvent définir davantage de couches et les placer dans l’ordre par rapport aux autres. Les trois types d’ornements incorporés sont des ornements relatifs au texte (qui se déplacent lorsque le texte se déplace et sont supprimés lorsque le texte est supprimé), des ornements relatifs aux vues (qui doivent faire avec des parties non textuelles de la vue) et des ornements contrôlés par le propriétaire (le développeur doit gérer leur placement).
Les ornements contextuels sont des graphiques qui apparaissent dans une petite fenêtre au-dessus de la vue de texte, par exemple, des info-bulles.
Projection
La projection est une technique permettant de construire un autre type de mémoire tampon de texte qui ne stocke pas réellement le texte, mais combine plutôt du texte à partir d’autres mémoires tampons de texte. Par exemple, une mémoire tampon de projection peut être utilisée pour concaténer le texte à partir de deux autres mémoires tampons et présenter le résultat comme s’il se trouve dans une seule mémoire tampon ou pour masquer des parties du texte dans une mémoire tampon. Une mémoire tampon de projection peut agir en tant que mémoire tampon source vers une autre mémoire tampon de projection. Un ensemble de mémoires tampons associées par projection peut être construit pour réorganiser le texte de plusieurs façons différentes. (Un tel jeu est également appelé graphique de mémoire tampon.) La fonctionnalité de plan de texte Visual Studio est implémentée à l’aide d’une mémoire tampon de projection pour masquer le texte réduit, et l’éditeur Visual Studio pour ASP.NET pages utilise la projection pour prendre en charge des langages incorporés tels que Visual Basic et C#.
Un IProjectionBuffer est créé à l’aide de IProjectionBufferFactoryService. Une mémoire tampon de projection est représentée par une séquence ordonnée d’objets ITrackingSpan appelés étendues sources. Le contenu de ces étendues est présenté sous la forme d’une séquence de caractères. Les mémoires tampons de texte à partir desquelles les étendues sources sont dessinées sont des mémoires tampons sources nommées. Les clients d’une mémoire tampon de projection n’ont pas à savoir qu’il diffère d’une mémoire tampon de texte ordinaire.
La mémoire tampon de projection écoute les événements de modification de texte sur les mémoires tampons sources. Lorsque le texte d’une étendue source change, la mémoire tampon de projection mappe les coordonnées de texte modifiées à ses propres coordonnées et déclenche les événements de modification de texte appropriés. Par exemple, considérez les mémoires tampons sources A et B qui ont le contenu suivant :
A: ABCDE
B: vwxyz
Si la mémoire tampon de projection P est formée à partir de deux étendues de texte, l’une comportant toutes les mémoires tampons A et l’autre qui possède toutes les mémoires tampons B, P a le contenu suivant :
P: ABCDEvwxyz
Si la sous-chaîne xy
est supprimée de la mémoire tampon B, la mémoire tampon P déclenche un événement qui indique que les caractères aux positions 7 et 8 ont été supprimés.
La mémoire tampon de projection peut également être modifiée directement. Il propage les modifications aux mémoires tampons sources appropriées. Par exemple, si une chaîne est insérée dans la mémoire tampon P à la position 6 (position d’origine du caractère « v »), l’insertion est propagée à la mémoire tampon B à la position 1.
Il existe des restrictions sur les étendues sources qui contribuent à une mémoire tampon de projection. Les étendues sources peuvent ne pas se chevaucher ; Un emplacement dans une mémoire tampon de projection ne peut pas être mappé à plusieurs emplacements dans n’importe quelle mémoire tampon source, et un emplacement dans une mémoire tampon source ne peut pas être mappé à plusieurs emplacements dans une mémoire tampon de projection. Aucune circulaire n’est autorisée dans la relation de mémoire tampon source.
Les événements sont déclenchés lorsque l’ensemble de mémoires tampons sources pour une mémoire tampon de projection change et lorsque l’ensemble d’étendues sources change. Une mémoire tampon d’élision est un type spécial de mémoire tampon de projection. Il est principalement utilisé pour le plan et pour les opérations qui étendent et réduisent les blocs de texte. Une mémoire tampon d’élision est basée sur une seule mémoire tampon source, et les étendues de la mémoire tampon d’élision doivent être ordonnées de la même façon qu’elles sont ordonnées dans la mémoire tampon source.
Graphique de mémoire tampon
L’interface IBufferGraph permet de mapper un graphique de mémoires tampons de projection. Toutes les mémoires tampons de texte et mémoires tampons de projection sont collectées dans un graphe acyclique dirigé, tout comme l’arborescence de syntaxe abstraite produite par un compilateur de langage. Le graphique est défini par la mémoire tampon supérieure, qui peut être n’importe quelle mémoire tampon de texte. Le graphique de mémoire tampon peut mapper d’un point dans la mémoire tampon supérieure à un point d’une mémoire tampon source, ou d’une étendue dans la mémoire tampon supérieure à un ensemble d’étendues dans une mémoire tampon source. De même, il peut mapper un point ou une étendue d’une mémoire tampon source à un point dans la mémoire tampon supérieure. Les graphiques de mémoire tampon sont créés à l’aide du IBufferGraphFactoryService.
Événements et mémoires tampons de projection
Lorsqu’une mémoire tampon de projection est modifiée, les modifications sont envoyées de la mémoire tampon de projection aux mémoires tampons qui en dépendent. Une fois que toutes les mémoires tampons sont modifiées, les événements de modification de mémoire tampon sont déclenchés, en commençant par la mémoire tampon la plus profonde.
mode Plan
Le plan est la possibilité de développer ou de réduire différents blocs de texte dans un affichage texte. Le plan est défini comme un type de ITag, de la même façon que les ornements sont définis. Il OutliningRegionTag s’agit d’une balise qui définit une zone de texte qui peut être développée ou réduite. Pour utiliser le plan, vous devez importer l’élément IOutliningManagerService pour obtenir un IOutliningManager. Le gestionnaire de plan énumère, réduit et développe les différents blocs, qui sont représentés en tant qu’objets ICollapsible et déclenche des événements en conséquence.
Liaisons de souris
Les liaisons de souris lient les mouvements de la souris à différentes commandes. Les liaisons de souris sont définies à l’aide d’un IMouseProcessorProvider, et les liaisons de touche sont définies à l’aide d’un IKeyProcessorProvider. Instancie IWpfTextViewHost automatiquement toutes les liaisons et les connecte aux événements de souris dans l’affichage.
L’interface IMouseProcessor contient des gestionnaires d’événements avant processus et post-processus pour différents événements de souris. Pour gérer l’un des événements, vous pouvez remplacer certaines des méthodes dans MouseProcessorBase.
Opérations de l’éditeur
Les opérations de l’éditeur peuvent être utilisées pour automatiser l’interaction avec l’éditeur, à des fins de script ou à d’autres fins. Vous pouvez importer les IEditorOperationsFactoryService opérations d’accès sur une donnée ITextView. Vous pouvez ensuite utiliser ces objets pour modifier la sélection, faire défiler l’affichage ou déplacer la touche vers différentes parties de la vue.
IntelliSense
IntelliSense prend en charge la saisie semi-automatique des instructions, l’aide de signature (également appelée informations sur les paramètres), les infos rapides et les ampoules.
La saisie semi-automatique des instructions fournit des listes contextuelles d’achèvements potentiels pour les noms de méthodes, les éléments XML et d’autres éléments de codage ou de balisage. En général, un mouvement utilisateur appelle une session d’achèvement. La session affiche la liste des achèvements potentiels, et l’utilisateur peut en sélectionner un ou ignorer la liste. Il ICompletionBroker est responsable de la création et du déclenchement du ICompletionSession. Calcule ICompletionSource les CompletionSet éléments d’achèvement de la session.
Résolution des problèmes d’importation/exportation : accéder au journal des erreurs de composition MEF
Vous pouvez rencontrer des problèmes si vous essayez d’importer quelque chose qui n’existe pas dans l’installation de VS actuelle, ou si vous créez incorrectement votre importation ou exportation. La principale façon de trouver et de résoudre ces problèmes consiste à référencer le journal des erreurs de composition MEF (Managed Extensibility Framework), stocké à l’emplacement %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.