È possibile configurare Visual Studio 2008 per rimuovere automaticamente i caratteri di spazi bianchi alla fine di ogni riga quando si salva un file? Non sembra esserci un'opzione integrata, quindi ci sono estensioni disponibili per farlo?
CodeMaid è un'estensione di Visual Studio molto popolare e lo fa automaticamente insieme ad altre utili pulizie.
L'ho impostato per ripulire un file al momento del salvataggio, che credo sia il valore predefinito.
Trova/Sostituisci usando le espressioni regolari
Nella finestra di dialogo Trova e sostituisci, espandi Trova opzioni, seleziona sa, scegli Espressioni regolari
Trova cosa: ":Zs#$
"
Sostituisci con: ""
fare clic su Sostituisci tutto
In altri editor (un normale parser di espressioni regolari) ":Zs#$
" sarebbe "\s*$
".
È possibile creare una macro che viene eseguita dopo un salvataggio per farlo per te.
Aggiungi quanto segue nel modulo EnvironmentEvents per le tue macro.
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
Lo sto usando da qualche tempo senza problemi. Non ho creato la macro, ma l'ho modificata da quella in ace_guidelines.vsmacros che può essere trovata con una rapida ricerca su Google.
Prima di salvare potresti essere in grado di utilizzare il collegamento di formattazione automatica CTRL+K+D.
Puoi farlo facilmente con queste tre azioni:
Ctrl + A (seleziona tutto il testo)
Modifica -> Avanzate -> Elimina spazi bianchi orizzontali
Modifica -> Avanzate -> Selezione formato
Aspetta qualche secondo e fatto.
Suo Ctrl + Z'in caso nel caso qualcosa fosse andato storto.
Prendendo elementi da tutte le risposte già fornite, ecco il codice con cui sono finito. (Scrivo principalmente codice C++, ma è facile controllare diverse estensioni di file, se necessario.)
Grazie a tutti quelli che hanno contribuito!
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
È possibile utilizzare una macro come descritta in Rimozione di spazi bianchi e riscrittura dei commenti, utilizzando le ricerche regex
Sto usando VWD 2010 Express dove le macro non sono supportate, sfortunatamente. Quindi faccio semplicemente copia/incolla in Notepad ++ menu in alto a sinistra Edit
> Blank Operations
> Trim Trailing Space
ci sono anche altre operazioni correlate disponibili. Quindi copia/incolla nuovamente in Visual Studio.
Si può anche usare NetBeans invece di Notepad ++, che ha "Rimuovi spazi finali" nel menu "Sorgente".
A meno che questo non sia un progetto individuale, non farlo. Dev'essere banale diffondere i tuoi file locali contro il tuo repository di codice sorgente e cancellare gli spazi bianchi cambierebbe le linee che non devi cambiare. Capisco bene; Adoro rendere uniforme il mio spazio bianco, ma è qualcosa che dovresti rinunciare per una collaborazione più pulita.
Penso che la versione Jeff Muir potrebbe essere leggermente migliorata se tagliasse solo i file del codice sorgente (nel mio caso C #, ma è facile aggiungere più estensioni). Inoltre ho aggiunto un segno di spunta per garantire che la finestra del documento sia visibile perché alcune situazioni senza quel controllo mostrano strani errori (ad esempio i file LINQ to SQL '* .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
Personalmente adoro l'estensione Trailing Whitespace Visualizer estensione di Visual Studio che ha il supporto attraverso Visual Studio 2012.
Uso ArtisticStyle (C++) per fare questo e anche riformattare il mio codice. Tuttavia, ho dovuto aggiungere questo come strumento esterno e devi attivarlo da solo, quindi potrebbe non piacerti.
Tuttavia, trovo eccellente che posso riformattare il codice in un modo più personalizzato (ad esempio, parametri di funzione multilinea) che posso pagare il prezzo di eseguirlo manualmente. Lo strumento è gratuito.
Sulla base della risposta di Dyaus e di un'espressione regolare da un report di connessione , ecco una macro che gestisce il salvataggio di tutti, non sostituisce le schede con spazi e non richiede una variabile statica. Il suo possibile aspetto negativo? Sembra un po 'lento, forse a causa di più chiamate a 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
Per chiunque cerchi di utilizzarlo in un componente aggiuntivo di Visual Studio 2012, l'espressione regolare che ho finito per usare è [ \t]+(?=\r?$)
(non dimenticare di sfuggire alle barre rovesciate se necessario). Sono arrivato qui dopo diversi inutili tentativi di risolvere i problemi con un conversione non elaborata di {:b}+$
Che non corrisponde al ritorno a capo.
Penso di avere una versione di questa macro che non bloccherà VS2010 sul refactor e inoltre non bloccherà il IDE durante il salvataggio di file non di testo. Prova questo:
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