quitar - ¿Cómo eliminar automáticamente los espacios en blanco finales en Visual Studio 2008?
indentar codigo visual studio code (16)
A menos que este sea un proyecto de una persona, no lo hagas. Tiene que ser trivial diferir 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 uniforme, pero esto es algo que debe renunciar por el bien de una colaboración más limpia.
¿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 alguna extensión disponible para hacer esto?
Antes de guardar, es posible que pueda usar el atajo de formato automático CTRL + K + D.
CodeMaid es una extensión de Visual Studio muy popular y lo hace automáticamente junto con otras limpiezas útiles.
- Descargar: https://github.com/codecadwallader/codemaid/releases/tag/v0.4.3
- Descarga moderna: https://marketplace.visualstudio.com/items?itemName=SteveCadwallader.CodeMaid
- Documentación: http://www.codemaid.net/documentation/#cleaning
Lo configuré para limpiar un archivo en guardar, que creo que es el predeterminado.
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é un cheque para asegurar que la ventana del documento esté 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
Creo que tengo una versión de esta macro que no bloqueará VS2010 en refactor, y tampoco bloqueará el IDE cuando guarde 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
Encontrar / Reemplazar usando Expresiones Regulares
En el cuadro de diálogo Buscar y reemplazar, expanda Buscar opciones , marque Usar , elija expresiones regulares
Encuentra qué : " :Zs#$
"
Reemplazar con : ""
clic en Reemplazar todo
En otros editores (un analizador de expresiones regulares normal ) " :Zs#$
" sería " /s*$
".
Este es un muy buen ejemplo de cómo eliminar espacios en blanco al final. Hay algunas cosas que cambiaría según lo que descubrí usando esta macro. En primer lugar, la macro convierte automáticamente 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 las pestañas en realidad no es lo mismo que el problema del espacio en blanco adicional. En segundo lugar, la macro asume 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 comete errores al verificar los resultados de búsqueda. Estos resultados pueden proporcionar una mejor información sobre qué hacer a continuación. Por ejemplo, si no se encuentran espacios en blanco y se reemplazan, no es necesario guardar el archivo nuevamente. En general, no me gustó la necesidad de que se salvara o no la bandera global. Tiende a pedir problemas basados en estados desconocidos. Sospecho que la bandera se ha agregado únicamente para evitar un ciclo 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 mensajes de depuración para ayudar a ver qué estaba pasando. Dejó muy claro que el almacenamiento múltiple de archivos no funcionaba. Si quieres jugar con ellos, elimina el comentario de esas líneas.
La diferencia clave es usar document.Activate () para forzar el documento en el documento actual activo de primer plano. Si el resultado es 4, eso significa que el texto fue reemplazado. Cero significa que no pasó nada. Verá dos salvaciones por 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 de la secuencia de comandos original, no sabía cómo funcionaba la secuencia de comandos en Visual Studio. Es un poco sorprendente que utilice Visual Basic como interfaz principal, pero funciona perfectamente para lo que necesita hacer.
Estoy usando VWD 2010 Express donde las macros no son compatibles, desafortunadamente. Así que simplemente copio / pego en Notepad++ arriba a la izquierda menú Edit
> Blank Operations
> Trim Trailing Space
hay otras operaciones relacionadas disponibles también. Luego copie / pegue de nuevo en Visual Studio.
También se puede usar NetBeans lugar de Notepad ++, que tiene "Eliminar espacios finales" en el menú "Fuente".
Personalmente, me encanta la extensión Visiling Whitespace Visualizer Visual Studio que tiene soporte a través de Visual Studio 2012.
Puede crear una macro que se ejecute después de guardar para hacer esto por usted.
Agregue lo siguiente en el 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 desde hace un 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 usar una macro como se describe en Eliminar espacios en blanco y reescribir comentarios, usando búsquedas de expresiones regulares
Puedes hacerlo fácilmente con estas tres acciones:
Ctrl + A (selecciona 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.
Sobre la base de 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, tal vez 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 sin formato de {:b}+$
no coincidía con el retorno del carro.
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 las diferentes extensiones de archivos, 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
Una simple adición 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 para este trabajo está cambiando / x000d / x000a a / x000a. El prefijo / x indica un patrón Unicode. Esto automatizará el proceso de preparación de los archivos fuente para los sistemas Linux.
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 que pueda reformatear el código de una manera más personalizada (por ejemplo, los parámetros de funciones de líneas múltiples) que puedo pagar el precio de ejecutarlo manualmente. La herramienta es gratis.