Mostrar espacios finales en vim

10

Me gustaría tener una agradable y dulce exhibición de espacios en blanco al final de mi terminal vim. Esto me permitiría eliminarlos antes de cerrar el archivo.

Soy consciente de que esta pregunta es bastante popular y ya encontré docenas de respuestas en SO. Lamentablemente no encontré uno satisfactorio todavía ...

Por lo tanto, intentaré resumir la información recopilada y las soluciones que encontré.

Solución 1: resaltar manualmente los espacios finales

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

Destacar espacios en blanco al final

Pros:

  • Fácil de usar
  • Rápido
  • Compatible con cursorline

Contras:

  • El color elegido no es compatible con otros esquemas de color porque el color se configura manualmente en red
  • Los grandes bloques de fondo rojo no son muy estéticos.

Solución 2: uso de la función de lista

set list
set listchars+=trail:◦

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Pros:

  • Fácil de usar
  • Rápido

Contras:

  • Problema si está :set cursorlinehabilitado
  • El color dedicado para list/trailno es configurable. Tiene que ser igual a los otros listchars

Solución 3: uso de la función de ocultación

syn match WhiteSpace "\s\+$" containedin=ALL conceal cchar=◦
set conceallevel=2 
set concealcursor=nv
highlight Conceal ctermfg=red

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Pros:

  • Más bonita que la primera solución.

Contras:

  • El fondo no es lo mismo que el fondo de la línea del cursor
  • Puede interferir con otras reglas de ocultación
  • El color elegido no siempre es compatible con el esquema de color.
  • No es compatible con la versión anterior de Vim

Mi pregunta

¿Cuál de las soluciones enumeradas es la más adecuada en términos de rendimiento y compatibilidad y cómo puedo obtener todas las ventajas y desventajas?

En otros términos, me gustaría encontrar una solución donde:

  • El color final resaltado concuerda con el esquema de colores elegido.
  • Este color es claramente visible pero no demasiado agresivo para los ojos.
  • Compatible con cursorline(fondo y primer plano) `
  • Compatible con otros complementos que pueden usar ocultar
  • El carácter final se puede establecer en cualquier carácter Unicode
nowox
fuente
Si no te gusta el rojo, elige un color diferente. Si desea que el color sea compatible con diferentes esquemas de color, a continuación, vincular a un nombre de grupo de color en lugar de utilizar un color particular, por ejemplo, :hi link ExtraWhitespace CursorLine. Ver :help hi-link.
garyjohn

Respuestas:

4

En términos de rendimiento, ninguno de estos debería marcar la diferencia. Vim se atasca principalmente por patrones de sintaxis complejos; El patrón aquí es bastante simple.

Para que el color de resaltado concuerde con el esquema de colores elegido, use :hi linkpara un grupo existente; por lo general, eso sería Error. Por supuesto, todo esto solo importa si cambia los esquemas de colores (bastante diferentes) con frecuencia; de lo contrario, usar colores adecuados directamente (como en su solución 1) también estaría bien.

Solución 1: resaltar manualmente los espacios finales

Iría por esto, pero usando en matchadd()lugar de :match; esto deja a este último para resaltado personalizado. Además, clearmatches()es demasiado grueso; elimina todas las coincidencias y, por lo tanto, puede afectar a los complementos. Puede usar / echar un vistazo a mi complemento ShowTrailingWhitespace para una implementación limpia y potente (que también incluye excepciones para ciertos tipos de archivos). Sí, es una solución mucho más grande, pero aún no he notado ningún impacto.

Solución 2: uso de la función de lista

Esta es una característica útil en sí misma, y ​​mantenerla permanentemente tiene efectos en la posición del cursor en los caracteres de Tabulación, por lo que no lo recomendaría.

Solución 3: uso de la función de ocultación

Eso seguramente interferirá con algunas sintaxis y complementos utilizando la función. Mala idea.

Ingo Karkat
fuente
Entonces, según su respuesta, entiendo que existe una solución que permite usar un carácter Unicode personalizado para marcar espacios adicionales. Esta pregunta es realmente más complicada de lo que inicialmente pensé.
nowox
Correcto, los caracteres personalizados solo funcionan con 'listchars'. Para mí, el resaltado es más que suficiente (especialmente con colores agresivos).
Ingo Karkat