it-swarm-eu.dev

Wie entferne ich automatisch abschließende Leerzeichen in Visual Studio 2008?

Ist es möglich, Visual Studio 2008 so zu konfigurieren, dass beim Speichern einer Datei automatisch Leerzeichen am Ende jeder Zeile entfernt werden? Es scheint keine eingebaute Option zu geben. Gibt es dafür Erweiterungen?

120
ChrisN

CodeMaid ist eine sehr beliebte Visual Studio-Erweiterung und führt dies automatisch zusammen mit anderen nützlichen Bereinigungen durch.

Ich habe es so eingestellt, dass beim Speichern eine Datei bereinigt wird, was meiner Meinung nach die Standardeinstellung ist.

65
arserbin3

Suchen/Ersetzen mit regulären Ausdrücken

Erweitern Sie im Dialogfeld Suchen und Ersetzen Suchoptionen, aktivieren Sie Verwenden, und wählen Sie Reguläre Ausdrücke

Find What: ":Zs#$ "

Ersetzen durch: ""

klicken Sie auf Alle ersetzen

In anderen Editoren (a normal Parser für reguläre Ausdrücke) ":Zs#$" wäre "\s*$ ".

71
Greg Ogle

Sie können ein Makro erstellen, das nach dem Speichern ausgeführt wird, um dies für Sie zu tun.

Fügen Sie dem EnvironmentEvents-Modul für Ihre Makros Folgendes hinzu.

Private saved As Boolean = False
Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
                                         Handles DocumentEvents.DocumentSaved
    If Not saved Then
        Try
            DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                                 "\t", _
                                 vsFindOptions.vsFindOptionsRegularExpression, _
                                 "  ", _
                                 vsFindTarget.vsFindTargetCurrentDocument, , , _
                                 vsFindResultsLocation.vsFindResultsNone)

            ' Remove all the trailing whitespaces.
            DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                                 ":Zs+$", _
                                 vsFindOptions.vsFindOptionsRegularExpression, _
                                 String.Empty, _
                                 vsFindTarget.vsFindTargetCurrentDocument, , , _
                                 vsFindResultsLocation.vsFindResultsNone)

            saved = True
            document.Save()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
        End Try
    Else
        saved = False
    End If
End Sub

Ich benutze dies seit einiger Zeit ohne Probleme. Ich habe das Makro nicht erstellt, sondern es von dem in ace_guidelines.vsmacros geändert, das mit einer schnellen Google-Suche gefunden werden kann.

30
Dyaus

Vor dem Speichern können Sie möglicherweise die Verknüpfung für die automatische Formatierung verwenden CTRL+K+D.

16
Vyrotek

Mit diesen drei Aktionen können Sie dies ganz einfach tun:

  • Ctrl + A (Wählen Sie den gesamten Text aus.)

  • Bearbeiten -> Erweitert -> Horizontale Leerzeichen löschen

  • Bearbeiten -> Erweitert -> Formatauswahl

Warten Sie ein paar Sekunden und fertig.

Es ist Ctrl + Zin der Lage, falls etwas schief gelaufen ist.

9
iPixel

Hier ist der Code, mit dem ich am Ende fertig war. (Ich schreibe hauptsächlich C++ - Code, aber es ist einfach, nach Bedarf nach verschiedenen Dateierweiterungen zu suchen.)

Vielen Dank an alle, die dazu beigetragen haben!

Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
    Handles DocumentEvents.DocumentSaved
    Dim fileName As String
    Dim result As vsFindResult

    Try
        fileName = document.Name.ToLower()

        If fileName.EndsWith(".cs") _
        Or fileName.EndsWith(".cpp") _
        Or fileName.EndsWith(".c") _
        Or fileName.EndsWith(".h") Then
            ' Remove trailing whitespace
            result = DTE.Find.FindReplace( _
                vsFindAction.vsFindActionReplaceAll, _
                "{:b}+$", _
                vsFindOptions.vsFindOptionsRegularExpression, _
                String.Empty, _
                vsFindTarget.vsFindTargetFiles, _
                document.FullName, _
                "", _
                vsFindResultsLocation.vsFindResultsNone)

            If result = vsFindResult.vsFindResultReplaced Then
                ' Triggers DocumentEvents_DocumentSaved event again
                document.Save()
            End If
        End If
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try
End Sub
7
ChrisN
3
Jorge Ferreira

Ich verwende VWD 2010 Express, wo Makros leider nicht unterstützt werden. Also kopiere/füge ich einfach in Notepad ++ Menü oben links Edit> Blank Operations> Trim Trailing Space Es stehen auch andere verwandte Operationen zur Verfügung. Kopieren Sie sie anschließend in Visual Studio, und fügen Sie sie wieder ein.

Sie können auch NetBeans anstelle von Notepad ++ verwenden, das im Menü "Quelle" die Option "Nachgestellte Leerzeichen entfernen" enthält.

2
Evgenii

Tun Sie es nicht, es sei denn, es handelt sich um ein Ein-Personen-Projekt. Es muss trivial sein, Ihre lokalen Dateien gegen Ihr Quellcode-Repository abzugleichen, und das Löschen von Leerzeichen würde Zeilen ändern, die Sie nicht ändern müssen. Ich verstehe vollkommen; Ich liebe es, mein Whitespace einheitlich zu gestalten - aber das sollten Sie aufgeben, um die Zusammenarbeit zu verbessern.

1
Kevin Conner

Ich denke, dass die Jeff Muir -Version ein wenig verbessert werden könnte, wenn sie nur Quellcodedateien schneidet (in meinem Fall C #, aber es ist einfach, weitere Erweiterungen hinzuzufügen). Außerdem habe ich eine Überprüfung hinzugefügt, um sicherzustellen, dass das Dokumentfenster sichtbar ist, da einige Situationen ohne diese Überprüfung seltsame Fehler anzeigen (z. B. LINQ to SQL-Dateien '* .dbml').

Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) Handles DocumentEvents.DocumentSaved
    Dim result As vsFindResult
    Try
        If (document.ActiveWindow Is Nothing) Then
            Return
        End If
        If (document.Name.ToLower().EndsWith(".cs")) Then
            document.Activate()
            result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, ":Zs+$", vsFindOptions.vsFindOptionsRegularExpression, String.Empty, vsFindTarget.vsFindTargetCurrentDocument, , , vsFindResultsLocation.vsFindResultsNone)
            If result = vsFindResult.vsFindResultReplaced Then
                document.Save()
            End If
        End If
    Catch ex As Exception
        MsgBox(ex.Message & Chr(13) & "Document: " & document.FullName, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try
End Sub
1
David Abella

Ich persönlich liebe die Trailing Whitespace Visualizer Visual Studio-Erweiterung, die Unterstützung durch Visual Studio 2012 bietet.

1
pwhe23

Ich benutze ArtisticStyle (C++), um dies zu tun und auch meinen Code neu zu formatieren. Ich musste dies jedoch als externes Tool hinzufügen und Sie müssen es selbst auslösen, damit es Ihnen möglicherweise nicht gefällt.

Ich finde es jedoch hervorragend, dass ich Code auf eine benutzerdefinierte Weise neu formatieren kann (z. B. mehrzeilige Funktionsparameter), sodass ich den Preis für die manuelle Ausführung zahlen kann. Das Tool ist kostenlos.

0
Marcin Gil

Aufbauend auf Dyaus 'Antwort und einem regulären Ausdruck aus einem Verbindungsbericht , hier ist ein Makro, das das Speichern aller behandelt, Tabulatoren nicht durch Leerzeichen ersetzt und keine statische Variable benötigt. Sein möglicher Nachteil? Es scheint ein wenig langsam zu sein, vielleicht aufgrund mehrerer Aufrufe von FindReplace.

Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
                                         Handles DocumentEvents.DocumentSaved
    Try
        ' Remove all the trailing whitespaces.
        If vsFindResult.vsFindResultReplaced = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                             "{:b}+$", _
                             vsFindOptions.vsFindOptionsRegularExpression, _
                             String.Empty, _
                             vsFindTarget.vsFindTargetFiles, _
                             document.FullName, , _
                             vsFindResultsLocation.vsFindResultsNone) Then
            document.Save()
        End If
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try
End Sub

Für alle anderen, die versuchen, dies in einem Visual Studio 2012-Add-In zu verwenden, ist der reguläre Ausdruck, den ich letztendlich verwendet habe, [ \t]+(?=\r?$) (vergessen Sie nicht, die umgekehrten Schrägstriche zu maskieren, falls erforderlich). Ich bin hier angekommen, nachdem mehrere vergebliche Versuche unternommen wurden, die Probleme zu beheben, bei denen rohe Konvertierung von {:b}+$ Nicht mit dem Wagenrücklauf übereinstimmte.

0
Michael Urman

Ich glaube, ich habe eine Version dieses Makros, die VS2010 auf Refactor nicht zum Absturz bringt, und die IDE beim Speichern von Nicht-Text-Dateien auch nicht hängt. Versuchen Sie Folgendes:

Private Sub DocumentEvents_DocumentSaved( _
    ByVal document As EnvDTE.Document) _
    Handles DocumentEvents.DocumentSaved
    ' See if we're saving a text file
    Dim textDocument As EnvDTE.TextDocument = _
        TryCast(document.Object(), EnvDTE.TextDocument)

    If textDocument IsNot Nothing Then
        ' Perform search/replace on the text document directly
        ' Convert tabs to spaces
        Dim convertedTabs = textDocument.ReplacePattern("\t", "    ", _
            vsFindOptions.vsFindOptionsRegularExpression)

        ' Remove trailing whitespace from each line
        Dim removedTrailingWS = textDocument.ReplacePattern(":Zs+$", "", _
            vsFindOptions.vsFindOptionsRegularExpression)

        ' Re-save the document if either replace was successful
        ' (NOTE: Should recurse only once; the searches will fail next time)
        If convertedTabs Or removedTrailingWS Then
            document.Save()
        End If
    End If
End Sub
0
Julian