Pregunta cómo hacer visualbell de vim solo muestra las líneas superior e inferior?


Estado usando Vim durante años y todo este tiempo acabo de aceptar cómo bright and distracting the visual bell estaba. Recientemente alguien me mostró el Emacs visual bell, que solo parpadea en las líneas superior e inferior de la pantalla. ¿Alguien sabe cómo reproducir este comportamiento en Vim?

Y si no es configurable actualmente, ¿alguien sabe lo difícil que sería instalarlo? tengo algunos C experiencia pero no familiaridad con el codebase.


32
2017-12-16 08:34


origen


Respuestas:


Vim y versiones

El gran problema con tu pregunta es que esta pregunta depende de la versión vim. En la versión de vim no me refiero a la versión (7.3 ...), sino mucho más si está usando MacVim, gVim, la edición del terminal, etc. La versión es importante, porque el param t_vb (tipo :set t_vb? obtenerlo) es diferente para las diferentes versiones de vim, pero escribo sobre eso más tarde.

Estoy usando Ubuntu. En mi terminal ni siquiera puedo producir esos flashes visuales (probablemente Ubuntu simplemente los ignora, al menos eso es lo que pasó con la campana normal: ¡Este programa suena la campana!) gVim es diferente, la campana visual está funcionando allí. Lo mismo está sucediendo con Emacs. La campana visual (líneas superior e inferior, como usted describió) está funcionando perfectamente bien en la versión X. La versión de la terminal es simplemente silenciosa.

Configuración t_vb

Como algunos han sospechado, el parámetro t_vb es responsable de la campana visual en vim. Pero se ve diferente en la terminal:

t_vb=^[[?5h$<100/>^[[?5l

y gVim:

t_vb=^[|f

Entonces creo que sería diferente para MacVim también.

Por cierto: si está modificando la campana, debe generar el ^[ con <C-V> seguido por <ESC>. No copie las cadenas de arriba, no funcionarán.

t_vb es simplemente una cadena que se envía a la terminal (o gvim). También podría definir t_vb = abcd, que mostraría abcd temporalmente en su cursor. Esto es solo mostrar magia, los flashes ocurren debido a los caracteres de escape. No hay forma de comunicarse con vim. Sin embargo, puede modificar toda la pantalla vim (eliminar líneas, agregar líneas, etc.). Pero si la pantalla se vuelve a dibujar, todo desaparecerá. El principal problema con esta tarea es que las secuencias de escape no tienen una secuencia de suspensión. Podría tratar de insertar una línea con color blanco y eliminarla, pero esto es solo una forma de ayunar (lo intenté).

El comportamiento descrito es solo el caso de gVim. Pero creo que el resto probablemente se comporte de manera similar. Sin embargo, si su terminal / pseudo terminal admite una secuencia de escape que resalta solo un número definido de líneas, podrá hacer lo que desee.

Podría decepcionarte, pero no creo que haya una manera de obtener el comportamiento que deseas, sin modificar la fuente vim (o modificar un software de terminal, que definitivamente no recomendaría).

Modificación del código fuente original

Si desea editar el comportamiento de la campana visual como lo desee, siempre puede editar los archivos C. No lo recomendaría, pero definitivamente no es imposible. Puedes comenzar aquí:

http://code.google.com/p/vim/source/browse/src/misc1.c#3433

Eliminar "out_str (T_VB);" e inserte algo como esto (pseudo código):

invert(fist_line)
invert(last_line)
sleep(100 ms)
invert(fist_line)
invert(last_line)

El sueño puede ser molesto. Pero esta es la forma más fácil (sin temporizadores, etc.). El problema sería encontrar tal función de inversión. Intento buscar un comando que ejecute vim-script y luego intente encontrar un comando vim coincidente. Apuesto que eso sería posible.


3
2018-03-25 21:50