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?
16 réponses
CodeMaid est une extension Visual Studio très populaire et le fait automatiquement avec d'autres nettoyages utiles.
- Télécharger: https://github.com/codecadwallader/codemaid/releases/tag/v0.4.3
- Téléchargement moderne: https://marketplace.visualstudio.com/items?itemName=SteveCadwallader.CodeMaid
- Documentation: http://www.codemaid.net/documentation/#cleaning
Je l'ai configuré pour nettoyer un fichier sur save, ce que je crois être défaut.
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*$
".
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.
Avant d'enregistrer, vous pouvez être en mesure d'utiliser la fonction d'auto-format raccourci CTRL+K+D.
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.
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
Vous pouvez utiliser une macro comme décrite dans Suppression des espaces et réécriture des commentaires, à l'aide de recherches regex
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".
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.
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
Personnellement, j'aime le visualiseur D'espaces de fin extension Visual Studio qui a le soutien de retour à travers Visual Studio 2012.
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
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.
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.
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.
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.