it-swarm.it

Come rimuovere automaticamente gli spazi vuoti finali in Visual Studio 2008?

È 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?

120
ChrisN

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.

65
arserbin3

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*$".

71
Greg Ogle

È 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.

30
Dyaus

Prima di salvare potresti essere in grado di utilizzare il collegamento di formattazione automatica CTRL+K+D.

16
Vyrotek

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.

9
iPixel

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
7
ChrisN
3
Jorge Ferreira

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".

2
Evgenii

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.

1
Kevin Conner

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
1
David Abella

Personalmente adoro l'estensione Trailing Whitespace Visualizer estensione di Visual Studio che ha il supporto attraverso Visual Studio 2012.

1
pwhe23

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.

0
Marcin Gil

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.

0
Michael Urman

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
0
Julian