Es bastante común al programar o abrir archivos de texto para encontrar archivos con espacios en blanco al final de una línea. vim tiene una manera de mostrar esto configurando la trail
opción en la listchars
opción y luego activando list
.
Sin embargo, ¿cuál es la forma más fácil de eliminar ese espacio en blanco final a nivel mundial en todo el archivo (idealmente sin un complemento)?
whitespace
line-breaks
Andrew Ferrier
fuente
fuente
:h vim-faq
y buscar/trailing
. La etiqueta difícil de memorizar es:h faq-12.1
.Respuestas:
Use una combinación de teclas para eliminar todos los espacios en blanco finales
Dado que algunas páginas que edito realmente necesitan espacios en blanco al final (por ejemplo, markdown) y otras no, configuré una combinación de teclas para F5que sea trivial hacerlo sin ser automático. Para hacerlo, agregue el siguiente código (de vim.wikia) o alguna variación del mismo a su
.vimrc
:nnoremap <F5>
realiza una asignación no recursiva a la teclaF5
en modo normal:let _s=@/
almacena el último término de búsqueda (de la macro@/
) en la variable_s
<Bar>
Funciona como un símbolo de tubería|
para separar comandos, sin embargo|
, terminaría un comando en este contexto, por lo que<Bar>
debe usarse en su lugar.:%s/\s\+$//e
busca espacios en blanco finales y los elimina en todas partes en el búfer (consulte la respuesta de CarpetSmoker para obtener un desglose detallado de esta expresión)let @/=_s
restaura su último término de búsqueda a la macro@/
, para que esté disponible la próxima vez que presionen
.<CR>
termina el mapeo... o ser más selectivo
Si tiene casos en los que no desea eliminar todo el espacio en blanco al final, puede usar un patrón para ser más selectivo. Por ejemplo, el siguiente código muestra cómo elimino los espacios en blanco finales solo si viene después de un punto y coma (aquí está vinculado a F8).
Esto es útil si, como yo, tiene algunos archivos con heredocs con marcas reducidas intercalados entre sentencias de programación terminadas en punto y coma.
fuente
:keeppatterns
evitar anular@/
. Y también eche un vistazo:keepjumps
.:help keeppattern
y no obtuve nada.:nohl
tampoco, si resalta algo, seguirá resaltando. (ver mi respuesta actualizada).La forma "más simple" es simplemente usar
:substitute
::%s
ejecutar:substitute
sobre el rango%
, que es todo el búfer.\s
t coincide con todos los espacios en blanco.\+
repetirlos 1 o más veces.$
para anclar al final de la línea.e
marca para no dar un error si no hay coincidencia (es decir, el archivo ya no tiene espacios en blanco al final).Sin embargo, esta probablemente no sea la "mejor" forma ya que causa dos efectos secundarios:
Puede arreglar ambos elementos convirtiéndolo en una función:
Y luego úsalo como:
winsaveview()
guardará la "vista" actual, que incluye la posición del cursor, pliegues, saltos, etc. Alwinrestview()
final, se restaurará esto desde la variable guardada.:keeppatterns
evita que el\s\+$
patrón se agregue al historial de búsqueda.Dado que esto es algo molesto de escribir
:call
todo el tiempo, puede definir un comando:Que se puede usar sin
:call
:Y, por supuesto, puede vincularlo a una clave:
A algunas personas les gusta hacer esto automáticamente antes de escribir un archivo en el disco, así:
No me gusta, ya que algunos formatos requieren espacios en blanco finales (como Markdown), y en otras ocasiones incluso desea espacios en blanco finales en su código (como formatear un correo electrónico y usar el
--<Space>
marcador para indicar el inicio de una firma )Modo de enchufe descarado: hace un tiempo escribí un pequeño script de Python para limpiar los espacios en blanco de un proyecto completo a la vez.
fuente
`
dos veces después de que termine el reemplazo. Esto abre la posibilidad de crear una línea como esta:%s/\s\+$//e | exe "normal ``"
Para eliminar todos los espacios en blanco finales (al final de cada línea), puede usar el comando:
Para incluir pestañas, use en
\s
lugar de espacio.Desde la línea de comandos:
Todos los archivos en el directorio actual (uso recursivo
**/*.*
):Forma de Python:
o:
Úselo
lstrip()
para la tira izquierda (posterior),rstrip()
para la tira derecha (delantera) ostrip()
para quitar de ambos extremos.Aquí hay una función útil que elimina el espacio en blanco superfluo del final de una línea que puede agregar a su
.vimrc
:También hay un complemento DeleteTrailingWhitespace para eso.
Destacando espacios en blanco
Para verificar si todos los espacios finales se han ido, use:
Escribe
/ $
para encontrarlos. Si hay algunos, vim los destacaría por usted.Usa colores para resaltarlos:
Usar caracteres visibles ( fuente ):
Ver también: resaltar espacios no deseados
Para resaltar los espacios en blanco finales de forma predeterminada, puede configurar su de la
.vimrc
siguiente manera:Eliminar espacios en blanco por defecto
Si desea asegurarse de que todos los espacios en blanco al final de un archivo se eliminen automáticamente al guardar, puede agregar el siguiente comando a su
.vimrc
:lo cual no se recomienda, ya que eliminará los espacios en blanco al final de cada archivo que guarde un usuario (incluso donde se pueda desear espacios en blanco).
Ver también:
fuente
Ampliando un poco la respuesta de Christopher Bottoms : Jonathan Palardy escribió un buen artículo sobre esto . En él, escribe una función,
Preserve(command)
que conserva el estado del editor (principalmente la posición del cursor y el último patrón de búsqueda) mientras ejecuta un comando arbitrario:Esto tiene la ventaja de ser multipropósito, por ejemplo, puede usarlo para reemplazar todos los espacios en blanco finales (como lo hace Jonathan) al asignar esto a:
También puede usarlo para un mapeo en modo visual para eliminar los espacios finales en las líneas visualmente seleccionadas:
Y puede usarlo para otras llamadas, como formatear todo el documento
=
mientras conserva su lugar (esta vez use una clave diferente para no entrar en conflicto):En general, he encontrado que la
Preserve(command)
función es una buena herramienta para tener.fuente
@/
, no debería ser necesario jugar con (en este caso, de todos modos).winsaveview()
ywinrestview()
son muy superioresOtra versión de la función StripTrailingSpaces:
REALMENTE HAY UN ERROR EN ESTA FUNCIÓN (esta): la posición no se mantiene debido a la opción de "rango". Si se elimina, funciona muy bien, sin embargo, estoy compartiendo el código para recibir ayuda.
Como puede ver, también utiliza la función Conservar vista anteriormente, pero de una manera ligeramente diferente.
La diferencia aquí es que puedo seleccionar un rango de líneas o un párrafo con
vip
y luego el rango:'<,'>
aparecerá automáticamente en el símbolo del sistema.La idea surgió del post de Bez Hermoso .
fuente