Comment supprimer automatiquement les espaces de fin dans Visual Studio 2008?

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

120
demandé sur ChrisN 2008-09-17 17:09:49

16 réponses

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

Je l'ai configuré pour nettoyer un fichier sur save, ce que je crois être défaut.

64
répondu arserbin3 2017-07-11 18:32:50

Rechercher / Remplacer à L'aide D'Expressions régulières

Dans le dialogue Rechercher et Remplacer, développez Trouver des Options, vérifiez Utiliser, choisissez expressions Régulières

Trouver Ce: ":Zs#$"

Remplacer avec: ""

Cliquez Sur Remplacez Tout

Dans d'autres éditeurs (un normal Expression Régulière de l'analyseur) ":Zs#$" serait "\s*$".

69
répondu Greg Ogle 2008-09-17 13:33:57

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 l'ai modifiée de celle de ace_guidelines.vsmacros qui peut être trouvé avec une recherche rapide sur google.

31
répondu 2009-03-30 17:40:33

Avant d'enregistrer, vous pouvez être en mesure d'utiliser la fonction d'auto-format raccourci CTRL+K+D.

16
répondu Vyrotek 2015-11-12 14:01:11

Vous pouvez le faire facilement avec ces trois actions:

  • Ctrl + Un (sélectionner tout le texte)

  • Modifier - > Avancé - > Supprimer Les Espaces Horizontaux

  • Modifier - > Avancé - > Sélection Du Format

Attendez quelques secondes et fait.

C'est Ctrl + Z 'capable en cas de problème.

9
répondu iPixel 2012-08-20 16:53:42

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 vérifier les différentes extensions de fichiers, au besoin.)

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
répondu ChrisN 2011-01-16 13:05:59
3
répondu Jorge Ferreira 2012-08-20 16:46:36

J'utilise VWD 2010 Express où les macros ne sont malheureusement pas supportées. Donc, je fais juste copier / coller dans Notepad++ menu en haut à gauche Edit > Blank Operations > Trim Trailing Space Il y a d'autres opérations connexes disponibles aussi. Puis copiez / collez dans Visual Studio.

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

2
répondu Evgenii 2015-03-17 14:18:26

Sauf s'il S'agit d'un projet d'une seule personne, ne le faites pas. Il doit être trivial de comparer vos fichiers locaux à votre référentiel de code source, et la suppression des espaces modifierait les lignes que vous n'avez pas besoin de modifier. Je comprends tout à fait; j'aime que mes espaces soient uniformes – mais c'est quelque chose que vous devriez abandonner pour une collaboration plus propre.

1
répondu Kevin Conner 2008-09-17 13:25:05

Je pense que la versionJeff Muir pourrait être un peu améliorée si elle ne fait que couper les fichiers de code source (dans mon cas C#, mais il est facile d'ajouter plus d'extensions). J'ai également ajouté une vérification pour m'assurer que la fenêtre du document est visible car certaines situations sans cette vérification me montrent des erreurs étranges (LINQ to SQL files '*.dbml", par exemple).

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
répondu David Abella 2012-08-20 16:51:09

Personnellement, j'aime le visualiseur D'espaces de fin extension Visual Studio qui a le soutien de retour à travers Visual Studio 2012.

1
répondu pwhe23 2016-02-18 19:28:51

Je pense avoir une version de cette macro qui ne plante pas VS2010 sur refactor, et ne bloque pas non plus L'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
répondu Julian 2011-04-25 07:01:20

J'utilise ArtisticStyle (C++) pour ce faire et aussi reformater mon code. Cependant, j'ai dû ajouter ceci comme un outil externe et vous devez le déclencher vous-même afin que vous ne l'aimiez pas.

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

0
répondu Marcin Gil 2012-08-20 16:48:05

En S'appuyant sur la réponse de Dyaus et une expression régulière d'un rapport connect, Voici une macro qui gère tout enregistrer, ne remplace pas les onglets par des espaces et ne nécessite pas de variable statique. Son inconvénient possible? Cela semble un peu lent, peut-être en raison de plusieurs appels à 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 toute autre personne essayant de l'utiliser dans un complément Visual Studio 2012, l'expression régulière que j'ai fini par utiliser est [ \t]+(?=\r?$) (n'oubliez pas d'échapper aux antislashs si nécessaire). Je suis arrivé ici après plusieurs tentatives futiles pour résoudre les problèmes avec une conversion brute de {:b}+$ ne correspondant pas au retour chariot.

0
répondu Michael Urman 2013-07-15 13:14:02

C'est un très bon exemple de la façon de supprimer les espaces de fin. Il y a quelques choses que je changerais en fonction de ce que j'ai découvert en utilisant cette macro. Tout d'abord, la macro convertit automatiquement les onglets en espaces. Ce n'est pas toujours souhaitable et pourrait conduire à aggraver les choses pour les personnes qui aiment les onglets (généralement basés sur Linux). Le problème d'onglet n'est pas vraiment le même que le problème d'espace supplémentaire de toute façon. Deuxièmement, la macro suppose qu'un fichier est enregistré à la fois. Si vous enregistrez plusieurs fichiers à la fois, il ne supprimera pas correctement les espaces. La raison en est simple. Le document actuel est considéré comme le document que vous pouvez voir. Troisièmement, il ne fait aucune vérification d'erreur sur les résultats de recherche. Ces résultats peuvent donner une meilleure intelligence sur ce qu'il faut faire ensuite. Par exemple, si aucun espace n'est trouvé et remplacé, il n'est pas nécessaire d'enregistrer à nouveau le fichier. En général, je n'ai pas aimé la nécessité du drapeau mondial pour être sauvé ou non. Il a tendance à demander des ennuis en fonction de unknown. Je soupçonne que le drapeau a été ajouté uniquement pour empêcher une boucle infinie.

    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

J'ai ajouté des boîtes de message de débogage pour aider à voir ce qui se passait. Il a été très clair que la sauvegarde de plusieurs fichiers ne fonctionnait pas. Si vous voulez jouer avec eux, décommentez ces lignes.

La principale différence est l'utilisation du document.Activez () pour forcer le document dans le document actif en cours de premier plan. Si le résultat est 4, cela signifie que le texte a été remplacé. Zéro signifie qu'il ne s'est rien passé. Vous verrez deux sauvegardes pour chaque fichier. Le premier remplacera et le second ne fera rien. Potentiellement, il pourrait y avoir des problèmes si la sauvegarde ne peut pas écrire le fichier, mais j'espère que cet événement ne sera pas appelé si cela se produit.

Avant le script original, Je ne savais pas comment le script fonctionnait dans Visual Studio. Il est un peu surprenant qu'il utilise Visual Basic comme l'interface principale, mais il fonctionne très bien pour ce qu'il doit faire.

-1
répondu Jeff Muir 2009-11-11 03:29:02

Un ajout simple consiste à supprimer les retours chariot pendant la sauvegarde.

' Remove all the carriage returns.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                             "\x000d\x000a", _
                             vsFindOptions.vsFindOptionsRegularExpression, _
                             "\x000a", _
                             vsFindTarget.vsFindTargetCurrentDocument, , , _
                             vsFindResultsLocation.vsFindResultsNone)

La clé de ce fonctionnement est de changer \x000d\x000a en \x000a. le préfixe \ x indique un motif Unicode. Cela permettra d'automatiser le processus d'obtention des fichiers source prêts pour les systèmes Linux.

-1
répondu Jeff Muir 2010-03-10 07:31:06