¿Es posible configurar Visual Studio 2008 para eliminar automáticamente los espacios en blanco al final de cada línea al guardar un archivo? No parece haber una opción incorporada, ¿hay extensiones disponibles para hacer esto?
¿Es posible configurar Visual Studio 2008 para eliminar automáticamente los espacios en blanco al final de cada línea al guardar un archivo? No parece haber una opción incorporada, ¿hay extensiones disponibles para hacer esto?
Respuestas:
CodeMaid es una extensión de Visual Studio muy popular y lo hace automáticamente junto con otras limpiezas útiles.
Lo configuré para limpiar un archivo al guardar, que creo que es el predeterminado.
Buscar / reemplazar usando expresiones regulares
En el cuadro de diálogo Buscar y reemplazar, expanda Opciones de búsqueda , marque Usar , elija Expresiones regulares
Encuentra qué : " :Zs#$
"
Reemplazar con : ""
haga clic en Reemplazar todo
En otros editores (un analizador normal de expresiones regulares) " :Zs#$
" sería " \s*$
".
[^\S\r\n]+(?=\r?$)
[:Zs\t]#$
es una adaptación útil.
Puede crear una macro que se ejecute después de guardar para hacer esto por usted.
Agregue lo siguiente al módulo EnvironmentEvents para sus 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
He estado usando esto por algún tiempo sin ningún problema. No creé la macro, pero la modifiqué de la de ace_guidelines.vsmacros que se puede encontrar con una búsqueda rápida en Google.
Puede hacer esto fácilmente con estas tres acciones:
Ctrl+ A(seleccionar todo el texto)
Editar -> Avanzado -> Eliminar espacio en blanco horizontal
Editar -> Avanzado -> Selección de formato
Espera unos segundos y listo.
Es Ctrl+ Z'capaz en caso de que algo salga mal.
Tomando elementos de todas las respuestas ya dadas, aquí está el código con el que terminé. (Principalmente escribo código C ++, pero es fácil verificar si hay diferentes extensiones de archivo, según sea necesario).
¡Gracias a todos los que contribuyeron!
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
Puede usar una macro como se describe en Eliminar espacios en blanco y reescribir comentarios, usando búsquedas de expresiones regulares
Estoy usando VWD 2010 Express donde las macros no son compatibles, desafortunadamente. Así que simplemente copiar / pegar en Notepad ++ menú superior izquierda Edit
> Blank Operations
> Trim Trailing Space
hay otras operaciones disponibles también. Luego copie / pegue nuevamente en Visual Studio.
También se puede usar NetBeans en lugar de Notepad ++, que tiene "Eliminar espacios finales" en el menú "Fuente".
A menos que este sea un proyecto de una sola persona, no lo haga. Debe ser trivial diferenciar sus archivos locales contra su repositorio de código fuente, y borrar espacios en blanco cambiaría las líneas que no necesita cambiar. Entiendo perfectamente; Me encanta que mi espacio en blanco sea todo uniforme, pero esto es algo a lo que debes renunciar por una colaboración más limpia.
Creo que la versión de Jeff Muir podría mejorarse un poco si solo recorta los archivos de código fuente (en mi caso C #, pero es fácil agregar más extensiones). También agregué una verificación para asegurarme de que la ventana del documento sea visible porque algunas situaciones sin esa verificación me muestran errores extraños (LINQ to SQL files '* .dbml', por ejemplo).
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, me encanta la extensión Trailing Whitespace Visualizer Visual Studio que tiene soporte hasta Visual Studio 2012.
Creo que tengo una versión de esta macro que no bloqueará VS2010 en el refactorizador, y tampoco bloqueará el IDE al guardar archivos que no sean de texto. Prueba esto:
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
Utilizo ArtisticStyle (C ++) para hacer esto y también reformateo mi código. Sin embargo, tuve que agregar esto como una herramienta externa y debes activarlo tú mismo para que no te guste.
Sin embargo, me parece excelente poder reformatear el código de manera más personalizada (por ejemplo, parámetros de función multilínea) que puedo pagar el precio de ejecutarlo manualmente. La herramienta es gratis.
Basándose en la respuesta de Dyaus y una expresión regular de un informe de conexión , aquí hay una macro que maneja guardar todo, no reemplaza las pestañas con espacios y no requiere una variable estática. ¿Su posible inconveniente? Parece un poco lento, quizás debido a múltiples llamadas 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
Para cualquier otra persona que intente usar esto en un complemento de Visual Studio 2012, la expresión regular que terminé usando es [ \t]+(?=\r?$)
(no olvide escapar de las barras diagonales inversas si es necesario). Llegué aquí después de varios intentos inútiles de solucionar los problemas con una conversión cruda de {:b}+$
no coincidir con el retorno del carro.
Este es un muy buen ejemplo de cómo eliminar los espacios en blanco finales. Hay algunas cosas que cambiaría en función de lo que descubrí usando esta macro. En primer lugar, la macro convierte automáticamente las pestañas en espacios. Esto no siempre es deseable y podría empeorar las cosas para las personas que aman las pestañas (generalmente basadas en Linux). El problema de tabulación no es realmente el mismo que el problema de espacio en blanco adicional de todos modos. En segundo lugar, la macro supone que solo se está guardando un archivo a la vez. Si guarda varios archivos a la vez, no eliminará correctamente el espacio en blanco. El motivo es simple. El documento actual se considera el documento que puede ver. En tercer lugar, no hace ningún error al comprobar los resultados de búsqueda. Estos resultados pueden dar una mejor inteligencia sobre qué hacer a continuación. Por ejemplo, si no se encuentra ningún espacio en blanco y se reemplaza, no hay necesidad de guardar el archivo nuevamente. En general, no me gustó la necesidad de guardar o no la bandera global. Tiende a pedir problemas basados en estados desconocidos. Sospecho que la bandera se ha agregado únicamente para evitar un bucle 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
Agregué cuadros de mensaje de depuración para ayudar a ver lo que estaba sucediendo. Dejó muy claro que guardar varios archivos no funcionaba. Si quieres jugar con ellos, descomenta esas líneas.
La diferencia clave es usar document.Activate () para forzar el documento en el documento actual activo en primer plano. Si el resultado es 4, eso significa que el texto fue reemplazado. Cero significa que no pasó nada. Verá dos guardados para cada archivo. El primero reemplazará y el segundo no hará nada. Potencialmente podría haber problemas si el guardado no puede escribir el archivo, pero es de esperar que este evento no se llame si eso sucede.
Antes del guión original, no sabía cómo funcionaban los guiones en Visual Studio. Es un poco sorprendente que use Visual Basic como interfaz principal, pero funciona bien para lo que necesita hacer.
Una adición simple es eliminar los retornos de carro durante el guardado.
' Remove all the carriage returns.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
"\x000d\x000a", _
vsFindOptions.vsFindOptionsRegularExpression, _
"\x000a", _
vsFindTarget.vsFindTargetCurrentDocument, , , _
vsFindResultsLocation.vsFindResultsNone)
La clave de este trabajo es cambiar \ x000d \ x000a a \ x000a. El prefijo \ x indica un patrón Unicode. Esto automatizará el proceso de preparación de archivos fuente para sistemas Linux.