Freigeben über


Im Editor

Der Editor besteht aus mehreren verschiedenen Subsystemen, die so konzipiert sind, dass das Editortextmodell von der Textansicht und der Benutzeroberfläche getrennt bleibt.

In diesen Abschnitten werden verschiedene Aspekte des Editors beschrieben:

In diesen Abschnitten werden die Features des Editors beschrieben:

Die Subsysteme

Textmodell-Subsystem

Das Textmodellsubsystem ist für die Darstellung von Text und die Aktivierung seiner Manipulation verantwortlich. Das Textmodellsubsystem enthält die ITextBuffer Schnittstelle, die die Abfolge von Zeichen beschreibt, die vom Editor angezeigt werden sollen. Dieser Text kann auf viele Arten geändert, nachverfolgt und anderweitig bearbeitet werden. Das Textmodell bietet auch Typen für die folgenden Aspekte:

  • Ein Dienst, der Text mit Dateien verknüpft und das Lesen und Schreiben im Dateisystem verwaltet.

  • Ein Differenzierungsdienst, der die minimalen Unterschiede zwischen zwei Sequenzen von Objekten findet.

  • Ein System zur Beschreibung des Texts in einem Puffer in Bezug auf Teilmengen des Texts in anderen Puffern.

Das Textmodellsubsystem ist frei von Benutzeroberflächenkonzepten. Sie ist beispielsweise nicht für die Textformatierung oder das Textlayout verantwortlich, und sie verfügt nicht über visuelle Verzierungen, die dem Text zugeordnet werden können.

Die öffentlichen Typen des Textmodells-Subsystems sind in Microsoft.VisualStudio.Text.Data.dll und Microsoft.VisualStudio.CoreUtility.dllenthalten, die nur von der .NET Framework-Basisklassenbibliothek und dem Managed Extensibility Framework (MEF) abhängen.

Subsystem 'Textansicht'

Das Teilsystem für die Textansicht ist für die Formatierung und Anzeige von Text verantwortlich. Die Typen in diesem Subsystem sind in zwei Ebenen unterteilt, je nachdem, ob die Typen von Windows Presentation Foundation (WPF) abhängig sind. Die wichtigsten Typen sind ITextView und IWpfTextView, die den Satz von Textzeilen steuern, die angezeigt werden sollen, sowie das Caret, die Auswahl und die Möglichkeiten zum Schmücken des Texts mithilfe von WPF-UI-Elementen. Dieses Subsystem bietet auch Ränder um den Textanzeigebereich. Diese Ränder können erweitert werden und können verschiedene Arten von Inhalten und visuellen Effekten enthalten. Beispiele für Randbereiche sind Zeilennummernanzeigen und Bildlaufleisten.

Die öffentlichen Typen des Subsystems für die Textansicht sind in Microsoft.VisualStudio.Text.UI.dll und Microsoft.VisualStudio.Text.UI.Wpf.dllenthalten. Die erste Assembly enthält die plattformunabhängigen Elemente, und die zweite enthält die WPF-spezifischen Elemente.

Klassifizierungssubsystem

Das Klassifizierungssubsystem ist für die Ermittlung von Schriftarteigenschaften für Text verantwortlich. Ein Klassifizierer unterbricht den Text in verschiedene Klassen, z. B. "Schlüsselwort" oder "Kommentar". Das Klassifikationsformat stellt den Bezug dieser Klassen zu tatsächlichen Schriftarteigenschaften her, zum Beispiel "Blue Consolas 10 pt". Diese Informationen werden von der Textansicht verwendet, wenn sie Text formatiert und gerendert. Durch Tagging, das weiter unten in diesem Thema beschrieben wird, können Daten mit Textabschnitten verknüpft werden.

Die öffentlichen Typen des Klassifizierungssubsystems sind in Microsoft.VisualStudio.Text.Logic.dll enthalten und interagieren mit den visuellen Aspekten der Klassifizierung, die in Microsoft.VisualStudio.Text.UI.Wpf.dll enthalten sind.

Operations-Subsystem

Das Operations-Subsystem definiert das Editorverhalten. Sie stellt die Implementierung für Visual Studio-Editorbefehle und das Rückgängigmachungssystem bereit.

Ein genauerer Blick auf das Textmodell und die Textansicht

Das Textmodell

Das Textmodellsubsystem besteht aus verschiedenen Gruppierungen von Texttypen. Dazu gehören der Textpuffer, Text-Snapshots und Text-Spannen.

Textpuffer und Textabbilder

Die ITextBuffer Schnittstelle stellt eine Abfolge von Unicode-Zeichen dar, die mithilfe von UTF-16 codiert werden. Dies ist die Codierung, die vom String Typ in .NET Framework verwendet wird. Ein Textpuffer kann als Dateisystemdokument beibehalten werden, dies ist jedoch nicht erforderlich.

Dies ITextBufferFactoryService wird verwendet, um einen leeren Textpuffer oder einen Textpuffer zu erstellen, der aus einer Zeichenfolge oder aus TextReaderinitialisiert wird. Der Textpuffer kann als ITextDocument im Dateisystem gespeichert werden.

Jeder Thread kann den Textpuffer bearbeiten, bis ein Thread den Besitz des Textpuffers übernimmt, indem er aufruft TakeThreadOwnership. Danach kann nur dieser Thread Bearbeitungen ausführen.

Ein Textpuffer kann während seiner Lebensdauer viele Versionen durchlaufen. Bei jeder Bearbeitung des Puffers wird eine neue Version generiert, und eine unveränderliche ITextSnapshot Version stellt den Inhalt dieser Version des Puffers dar. Da Textmomentaufnahmen unveränderlich sind, können Sie auf eine Textmomentaufnahme in einem beliebigen Thread ohne Einschränkungen zugreifen, auch wenn sich der von ihr dargestellte Textpuffer weiterhin ändert.

Textmomentaufnahmen und Textzeilenschnappschüsse

Sie können den Inhalt einer Textmomentaufnahme als Abfolge von Zeichen oder als Abfolge von Zeilen anzeigen. Zeichen und Zeilen werden beide beginnend bei Null indiziert. Eine leere Textmomentaufnahme enthält Nullzeichen und eine leere Zeile. Eine Zeile wird durch eine beliebige gültige Unicode-Zeilenumbruchzeichensequenz oder durch den Anfang oder das Ende des Puffers getrennt. Zeilenumbruchzeichen werden explizit in der Textmomentaufnahme dargestellt, und die Zeilenumbrüche in einer Textmomentaufnahme müssen nicht alle identisch sein.

Hinweis

Weitere Informationen zu Zeilenumbruchzeichen im Visual Studio-Editor finden Sie unter Codierungen und Zeilenumbrüche.

Eine Textzeile wird durch ein ITextSnapshotLine Objekt dargestellt, das aus einer Textmomentaufnahme für eine bestimmte Zeilennummer oder für eine bestimmte Zeichenposition abgerufen werden kann.

SnapshotPoints, SnapshotSpans und NormalizedSnapshotSpanCollections

Eine SnapshotPoint stellt eine Zeichenposition in einem Schnappschuss dar. Die Position wird garantiert zwischen Null und der Länge der Momentaufnahme liegen. A SnapshotSpan stellt eine Textspanne in einer Momentaufnahme dar. Die Endposition wird garantiert zwischen Null und der Länge der Momentaufnahme liegen. Dies NormalizedSnapshotSpanCollection besteht aus einer Gruppe von SnapshotSpan Objekten aus derselben Momentaufnahme.

Bereiche und NormalisierteBereichssammlungen

A Span stellt ein Intervall dar, das auf eine Textspanne in einer Textmomentaufnahme angewendet werden kann. Momentaufnahmenpositionen sind nullbasiert, sodass Spans an einer beliebigen Position beginnen können, einschließlich Null. Die End Eigenschaft eines Bereichs entspricht der Summe seiner Start Eigenschaft und seiner Length Eigenschaft. A Span enthält nicht das Zeichen, das von der End Eigenschaft indiziert wird. Beispielsweise enthält eine Spanne mit "Start=5" und "Length=3" "End=8", und sie enthält die Zeichen an den Positionen 5, 6 und 7. Die Schreibweise für diesen Bereich ist [5..8).

Zwei Spannen überschneiden sich, wenn sie gemeinsame Positionen haben, einschließlich der Endposition. Daher ist die Schnittmenge von [3, 5) und [2, 7) [3, 5) und die Schnittmenge von [3, 5) und [5, 7) [5, 5). (Beachten Sie, dass [5, 5) eine leere Spanne ist.)

Zwei Spannweiten überlappen sich, wenn sie gemeinsame Positionen haben, mit Ausnahme der Endposition. Eine leere Spanne überlappt niemals eine andere Spanne, und die Überlappung von zwei Spannen ist nie leer.

A NormalizedSpanCollection ist eine Liste von Spannen in der Reihenfolge der Starteigenschaften der Spannen. In der Liste werden überlappende oder angrenzende Bereiche zusammengeführt. Beispielsweise wird aus der Menge der Intervalle [5..9), [0..1), [3..6) und [9..10) die normalisierte Liste der Intervalle [0..1), [3..10).

ITextEdit, TextVersion und Textänderungsbenachrichtigungen

Der Inhalt eines Textpuffers kann mithilfe eines ITextEdit Objekts geändert werden. Das Erstellen eines solchen Objekts (mithilfe einer der CreateEdit() Methoden von ITextBuffer) startet eine Texttransaktion, die aus Textbearbeitungen besteht. Jede Änderung ersetzt einen Textabschnitt im Puffer durch eine Zeichenkette. Die Koordinaten und Inhalte jeder Bearbeitung werden relativ zur Momentaufnahme des Puffers beim Starten der Transaktion ausgedrückt. Das ITextEdit Objekt passt die Koordinaten von Bearbeitungen an, die von anderen Bearbeitungen in derselben Transaktion betroffen sind.

Ziehen Sie beispielsweise einen Textpuffer in Betracht, der diese Zeichenfolge enthält:

abcdefghij

Wenden Sie eine Transaktion an, die zwei Bearbeitungen enthält, eine Bearbeitung, die die Spanne bei [2..4) durch die Verwendung des Zeichens X und eine zweite Bearbeitung ersetzt, die die Spanne bei [6..9) mithilfe des Zeichens Yersetzt. Das Ergebnis ist dieser Puffer:

abXefYj

Die Koordinaten für die zweite Bearbeitung wurden im Hinblick auf den Inhalt des Puffers am Anfang der Transaktion berechnet, bevor die erste Bearbeitung angewendet wurde.

Die Änderungen am Puffer werden wirksam, wenn das ITextEdit Objekt durch Aufrufen seiner Apply() Methode zugesichert wird. Wenn mindestens eine nicht leere Bearbeitung vorhanden war, wird eine neue ITextVersion erstellt, eine neue ITextSnapshot erstellt, und ein Changed Ereignis wird ausgelöst. Jede Textversion weist eine andere Textmomentaufnahme auf. Eine Textmomentaufnahme stellt den vollständigen Zustand des Textpuffers nach einer Bearbeitungstransaktion dar, aber eine Textversion beschreibt nur die Änderungen von einer Momentaufnahme zur nächsten. Im Allgemeinen sollen Textmomentaufnahmen einmal verwendet und dann verworfen werden, während Textversionen einige Zeit lang lebendig bleiben müssen.

Eine Textversion enthält eine INormalizedTextChangeCollection. Diese Sammlung beschreibt die Änderungen, die, wenn sie auf die Momentaufnahme angewendet werden, die nachfolgende Momentaufnahme ergeben. Jede ITextChange In der Auflistung enthält die Zeichenposition der Änderung, die ersetzte Zeichenfolge und die Ersetzungszeichenfolge. Die ersetzte Zeichenfolge ist für eine einfache Einfügung leer, und die Ersetzungszeichenfolge ist für einen einfachen Löschvorgang leer. Die normalisierte Auflistung ist immer null in der neuesten Version des Textpuffers.

Es kann immer nur ein ITextEdit Objekt für einen Textpuffer instanziiert werden, und alle Textbearbeitungen müssen für den Thread ausgeführt werden, der den Textpuffer besitzt (wenn der Besitz beansprucht wurde). Eine Textbearbeitung kann durch Aufrufen der Cancel Methode oder der Dispose Methode abgebrochen werden.

ITextBuffer stellt außerdem Insert(), Delete() und Replace() Methoden bereit, die denen auf der ITextEdit Schnittstelle ähneln. Das Aufrufen dieser Elemente hat die gleiche Auswirkung wie das Erstellen eines ITextEdit Objekts, das einen ähnlichen Aufruf macht und dann die Bearbeitung anwendet.

Nachverfolgen von Punkten und Nachverfolgungsspannen

Ein Wert ITrackingPoint stellt eine Zeichenposition in einem Textpuffer dar. Wenn der Puffer so bearbeitet wird, dass die Position des Zeichens verschoben wird, wird der Nachverfolgungspunkt damit verschoben. Wenn beispielsweise ein Nachverfolgungspunkt auf Position 10 in einem Puffer verweist und fünf Zeichen am Anfang des Puffers eingefügt werden, bezieht sich der Nachverfolgungspunkt dann auf Position 15. Wenn eine Eingabe genau an der Position erfolgt, die durch den Verfolgungspunkt gekennzeichnet ist, wird ihr Verhalten durch das PointTrackingMode bestimmt, das entweder Positive oder Negative sein kann. Wenn der Nachverfolgungsmodus positiv ist, bezieht sich der Nachverfolgungspunkt auf dasselbe Zeichen, das sich jetzt am Ende der Einfügung befindet. Wenn der Nachverfolgungsmodus negativ ist, bezieht sich der Nachverfolgungspunkt auf das erste eingefügte Zeichen an der ursprünglichen Position. Wenn das Zeichen an der Position, die durch einen Nachverfolgungspunkt dargestellt wird, gelöscht wird, verschiebt sich der Nachverfolgungspunkt auf das erste Zeichen, das dem gelöschten Bereich folgt. Wenn beispielsweise ein Nachverfolgungspunkt auf das Zeichen an Position 5 verweist und die Zeichen an Positionen 3 bis 6 gelöscht werden, bezieht sich der Nachverfolgungspunkt auf das Zeichen an Position 3.

An ITrackingSpan stellt einen Bereich von Zeichen anstelle von nur einer Position dar. Sein Verhalten wird durch SpanTrackingMode bestimmt. Wenn der SpanTrackingMode.EdgeInclusive-Modus ist, wächst die Nachverfolgungsspanne, um Text zu integrieren, der an seinen Rändern eingefügt wurde. Wenn der Modus SpanTrackingMode.EdgeExclusive ist, enthält der Nachverfolgungsbereich keinen an seinen Rändern eingefügten Text. Wenn der Bereichsverfolgungsmodus SpanTrackingMode.EdgePositive ist, verschiebt eine Einfügung die aktuelle Position zum Anfang, und wenn der SpanTrackingMode.EdgeNegative-Modus ist, verschiebt eine Einfügung die aktuelle Position zum Ende.

Sie können die Position eines Nachverfolgungspunkts oder die Spanne einer Nachverfolgungsspanne für jede Momentaufnahme des Textpuffers abrufen, zu dem sie gehören. Nachverfolgungspunkte und Nachverfolgungsspannen können von jedem Thread sicher referenziert werden.

Inhaltstypen

Inhaltstypen sind ein Mechanismus zum Definieren verschiedener Arten von Inhalten. Ein Inhaltstyp kann ein Dateityp wie "text", "code" oder "binary" oder ein Technologietyp wie "xml", "vb" oder "c#" sein. Beispielsweise ist das Wort "using" ein Schlüsselwort in C# und Visual Basic, aber nicht in anderen Programmiersprachen. Daher wäre die Definition dieses Schlüsselworts auf die Inhaltstypen "c#" und "vb" beschränkt.

Inhaltstypen werden als Filter für Verzierungen und andere Editorelemente verwendet. Viele Editorfeatures und Erweiterungspunkte werden pro Inhaltstyp definiert. Beispielsweise unterscheidet sich die Textfarbe für Nur-Text-Dateien, XML-Dateien und Visual Basic-Quellcodedateien. Textpuffern wird in der Regel beim Erstellen ein Inhaltstyp zugewiesen, und der Inhaltstyp eines Textpuffers kann geändert werden.

Inhaltstypen können von anderen Inhaltstypen mehrfach erben. Mit ContentTypeDefinition können Sie mehrere Basistypen als Eltern eines bestimmten Inhaltstyps angeben.

Entwickler können ihre eigenen Inhaltstypen definieren und sie mit IContentTypeRegistryService registrieren. Viele Editorfunktionen können in Bezug auf einen bestimmten Inhaltstyp mithilfe der ContentTypeAttribute definiert werden. Beispielsweise können Ränder von Editoren, Verzierungen und Maus-Handler definiert werden, damit sie nur für Editoren gelten, die bestimmte Inhaltstypen anzeigen.

Die Textansicht

Der Ansichtsteil des Modellansichtscontrollers (MVC) definiert die Textansicht, die Formatierung der Ansicht, Grafikelemente wie die Bildlaufleiste und das Caret. Alle Präsentationselemente des Visual Studio-Editors basieren auf WPF.

Textansichten

Die ITextView Schnittstelle ist eine plattformunabhängige Darstellung einer Textansicht. Es wird hauptsächlich verwendet, um Textdokumente in einem Fenster anzuzeigen, kann aber auch für andere Zwecke verwendet werden, z. B. in einer Quick-Info.

Die Textansicht verweist auf verschiedene Arten von Textpuffern. Die TextViewModel Eigenschaft bezieht sich auf ein ITextViewModel Objekt, das auf diese drei verschiedenen Textpuffer verweist: der Datenpuffer, der puffer auf oberster Datenebene, der Bearbeitungspuffer, in dem die Bearbeitung erfolgt, und der visuelle Puffer, der in der Textansicht angezeigt wird.

Der Text wird basierend auf den Klassifizierern formatiert, die an den zugrunde liegenden Textpuffer angefügt sind, und durch die an die Textansicht selbst angefügten Verzierungskomponenten geschmückt.

Das Koordinatensystem für die Textansicht

Das Koordinatensystem für die Textansicht gibt Positionen in der Textansicht an. In diesem Koordinatensystem entspricht der x-Wert 0,0 dem linken Rand des angezeigten Texts, und der y-Wert 0,0 entspricht dem oberen Rand des angezeigten Texts. Die x-Koordinate nimmt von links nach rechts zu, und die Y-Koordinate nimmt von oben nach unten zu.

Ein Viewport (der Teil des Textes, der im Textfenster sichtbar ist) kann nicht auf dieselbe Weise horizontal gescrollt werden, wie vertikal. Ein Viewport wird horizontal gescrollt, indem seine linke Koordinate so geändert wird, dass er in Bezug auf die Zeichnungsoberfläche verschoben wird. Ein Viewport kann jedoch nur vertikal gescrollt werden, indem der gerenderte Text geändert wird, wodurch ein LayoutChanged Ereignis ausgelöst wird.

Entfernungen im Koordinatensystem entsprechen logischen Pixeln. Wenn die Textrenderingoberfläche ohne Skalierungstransformation angezeigt wird, entspricht eine Einheit im Textrenderingkoordinatensystem einem Pixel auf der Anzeige.

Seitenränder

Die ITextViewMargin Schnittstelle stellt einen Rand dar und ermöglicht die Kontrolle über die Sichtbarkeit des Rands und deren Größe. Es gibt vier vordefinierte Ränder, die den Namen "Oben", "Links", "Rechts" und "Unten" haben und am oberen, unteren, linken oder rechten Rand einer Ansicht angefügt sind. Diese Ränder sind Container, in denen andere Ränder platziert werden können. Die Schnittstelle definiert Methoden, die die Größe des Seitenrands und die Sichtbarkeit eines Seitenrands zurückgeben. Ränder sind visuelle Elemente, die zusätzliche Informationen zur Textansicht bereitstellen, an die sie angefügt sind. Der Zeilenrand zeigt z. B. Zeilennummern für die Textansicht an. Der Glyphenrand zeigt UI-Elemente an.

Die IWpfTextViewMarginProvider Schnittstelle behandelt die Erstellung und Platzierung von Seitenrändern. Seitenränder können in Bezug auf andere Seitenränder angeordnet werden. Seitenränder mit höherer Priorität befinden sich näher an der Textansicht. Wenn z. B. zwei linke Ränder vorhanden sind, der Rand A und der Rand B eine niedrigere Priorität als der Rand A haben, wird der Rand B links neben dem Rand A angezeigt.

Der Textansichtshost

Die IWpfTextViewHost Schnittstelle enthält die Textansicht und alle Dekorationen, die die Ansicht begleiten, z. B. Scrollleisten. Der Textansichtshost enthält auch Ränder, die an einen Rahmen der Ansicht angefügt sind.

Formatierter Text

Der text, der in einer Textansicht angezeigt wird, besteht aus ITextViewLine Objekten. Jede Textansichtszeile entspricht einer Textzeile in der Textansicht. Lange Zeilen im zugrunde liegenden Textpuffer können entweder teilweise verdeckt (wenn der Textumbruch nicht aktiviert ist) oder in mehrere Textansichtszeilen unterteilt werden. Die ITextViewLine Schnittstelle enthält Methoden und Eigenschaften für die Abbildung von Koordinaten auf Zeichen sowie für Verzierungen, die mit der Linie verbunden sein können.

ITextViewLine Objekte werden mithilfe einer IFormattedLineSource Schnittstelle erstellt. Wenn Sie sich nur gedanken über den Text machen, der derzeit in der Ansicht angezeigt wird, können Sie die Formatierungsquelle ignorieren. Wenn Sie sich für das Format von Text interessieren, der nicht in der Ansicht angezeigt wird (z. B. um das Ausschneiden und Einfügen von Rich-Text zu unterstützen), können Sie Text in einem Textpuffer mit IFormattedLineSource formatieren.

Die Textansicht formatiert jeweils ein Element ITextSnapshotLine nach dem anderen.

Editor-Funktionen

Die Features des Editors sind so konzipiert, dass die Definition des Features von der Implementierung getrennt ist. Der Editor enthält die folgenden Features:

  • Schlagwörter und Klassifizierer

  • Verzierungen

  • Projection

  • Gliedern

  • Maus- und Tastenbindungen

  • Vorgänge und Grundtypen

  • IntelliSense

Tags und Klassifikatoren

Tags sind Markierungen, die einer Textspanne zugeordnet sind. Sie können auf unterschiedliche Weise dargestellt werden, z. B. mithilfe von Textfarbe, Unterstreichungen, Grafiken oder Popups. Klassifizierer sind eine Art von Markierung.

Andere Arten von Tags dienen TextMarkerTag zum Hervorheben von Text, OutliningRegionTag zum Gliedern und ErrorTag für Kompilierungsfehler.

Klassifizierungstypen

Eine IClassificationType Schnittstelle stellt eine Äquivalenzklasse dar, bei der es sich um eine abstrakte Textkategorie handelt. Klassifizierungstypen können von anderen Klassifizierungstypen mehrfach erben. Programmierspracheklassifizierungen können z. B. "Schlüsselwort", "Kommentar" und "Bezeichner" enthalten, die alle von "Code" erben. Klassifizierungstypen für natürliche Sprachen können "Substantiv", "Verb" und "Adjektiv" enthalten, die alle von "natürlicher Sprache" erben.

Classifications

Eine Klassifizierung ist ein Beispiel eines bestimmten Klassifizierungstyps, in der Regel über einem Textbereich. A ClassificationSpan wird verwendet, um eine Klassifizierung darzustellen. Eine Klassifikationsspanne kann als Bezeichnung betrachtet werden, die eine bestimmte Textspanne abdeckt, und teilt dem System mit, dass diese Textspanne von einem bestimmten Klassifizierungstyp ist.

Klassifizierer

Ein IClassifier ist ein Mechanismus, der Text in eine Reihe von Klassifizierungen unterteilt. Klassifizierer müssen für bestimmte Inhaltstypen definiert und für bestimmte Textpuffer instanziiert werden. Klienten müssen IClassifier implementieren, um an der Textklassifizierung teilzunehmen.

Klassifiziereraggregatoren

Ein Klassifiziereraggregator ist ein Mechanismus, der alle Klassifizierer für einen Textpuffer in nur einer Gruppe von Klassifizierungen kombiniert. Beispielsweise könnten sowohl ein C#-Klassifizierer als auch ein englischer Klassifizierer Klassifizierungen über einen Kommentar in einer C#-Datei erstellen. Beachten Sie diesen Kommentar:

// This method produces a classifier

Ein C#-Klassifizierer könnte den gesamten Bereich als Kommentar kennzeichnen, und der englische Sprachklassifizierer könnte "produces" als "Verb" und "method" als "Substantiv" klassifizieren. Der Aggregator erzeugt eine Reihe von nicht überlappenden Klassifizierungen, und der Typ des Satzes basiert auf allen Beiträgen.

Ein Klassifiziereraggregator ist auch ein Klassifizierer, da er Text in eine Reihe von Klassifizierungen umbricht. Der Klassifiziereraggregator stellt außerdem sicher, dass es keine überlappenden Klassifizierungen gibt und dass die Klassifizierungen sortiert sind. Einzelne Klassifizierer können beliebige Klassifikationen in beliebiger Reihenfolge zurückgeben und in jeder beliebigen Art überlappen.

Klassifizierungsformatierung und Textfarbe

Die Textformatierung ist ein Beispiel für ein Feature, das auf der Textklassifizierung basiert. Sie wird von der Textansichtsebene verwendet, um die Anzeige von Text in einer Anwendung zu bestimmen. Der Textformatierungsbereich hängt von WPF ab, aber die logische Definition von Klassifizierungen nicht.

Ein Klassifizierungsformat ist eine Reihe von Formatierungseigenschaften für einen bestimmten Klassifizierungstyp. Diese Formate erben vom Format des übergeordneten Elements des Klassifizierungstyps.

Eine IClassificationFormatMap ist eine Zuordnung von einem Klassifizierungstyp zu einer Reihe von Textformatierungseigenschaften. Die Implementierung der Formatzuordnung im Editor behandelt alle Exporte von Klassifizierungsformaten.

Verzierungen

Verzierungen sind Grafikeffekte, die nicht direkt mit der Schriftart und der Farbe der Zeichen in der Textansicht verbunden sind. Beispielsweise ist die rote Wellenlinie, die verwendet wird, um nicht kompilierenden Code in vielen Programmiersprachen zu markieren, eine eingebettete Verzierung, und Tooltips sind Popup-Verzierungen. Verzierungen stammen von UIElement und implementieren ITag. Zwei spezielle Arten von Ziertags sind die SpaceNegotiatingAdornmentTag, für Verzierungen, die denselben Raum wie der Text in einer Anzeige einnehmen, und die ErrorTag, für die Wellenunterstreichung.

Eingebettete Verzierungen sind Grafiken, die Teil der formatierten Textdarstellung sind. Sie sind in verschiedenen Z-Ordnungsebenen organisiert. Es gibt drei integrierte Ebenen, wie folgt: Text, der Cursor und die Auswahl. Entwickler können jedoch weitere Ebenen definieren und sie in Bezug aufeinander platzieren. Die drei Arten eingebetteter Schmücken sind textrelative Schmücken (die beim Verschieben des Texts verschoben werden und beim Löschen des Texts gelöscht werden), Ansichtsrelative Schmücken (die mit nicht textbezogenen Teilen der Ansicht zu tun haben) und besitzergesteuerte Schmücken (der Entwickler muss ihre Platzierung verwalten).

Pop-up-Elemente sind Grafiken, die in einem kleinen Fenster über der Textansicht angezeigt werden, z. B. Kurzinfos.

Projection

Projektion ist eine Technik zum Erstellen einer anderen Art von Textpuffer, die text nicht tatsächlich speichert, sondern Text aus anderen Textpuffern kombiniert. Beispielsweise kann ein Projektionspuffer verwendet werden, um den Text aus zwei anderen Puffern zu verketten und das Ergebnis so darzustellen, als wäre er nur in einem Puffer enthalten oder um Teile des Texts in einem Puffer auszublenden. Ein Projektionspuffer kann als Quellpuffer für einen anderen Projektionspuffer fungieren. Eine Reihe von Puffern, die durch Projektion miteinander verbunden sind, können so konstruiert werden, dass sie Text auf vielfältige Weise neu anordnen können. (Ein solcher Satz wird auch als Pufferdiagramm bezeichnet.) Das Visual Studio-Textausleitungsfeature wird mithilfe eines Projektionspuffers implementiert, um den reduzierten Text auszublenden, und der Visual Studio-Editor für ASP.NET Seiten verwendet Projektion, um eingebettete Sprachen wie Visual Basic und C# zu unterstützen.

Ein IProjectionBuffer wird mit IProjectionBufferFactoryService erstellt. Ein Projektionspuffer wird durch eine geordnete Abfolge von ITrackingSpan Objekten dargestellt, die als Quellspannen bezeichnet werden. Der Inhalt dieser Spannen wird als Abfolge von Zeichen dargestellt. Die Textpuffer, aus denen die Quellspannen entnommen werden, heißen Quellpuffer. Clients eines Projektionspuffers müssen nicht wissen, dass dieser sich von einem normalen Textpuffer unterscheidet.

Der Projektionspuffer lauscht auf Textänderungsereignisse in den Quellpuffern. Wenn sich der Text in einer Quellspanne ändert, ordnet der Projektionspuffer die geänderten Textkoordinaten seinen eigenen Koordinaten zu und löst entsprechende Textänderungsereignisse aus. Betrachten Sie z. B. Quellpuffer A und B mit den folgenden Inhalten:

A: ABCDE
B: vwxyz

Wenn der Projektionspuffer P aus zwei Textabschnitten gebildet wird, eine mit dem gesamten Puffer A und dem anderen, der alle Puffer B enthält, hat P den folgenden Inhalt:

P: ABCDEvwxyz

Wenn die Teilzeichenfolge xy aus Puffer B gelöscht wird, löst Puffer P ein Ereignis aus, das angibt, dass die Zeichen an den Positionen 7 und 8 gelöscht wurden.

Der Projektionspuffer kann auch direkt bearbeitet werden. Es überträgt Änderungen an die entsprechenden Quellpuffer. Wenn beispielsweise eine Zeichenfolge an Position 6 (die ursprüngliche Position des Zeichens "v") in Puffer P eingefügt wird, wird die Einfügung an Puffer B an Position 1 weitergegeben.

Es gibt Einschränkungen für die Quellabschnitte, die zu einem Projektionspuffer beitragen. Die Quellspannen dürfen sich nicht überschneiden; eine Position in einem Projektionspuffer kann nicht mehreren Speicherorten in einem Quellpuffer zugeordnet werden, und eine Position in einem Quellpuffer kann nicht mehreren Speicherorten in einem Projektionspuffer zugeordnet werden. In der Quellpufferbeziehung sind keine Zirkelitäten zulässig.

Ereignisse werden ausgelöst, wenn sich der Satz von Quellpuffern für einen Projektionspuffer ändert und wenn sich die Menge der Quellbereiche ändert. Ein Elisionpuffer ist eine spezielle Art von Projektionspuffer. Es wird in erster Linie für Gliederung und Vorgänge verwendet, die Textblöcke erweitern und zusammenklappen. Ein Ausblendungspuffer basiert nur auf einem Quellpuffer, und die Bereiche im Ausblendungspuffer müssen die gleiche Reihenfolge haben wie im Quellpuffer.

Pufferdiagramm

Die IBufferGraph Schnittstelle ermöglicht die Zuordnung über ein Diagramm von Projektionspuffern. Alle Textpuffer und Projektionspuffer werden in einem gerichteten azyklischen Diagramm gesammelt, ähnlich wie die abstrakte Syntaxstruktur, die von einem Sprachcompiler erstellt wird. Das Diagramm wird durch den oberen Puffer definiert, bei dem es sich um einen beliebigen Textpuffer handelt. Das Pufferdiagramm kann einen Punkt im oberen Puffer auf einen Punkt in einem Quellpuffer abbilden oder einen Bereich im oberen Puffer auf eine Menge von Bereichen in einem Quellpuffer setzen. Ebenso kann er einen Punkt oder eine Spanne von einem Quellpuffer zu einem Punkt im oberen Puffer zuordnen. Pufferdiagramme werden unter Verwendung des IBufferGraphFactoryService erstellt.

Ereignisse und Projektionspuffer

Wenn ein Projektionspuffer geändert wird, werden die Änderungen vom Projektionspuffer an die Puffer gesendet, die davon abhängig sind. Nachdem alle Puffer geändert wurden, werden Pufferänderungsereignisse ausgelöst, beginnend mit dem tiefsten Puffer.

Gliedern

Das Gliedern ist die Möglichkeit, unterschiedliche Textblöcke in einer Textansicht zu erweitern oder zu reduzieren. Die Gliederung wird auf dieselbe Weise definiert wie Verzierungen als eine Art von ITag. A OutliningRegionTag ist ein Tag, das einen Textbereich definiert, der erweitert oder reduziert werden kann. Um die Gliederung verwenden zu können, müssen Sie das IOutliningManagerService Element importieren, um ein IOutliningManagerElement abzurufen. Der Gliederungsmanager zählt auf, klappt die verschiedenen Blöcke ein und aus, die als ICollapsible Objekte dargestellt werden, und löst entsprechend Ereignisse aus.

Mausbindungen

Mausbindungen verknüpfen Mausbewegungen mit verschiedenen Befehlen. Mausbindungen werden mithilfe von IMouseProcessorProvider definiert, und Tastenbindungen werden mithilfe von IKeyProcessorProvider. Alle IWpfTextViewHost Bindungen werden automatisch instanziiert und mit Mausereignissen in der Ansicht verbunden.

Die IMouseProcessor Schnittstelle enthält Vorprozess- und Nachprozessereignishandler für verschiedene Mausereignisse. Um eines der Ereignisse zu behandeln, kann man einige der Methoden in MouseProcessorBase überschreiben.

Editorvorgänge

Editorvorgänge können verwendet werden, um die Interaktion mit dem Editor für Skripts oder andere Zwecke zu automatisieren. Sie können die IEditorOperationsFactoryService importieren, um Zugriff auf Operationen eines bestimmten ITextView zu erhalten. Anschließend können Sie diese Objekte verwenden, um die Auswahl zu ändern, die Ansicht zu scrollen oder das Caret in verschiedene Teile der Ansicht zu verschieben.

IntelliSense

IntelliSense unterstützt anweisungserledigung, Signaturhilfe (auch als Parameterinformationen bezeichnet), QuickInfo und Glühbirnen.

Die Anweisungsvervollständigung bietet Pop-up-Listen möglicher Ergänzungen für Methodennamen, XML-Elemente und andere Codierungs- oder Markupelemente. Im Allgemeinen ruft eine Benutzergeste eine Abschlusssitzung auf. Die Sitzung zeigt die Liste der potenziellen Vervollständigungen an, und der Benutzer kann eine Option auswählen oder die Liste schließen. Das ICompletionBroker ist für das Erstellen und Auslösen der ICompletionSession verantwortlich. Die ICompletionSource berechnet die CompletionSet von Abschlusselementen für die Sitzung.

Problembehandlung bei Import-/Exportproblemen: Zugreifen auf das MEF-Kompositionsfehlerprotokoll

Möglicherweise treten Probleme auf, wenn Sie versuchen, etwas zu importieren, das in der aktuellen VS-Installation nicht vorhanden ist, oder wenn Sie den Import oder Export falsch erstellen. Die primäre Möglichkeit, diese Probleme zu finden und zu beheben, besteht darin, auf das MEF-Kompositionsfehlerprotokoll (Managed Extensibility Framework) zu verweisen, das unter %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err gespeichert ist.