Ist es möglich, Visual Studio 2008 so zu konfigurieren, dass Leerzeichen am Ende jeder Zeile beim Speichern einer Datei automatisch entfernt werden? Es scheint keine integrierte Option zu geben. Gibt es dafür Erweiterungen?
Ist es möglich, Visual Studio 2008 so zu konfigurieren, dass Leerzeichen am Ende jeder Zeile beim Speichern einer Datei automatisch entfernt werden? Es scheint keine integrierte Option zu geben. Gibt es dafür Erweiterungen?
Antworten:
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.
Suchen / Ersetzen mit regulären Ausdrücken
Erweitern Sie im Dialogfeld Suchen und Ersetzen die Option Suchoptionen , aktivieren Sie Verwenden und wählen Sie Reguläre Ausdrücke
Finden Sie was : " :Zs#$
"
Ersetzen durch : ""
Klicken Sie auf Alle ersetzen
In anderen Editoren (einem normalen Parser für reguläre Ausdrücke) :Zs#$
wäre " \s*$
" " ".
[^\S\r\n]+(?=\r?$)
[:Zs\t]#$
ist dies eine nützliche Anpassung.
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 von dem in ace_guidelines.vsmacros geändert, das mit einer schnellen Google-Suche gefunden werden kann.
Mit diesen drei Aktionen können Sie dies ganz einfach tun:
Ctrl+ A(Alle Texte auswählen)
Bearbeiten -> Erweitert -> Horizontales Leerzeichen löschen
Bearbeiten -> Erweitert -> Formatauswahl
Warten Sie einige Sekunden und fertig.
Es ist Ctrl+ Z‚ in der Lage, falls etwas schief gelaufen ist .
Hier ist der Code, mit dem ich am Ende Elemente aus allen bereits gegebenen Antworten erhalten habe. (Ich schreibe hauptsächlich C ++ - Code, aber es ist einfach, bei 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
Sie können ein Makro verwenden, wie unter Entfernen von Leerzeichen und Umschreiben von Kommentaren mithilfe von Regex-Suchen beschrieben
Ich verwende VWD 2010 Express, wo Makros leider nicht unterstützt werden. Also habe ich nur tun , Kopieren / Einfügen in Notepad ++ links oben Menü Edit
> Blank Operations
> Trim Trailing Space
gibt es weitere ähnliche zu verfügbaren Operationen. Kopieren Sie es anschließend in Visual Studio.
Sie können auch NetBeans anstelle von Notepad ++ verwenden, das im Menü "Quelle" die Option "Nachgestellte Leerzeichen entfernen" enthält.
Tun Sie es nicht, es sei denn, dies ist ein Ein-Personen-Projekt. Es muss trivial sein, Ihre lokalen Dateien von Ihrem Quellcode-Repository zu unterscheiden, und das Löschen von Leerzeichen würde Zeilen ändern, die Sie nicht ändern müssen. Ich verstehe vollkommen; Ich liebe es, mein Leerzeichen einheitlich zu gestalten - aber das sollten Sie aufgeben, um eine sauberere Zusammenarbeit zu gewährleisten.
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 Prüfung hinzugefügt, um sicherzustellen, dass das Dokumentfenster sichtbar ist, da einige Situationen ohne diese Prü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
Ich persönlich liebe die Visual Studio-Erweiterung Trailing Whitespace Visualizer, die bereits über Visual Studio 2012 unterstützt wird.
Ich glaube, ich habe eine Version dieses Makros, die VS2010 auf Refactor nicht zum Absturz bringt und auch die IDE beim Speichern von Nicht-Text-Dateien nicht hängen lässt. Versuche dies:
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
Ich benutze dazu ArtisticStyle (C ++) und formatiere meinen Code neu. 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 benutzerdefiniertere Weise neu formatieren kann (z. B. mehrzeilige Funktionsparameter), um den Preis für die manuelle Ausführung zu zahlen. Das Tool ist kostenlos.
Aufbauend auf Dyaus 'Antwort und einem regulären Ausdruck aus einem Verbindungsbericht ist hier ein Makro, das das Speichern aller Elemente behandelt, Tabulatoren nicht durch Leerzeichen ersetzt und keine statische Variable erfordert. Es ist ein möglicher Nachteil? Es scheint ein wenig langsam, vielleicht aufgrund mehrerer Anrufe an 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, lautet der reguläre Ausdruck, den ich letztendlich verwendet habe [ \t]+(?=\r?$)
(vergessen Sie nicht, die Backslashes bei Bedarf zu umgehen). Ich kam hier nach mehreren vergeblichen Versuchen , die Probleme mit einer zu beheben Raw - Konvertierung von {:b}+$
Versagen des Wagenrücklauf zu entsprechen.
Dies ist ein wirklich gutes Beispiel dafür, wie nachgestellte Leerzeichen entfernt werden. Es gibt einige Dinge, die ich basierend auf dem, was ich mit diesem Makro entdeckt habe, ändern würde. Zunächst konvertiert das Makro Tabulatoren automatisch in Leerzeichen. Dies ist nicht immer wünschenswert und kann dazu führen, dass sich die Situation für Menschen, die Tabs lieben (normalerweise Linux-basiert), verschlimmert. Das Tab-Problem ist sowieso nicht wirklich dasselbe wie das zusätzliche Whitespace-Problem. Zweitens geht das Makro davon aus, dass nur eine Datei gleichzeitig gespeichert wird. Wenn Sie mehrere Dateien gleichzeitig speichern, wird das Leerzeichen nicht korrekt entfernt. Der Grund ist einfach. Das aktuelle Dokument wird als das Dokument betrachtet, das Sie sehen können. Drittens werden die Suchergebnisse nicht auf Fehler überprüft. Diese Ergebnisse können eine bessere Aufklärung darüber geben, was als nächstes zu tun ist. Wenn beispielsweise kein Leerzeichen gefunden und ersetzt wird, Die Datei muss nicht erneut gespeichert werden. Im Allgemeinen gefiel mir nicht, dass die globale Flagge gespeichert werden muss oder nicht. Es neigt dazu, aufgrund unbekannter Zustände nach Ärger zu fragen. Ich vermute, die Flagge wurde nur hinzugefügt, um eine Endlosschleife zu verhindern.
Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
Handles DocumentEvents.DocumentSaved
Dim result As vsFindResult
'Dim nameresult As String
Try
document.Activate()
' Remove all the trailing whitespaces.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
":Zs+$", _
vsFindOptions.vsFindOptionsRegularExpression, _
String.Empty, _
vsFindTarget.vsFindTargetCurrentDocument, , , _
vsFindResultsLocation.vsFindResultsNone)
'nameresult = document.Name & " " & Str$(result)
'MsgBox(nameresult, , "Filename and result")
If result = vsFindResult.vsFindResultReplaced Then
'MsgBox("Document Saved", MsgBoxStyle.OkOnly, "Saved Macro")
document.Save()
Else
'MsgBox("Document Not Saved", MsgBoxStyle.OkOnly, "Saved Macro")
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
End Try
End Sub
Ich habe Debug-Meldungsfelder hinzugefügt, um zu sehen, was los ist. Es wurde sehr deutlich, dass das Speichern mehrerer Dateien nicht funktionierte. Wenn Sie mit ihnen spielen möchten, kommentieren Sie diese Zeilen aus.
Der Hauptunterschied besteht in der Verwendung von document.Activate (), um das Dokument in den Vordergrund des aktiven aktuellen Dokuments zu zwingen. Wenn das Ergebnis 4 ist, bedeutet dies, dass der Text ersetzt wurde. Null bedeutet, dass nichts passiert ist. Sie sehen zwei Speicherungen für jede Datei. Der erste wird ersetzen und der zweite wird nichts tun. Möglicherweise kann es zu Problemen kommen, wenn der Speicher die Datei nicht schreiben kann. Hoffentlich wird dieses Ereignis in diesem Fall nicht aufgerufen.
Vor dem ursprünglichen Skript war mir nicht bekannt, wie die Skripterstellung in Visual Studio funktioniert. Es ist etwas überraschend, dass Visual Basic als Hauptschnittstelle verwendet wird, aber es funktioniert einwandfrei für das, was es tun muss.
Eine einfache Ergänzung besteht darin, Wagenrückläufe während des Speicherns zu entfernen.
' Remove all the carriage returns.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
"\x000d\x000a", _
vsFindOptions.vsFindOptionsRegularExpression, _
"\x000a", _
vsFindTarget.vsFindTargetCurrentDocument, , , _
vsFindResultsLocation.vsFindResultsNone)
Der Schlüssel zu dieser Arbeit ist das Ändern von \ x000d \ x000a in \ x000a. Das Präfix \ x gibt ein Unicode-Muster an. Dies automatisiert den Prozess der Vorbereitung von Quelldateien für Linux-Systeme.