web-dev-qa-db-fra.com

Comment supprimer automatiquement les espaces finaux dans Visual Studio 2008?

Est-il possible de configurer Visual Studio 2008 pour supprimer automatiquement les caractères d'espacement à la fin de chaque ligne lors de l'enregistrement d'un fichier? Il ne semble pas y avoir d’option intégrée, existe-t-il des extensions pour le faire?

120
ChrisN

CodeMaid est une extension très populaire de Visual Studio et le fait automatiquement avec d’autres nettoyages utiles.

Je l'ai configuré pour nettoyer un fichier lors de la sauvegarde, ce qui, à mon avis, est le fichier par défaut.

65
arserbin3

Rechercher/remplacer à l'aide d'expressions régulières

Dans la boîte de dialogue Rechercher et remplacer, développez Options de recherche, cochez la case tiliser, choisissez Expressions régulières

Trouver quoi: ":Zs#$ "

Remplacer par: ""

cliquez Remplacer tout

Dans les autres éditeurs (a normal Analyseur d’expressions régulières) ":Zs#$" serait "\s*$ ".

71
Greg Ogle

Vous pouvez créer une macro qui s'exécute après une sauvegarde pour le faire pour vous.

Ajoutez ce qui suit dans le module EnvironmentEvents pour vos macros.

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

Je l'utilise depuis un certain temps maintenant sans aucun problème. Je n'ai pas créé la macro, mais je l'ai modifiée par rapport à celle de ace_guidelines.vsmacros, qui peut être trouvée à l'aide d'une recherche rapide sur Google.

30
Dyaus

Avant de sauvegarder, vous pourrez peut-être utiliser le raccourci de formatage automatique CTRL+K+D.

16
Vyrotek

Vous pouvez le faire facilement avec ces trois actions:

  • Ctrl + A (sélectionnez tout le texte)

  • Édition -> Avancé -> Supprimer les espaces blancs horizontaux

  • Édition -> Avancé -> Sélection du format

Attendez quelques secondes et c'est fait.

Ses Ctrl + Z'capable au cas où quelque chose se passait mal.

9
iPixel

En prenant des éléments de toutes les réponses déjà données, voici le code avec lequel je me suis retrouvé. (J'écris principalement du code C++, mais il est facile de rechercher des extensions de fichiers différentes, si nécessaire.)

Merci à tous ceux qui ont contribué!

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

J'utilise VWD 2010 Express où les macros ne sont malheureusement pas prises en charge. Donc, je ne fais que copier/coller dans Notepad ++ menu en haut à gauche Edit> Blank Operations> Trim Trailing Space il existe également d’autres opérations connexes. Copiez/collez ensuite dans Visual Studio.

On peut aussi utiliser NetBeans au lieu de Notepad ++, qui a "Supprimer les espaces de fin" dans le menu "Source".

2
Evgenii

À moins qu'il ne s'agisse d'un projet d'une personne, ne le faites pas. Il doit être facile de comparer vos fichiers locaux à votre référentiel de code source, et effacer les blancs modifierait les lignes que vous n'avez pas besoin de changer. Je comprends parfaitement; J'aime avoir tous mes uniformes dans les espaces blancs - mais c'est quelque chose que vous devriez abandonner pour des raisons de collaboration plus propre.

1
Kevin Conner

Je pense que la version Jeff Muir pourrait être un peu améliorée si elle ne supprime que les fichiers de code source (dans mon cas, C #, mais il est facile d’ajouter d’autres extensions). De plus, j'ai ajouté une vérification pour m'assurer que la fenêtre du document est visible, car certaines situations sans cette vérification m'indiquent d'étranges erreurs (par exemple, les fichiers 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

Personnellement, j’aime beaucoup l’extension Visual Studio Trailing Whitespace Visualizer, qui prend en charge Visual Studio 2012.

1
pwhe23

J'utilise ArtisticStyle (C++) pour le faire et aussi reformater mon code. Cependant, j'ai dû ajouter ceci en tant qu'outil externe et vous devez le déclencher vous-même pour ne pas l'aimer.

Cependant, je trouve excellent que je puisse reformater le code de manière plus personnalisée (par exemple, les paramètres de fonction multiligne) et que je puisse payer le prix de l’exécution manuelle. L'outil est gratuit.

0
Marcin Gil

En vous appuyant sur la réponse de Dyaus et sur une expression régulière tirée d'un rapport de connexion , voici une macro qui gère tout enregistrer, ne remplace pas les tabulations par des espaces et ne nécessite pas de variable statique. Son inconvénient possible? Cela semble un peu lent, peut-être en raison d'appels multiples à 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

Pour tous ceux qui essaient d'utiliser cela dans un complément Visual Studio 2012, l'expression régulière que j'ai finalement utilisée est [ \t]+(?=\r?$) (n'oubliez pas d'échapper aux barres obliques inverses si nécessaire). Je suis arrivé ici après plusieurs tentatives infructueuses de résolution des problèmes, avec un conversion brute de {:b}+$ Ne correspondant pas au retour chariot.

0
Michael Urman

Je pense avoir une version de cette macro qui ne plantera pas VS2010 sur le refactor et ne bloquera pas non plus le IDE lors de l'enregistrement de fichiers non-texte. Essayez ceci:

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