È possibile configurare Visual Studio 2008 per rimuovere automaticamente i caratteri di spazio alla fine di ogni riga quando si salva un file? Non sembra esserci un'opzione integrata, quindi ci sono estensioni disponibili per farlo?
È possibile configurare Visual Studio 2008 per rimuovere automaticamente i caratteri di spazio alla fine di ogni riga quando si salva un file? Non sembra esserci un'opzione integrata, quindi ci sono estensioni disponibili per farlo?
Risposte:
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 salvataggio, che credo sia l'impostazione predefinita.
Trova / Sostituisci utilizzando espressioni regolari
Nella finestra di dialogo Trova e sostituisci, espandere Trova Opzioni , selezionare Usa , scegliere le espressioni regolari
Trova cosa : " :Zs#$"
Sostituisci con : ""
fare clic su Sostituisci tutto
In altri editor (un normale parser di espressioni regolari) " :Zs#$" sarebbe " \s*$".
[^\S\r\n]+(?=\r?$)
[:Zs\t]#$è un utile adattamento.
Puoi 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 un po 'di 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.
Puoi farlo facilmente con queste tre azioni:
Ctrl+ A(seleziona tutto il testo)
Modifica -> Avanzate -> Elimina spazio bianco orizzontale
Modifica -> Avanzate -> Selezione formato
Aspetta qualche secondo e il gioco è fatto.
È Ctrl+ Zpossibile nel caso qualcosa sia andato storto.
Prendendo elementi da tutte le risposte già fornite, ecco il codice con cui sono finito. (Scrivo principalmente codice C ++, ma è facile controllare le 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
Puoi utilizzare una macro come descritto in Rimozione di spazi e riscrittura di commenti, utilizzando le ricerche regex
Sto usando VWD 2010 Express dove le macro non sono supportate, sfortunatamente. Così ho solo fare copia / incolla in Notepad ++ menu in alto a sinistra Edit> Blank Operations> Trim Trailing Spaceci sono altre operazioni connesse a disposizione troppo. Quindi copia / incolla di nuovo in Visual Studio.
Si può anche usare NetBeans invece di Notepad ++, che ha "Rimuovi spazi finali" nel menu "Origine".
A meno che questo non sia un progetto di una sola persona, non farlo. Deve essere banale diffondere i file locali con il repository del codice sorgente e la cancellazione degli spazi vuoti cambierebbe le righe che non è necessario modificare. Capisco bene; Mi piace avere i miei spazi bianchi tutti uniformi, ma questo è qualcosa a cui dovresti rinunciare per motivi di collaborazione più pulita.
Penso che la versione di Jeff Muir potrebbe essere leggermente migliorata se ritagli solo i file del codice sorgente (nel mio caso C #, ma è facile aggiungere più estensioni). Inoltre ho aggiunto un controllo per assicurarmi che la finestra del documento sia visibile perché alcune situazioni senza quel controllo mi 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 Visual Studio che ha il supporto tramite Visual Studio 2012.
Penso di avere una versione di questa macro che non bloccherà VS2010 durante il refactor e inoltre non bloccherà l'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
Uso ArtisticStyle (C ++) per fare questo e riformattare anche il mio codice. Tuttavia, ho dovuto aggiungerlo come strumento esterno e devi attivarlo tu stesso, quindi potrebbe non piacerti.
Tuttavia, trovo eccellente poter 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.
Basandosi sulla risposta di Dyaus e su un'espressione regolare da un rapporto di connessione , ecco una macro che gestisce Salva tutto, non sostituisce le tabulazioni con spazi e non richiede una variabile statica. Il suo possibile svantaggio? 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 altro cerchi di usarlo 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 una conversione grezza di {:b}+$non riuscire ad abbinare il ritorno a capo.
Questo è un ottimo esempio di come rimuovere gli spazi vuoti finali. Ci sono alcune cose che cambierei in base a ciò che ho scoperto usando questa macro. Prima di tutto, la macro converte automaticamente le tabulazioni in spazi. Questo non è sempre desiderabile e potrebbe portare a peggiorare le cose per le persone che amano le schede (tipicamente basate su Linux). Il problema delle tabulazioni non è comunque lo stesso del problema degli spazi bianchi extra. In secondo luogo, la macro presuppone che venga salvato un solo file alla volta. Se salvi più file contemporaneamente, non rimuoverà correttamente lo spazio vuoto. Il motivo è semplice. Il documento corrente è considerato il documento che puoi vedere. Terzo, non esegue il controllo degli errori sui risultati della ricerca. Questi risultati possono fornire una migliore intelligenza su cosa fare dopo. Ad esempio, se non vengono trovati e sostituiti spazi vuoti, non è necessario salvare nuovamente il file. In generale, non mi piaceva la necessità della bandiera globale per essere salvata o meno. Tende a chiedere problemi in base a stati sconosciuti. Sospetto che la bandiera sia stata aggiunta esclusivamente per evitare un ciclo infinito.
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
Ho aggiunto finestre di messaggio di debug per vedere cosa stava succedendo. È stato molto chiaro che il salvataggio di più file non funzionava. Se vuoi giocare con loro, rimuovi il commento da quelle battute.
La differenza fondamentale è l'utilizzo di document.Activate () per forzare il documento nel documento attivo attivo in primo piano. Se il risultato è 4, significa che il testo è stato sostituito. Zero significa che non è successo niente. Vedrai due salvataggi per ogni file. Il primo sostituirà e il secondo non farà nulla. Potenzialmente potrebbero esserci problemi se il salvataggio non è in grado di scrivere il file, ma si spera che questo evento non venga chiamato se ciò accade.
Prima dello script originale, non ero a conoscenza di come funzionava lo scripting in Visual Studio. È leggermente sorprendente che utilizzi Visual Basic come interfaccia principale, ma funziona perfettamente per quello che deve fare.
Una semplice aggiunta è rimuovere i ritorni a capo durante il salvataggio.
' Remove all the carriage returns.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
"\x000d\x000a", _
vsFindOptions.vsFindOptionsRegularExpression, _
"\x000a", _
vsFindTarget.vsFindTargetCurrentDocument, , , _
vsFindResultsLocation.vsFindResultsNone)
La chiave per questo funzionamento è cambiare \ x000d \ x000a in \ x000a. Il prefisso \ x indica un modello Unicode. Ciò automatizzerà il processo di preparazione dei file sorgente per i sistemi Linux.