Freigeben über


Neuformatierung Managed Code (Paketframework)

In Visual Studio kann Quellcode neu formatiert werden, indem die Verwendung von Einzüge und Leerräume normalisiert. Dadurch kann das Einfügen oder Entfernen von Leerzeichen oder Tabstopps zu Beginn jeder Zeile, das Hinzufügen von neuen Zeilen zwischen Zeilen oder Ersetzen von Registerkarten mit Leerzeichen oder Tabstopps. mit Leerzeichen einschließen

Hinweis

Hinweis, das Zeilenumbruchzeichen einfügt oder gelöscht wird, kann als Marker Haltepunkte und Lesezeichen auswirken, aber das Hinzufügen oder Entfernen von Leerzeichen oder Tabstopps wirkt sich nicht auf Marker.

Benutzer können einen Vorgang Umformatierungs starten, indem Auswahl formatieren oder Dokument formatieren vom Erweitert Menü im Menü Bearbeiten auswählen. Ein Umformatierungs Vorgang kann auch ausgelöst werden, wenn ein bestimmtes Zeichen oder ein Codeausschnitt eingefügt wird. Wenn Sie beispielsweise in C# schließende geschweifte Klammer eingeben, wird alles zwischen der übereinstimmenden geschweiften Klammer und die schließende Klammer automatisch auf die richtigen Ebene eingezogen.

Wenn Visual Studio den Auswahl formatieren oder dem Befehl Dokument formatieren Sprachdienst sendet, ruft die ViewFilter-Klasse die ReformatSpan-Methode in der Source-Klasse. Um das Formatieren Sie unterstützen muss ReformatSpan-Methode überschreiben und an den Formatierungscode besitzen.

Unterstützung für die Neuformatierung aktivieren

Zur Formatierung zu unterstützen, muss der EnableFormatSelection-Parameter ProvideLanguageServiceAttribute zu true festgelegt werden, wenn Sie ein VSPackage registrieren. Hierdurch wird die EnableFormatSelection-Eigenschaft auf truefest. Die CanReformat-Methode gibt den Wert dieser Eigenschaft zurück. Bei true zurückgibt, ruft die ViewFilter-Klasse das ReformatSpanan.

Die Neuformatierung implementieren

Um die Neuformatierung zu implementieren, müssen Sie eine Klasse von der Source-Klasse ableiten und die ReformatSpan-Methode überschreiben. Das TextSpan-Objekt beschreibt die Spanne, um zu formatieren und das EditArray-Objekt enthält die Bearbeitungen vorgenommen auf der Spanne an. Beachten Sie, dass diese Spanne das gesamte Dokument handeln kann. Da jedoch wahrscheinlich es ist, die mehrere Änderungen, die an der Spanne vorgenommen werden, sind alle Änderungen in einer einzigen Aktion invertierbar sein. Hierzu binden Sie alle Änderungen in einem CompoundAction-Objekt ein (finden Sie unter „Using CompoundActions-Klasse“ - Abschnitt in diesem Thema).

Beispiel

Im folgenden Beispiel wird sichergestellt, dass es ein einzelnes Leerzeichen nach einem Komma in der Auswahl vorhanden ist, es sei denn, das Komma oder gefolgt von einer Registerkarte am Ende der Zeile befindet. Abschließende Leerzeichen hinter dem letzten Komma in einer Zeile werden gelöscht. Weitere Informationen finden Sie im Abschnitt“ CompoundActions-Klasse mithilfe der in diesem Thema aus, um festzustellen, wie diese Methode in der ReformatSpan-Methode aufgerufen wird.

using Microsoft.VisualStudio.Package;
using Microsoft VisualStudio.TextManager.Interop;

namespace MyLanguagePackage
{
    class MySource : Source
    {
        private void DoFormatting(EditArray mgr, TextSpan span)
        {
            // Make sure there is one space after every comma unless followed
            // by a tab or comma is at end of line.
            IVsTextLines pBuffer = GetTextLines();
            if (pBuffer != null)
            {
                int    startIndex = span.iStartIndex;
                int    endIndex   = 0;
                string line       = "";
                // Loop over all lines in span
                for (int i = span.iStartLine; i <= span.iEndLine; i++)
                {
                    if (i < span.iEndLine)
                    {
                        pBuffer.GetLengthOfLine(i, out endIndex);
                    }
                    else
                    {
                        endIndex = span.iEndIndex;
                    }
                    pBuffer.GetLineText(i, startIndex, i, endIndex, out line);

                    if (line.Length > 0)
                    {
                        int index = 0;
                        // Loop over all commas in line
                        while ((index = line.IndexOf(',', index)) != -1)
                        {
                            int spaceIndex = index + 1;
                            // Determine how many spaces after comma
                            while (spaceIndex < line.Length && line[spaceIndex] == ' ')
                            {
                                ++spaceIndex;
                            }

                            int      spaceCount      = spaceIndex - (index + 1);
                            string   replacementText = " ";
                            bool     fDoEdit         = true;
                            TextSpan editTextSpan    = new TextSpan();

                            editTextSpan.iStartLine  = i;
                            editTextSpan.iEndLine    = i;
                            editTextSpan.iStartIndex = index + 1;

                            if (spaceIndex == line.Length)
                            {
                                if (spaceCount > 0)
                                {
                                    // Delete spaces after a comma at end of line
                                    editTextSpan.iEndIndex = spaceIndex;
                                    replacementText = "";
                                }
                                else
                                {
                                    // Otherwise, do not add spaces if comma is
                                    // at end of line.
                                    fDoEdit = false;
                                }
                            }
                            else if (spaceCount == 0)
                            {
                                if (spaceIndex < line.Length && line[spaceIndex] == '\t')
                                {
                                    // Do not insert space if a tab follows
                                    // a comma.
                                    fDoEdit = false;
                                }
                                else
                                {
                                    // No space after comma so add a space.
                                    editTextSpan.iEndIndex = index + 1;
                                }
                            }
                            else if (spaceCount > 1)
                            {
                                // More than one space after comma, replace
                                // with a single space.
                                editTextSpan.iEndIndex = spaceIndex;
                            }
                            else
                            {
                                // Single space after a comma and not at end
                                // of the line, leave it alone.
                                fDoEdit = false;
                            }
                            if (fDoEdit)
                            {
                                // Add edit operation
                                mgr.Add(new EditSpan(editTextSpan, replacementText));
                            }
                            index = spaceIndex;
                        }
                    }
                    startIndex = 0; // All subsequent lines start at 0
                }
                // Apply all edits
                mgr.ApplyEdits();
            }
        }
    }
}

Verwenden von CompoundActions-Klasse

Die gesamte Neuformatierung, die in einem Abschnitt des Codes durchgeführt wird, sollte in einer einzelnen Aktion invertierbar sein. Dies kann mithilfe einer CompoundAction-Klasse erreicht werden. Diese Klasse umschließt einen Satz von Bearbeitungsvorgänge für den Textpuffer in einem einzelnen Bearbeitungsvorgang ein.

Beispiel

Im Folgenden ein Beispiel dafür, wie die CompoundAction-Klasse verwendet. Weitere Informationen finden Sie im Beispiel unter „Implementieren der Unterstützung für Abschnitt dieses Themas finden Sie ein Beispiel der DoFormatting-Methode formatieren“.

using Microsoft.VisualStudio.Package;
using Microsoft VisualStudio.TextManager.Interop;

namespace MyLanguagePackage
{
    class MySource : Source
    {
        public override void ReformatSpan(EditArray mgr, TextSpan span)
        {
            string description = "Reformat code";
            CompoundAction ca = new CompoundAction(this, description);
            using (ca)
            {
                ca.FlushEditActions();      // Flush any pending edits
                DoFormatting(mgr, span);    // Format the span
            }
        }
    }
}

Siehe auch

Weitere Ressourcen

Sprachendienst-Funktionen (Managed Paketframework)