Estoy ejecutando Ubuntu 14.04 y usando uno de los terminales virtuales (TTY[1-6], accesible mediante Ctrl-Alt-F[1-6]); Quiero cambiar permanentemente la apariencia de mi cursor del aparente valor predeterminado, un subrayado parpadeante, a un cuadro parpadeante. Puedo cambiarlo temporalmente, pero se restablece constantemente cuando se ejecutan determinadas aplicaciones.
Inicialmente, el estilo del cursor en las sesiones TTY era un subrayado parpadeante. Descubrí que podía cambiarlo a un cuadro parpadeante con el comando:
printf '\e[?8c'
Esto cambia el cursor en la terminal y se refleja en programas como emacs o elinks. Entonces coloqué el comando anterior en mi .bashrc.
Sin embargo, algunas aplicaciones parecen revertir el estilo del cursor a un subrayado parpadeante, y esto persiste incluso después de salir de esas aplicaciones. Puedo restablecer el estilo del cursor a un cuadro parpadeante volviendo a emitir el comando anterior, obteniendo .bashrc o cerrando sesión y volviendo a iniciarla.
Por ejemplo, considere cómo las siguientes 3 aplicaciones (tmux, emacs, elinks) afectan el estilo del cursor:
- tmux:el estilo del cursor se establece inmediatamente en un subrayado parpadeante, este estilo se mantiene en todas las aplicaciones que se ejecutan dentro de tmux y el cambio persiste después de salir de tmux. El comando printf anterior no tiene ningún efecto en tmux.
- emacs:el estilo del cursor es el estilo que estaba activo cuando lo ejecuté, y luego el estilo cambia a un subrayado parpadeante al salir de emacs.
- enlaces:el estilo del cursor es el estilo que estaba activo cuando lo ejecuté, y el estilo del cursor NO cambia al salir de elinks.
Debo tener en cuenta que tengo configuraciones de emacs para establecer el estilo del cursor (dentro de emacs) en un cuadro, y que mientras busqué una configuración para establecer el estilo del cursor dentro de tmux no pude encontrar nada más allá de una entrada en la página de manual de tmux, que estados:
tmux understands some extensions to terminfo(5):
[...]
Cs, Csr
Change the cursor style. If set, a sequence such as this may be used to change the cursor to an underline:
$ printf '\033[4 q'
If Csr is set, it will be used to reset the cursor style instead of Cs.
Desafortunadamente, no entiendo cómo "configurar C" y, como se mencionó anteriormente, intenté ejecutar el comando printf para configurar el estilo del cursor dentro de tmux sin éxito.
Otra nota interesante es que el problema con el cambio de estilo del cursor no ocurre cuando se ejecuta un emulador de terminal X, como XFCE4 Terminal. Esto sólo parece ocurrir en los TTY.
Parece que no puedo encontrar ninguna información sobre otras personas que hayan tenido este problema o configuraciones dentro de las aplicaciones mencionadas que podrían estar causando el problema. ¿Qué está causando este problema y cómo puedo resolverlo para que siempre tenga un estilo de cursor de bloque parpadeante?
Respuesta1
Las funciones del terminal no están disponibles con todos los terminales y pueden diferir según las versiones de tmux. Veo la descripción citada en tmux 1.6 en Debian 7. Ubuntu 14.04 es un poco antiguo y tiene tmux 1.8 (misma descripción).
El ejemplo dado en la página del manual se parece a DECSCUSR
, que se admite al xterm
comenzar conparche #252en 2009. ConsulteSecuencias de control XTerm:
CSI Ps SP q
Set cursor style (DECSCUSR, VT520).
Ps = 0 -> blinking block.
Ps = 1 -> blinking block (default).
Ps = 2 -> steady block.
Ps = 3 -> blinking underline.
Ps = 4 -> steady underline.
Ps = 5 -> blinking bar (xterm).
Ps = 6 -> steady bar (xterm).
Para usarlos, haría una entrada terminfo modificada usando el tic de ncurses, por ejemplo,
infocmp -x >foo
vi foo
tic -x foo
agregando esta línea (con una pestaña inicial, como las otras capacidades):
Cs=\E[%p\sq, Csr=\E[0\sq,
Sin embargo, al verificar la fuente de tmux 2.1, ya no lee esas funciones de terminfo y se ha modificado para usar Cs
y Cr
configurar el color (realizado en versiones anteriores usando Cc
y Cr
). La versión más nueva tiene una lógica incorporada para reconocer DECSCUSR
sin una extensión terminfo.
Los terminales basados en VTE (como el terminal XFCE) pueden (según la versión) implementar DECSCUSR
, pero es poco probable que la consola Linux lo haga, ya que implementa solo un subconjunto del VT220 mientras DECSCUSR
es desde un VT520
terminal (un superconjunto de VT220).
Verá diferencias con otras aplicaciones como emacs porque DECSCUSR
se superpone con otras funciones de estilo de cursor, como la función de cursor parpadeante, configurada o restablecida con las capacidades cvvis
y cnorm
de terminfo para xterm
:
CSI ? Pm h
DEC Private Mode Set (DECSET).
Ps = 1 2 -> Start Blinking Cursor (att610).
Sin embargo, parece que desea modificar la apariencia del cursor en la consola de Linux (también llamada consola virtual). DECSCUSR
allí no tiene ningún efecto.
Para hacer que su cursor sea un bloque parpadeantetodoEn este momento, tendría que cambiar las capacidades de apariencia del cursor en las descripciones del terminal que está utilizando. Esos son civis
(hacer que el cursor sea invisible), cnorm
(hacer que el cursor tenga una apariencia "normal") y cvvis
(hacer que el cursor sea muy visible):
- Hacer ambos
\e[?8c
en la entrada "linux" le indicaría a los programas como emacs que usan esa entrada que usen el cursor de cuadro parpadeante. - tmux también lee la entrada del terminal, mirando
cnorm
ycivis
. - elinks, por otro lado, está codificado, ignorando la base de datos del terminal. En una lectura rápida de su fuente, no veo ninguna secuencia de escape que reinicie el terminal o modifique la apariencia del cursor.
Dado que está utilizando tmux
, es posible que también tenga que modificar xterm
(para que las aplicaciones que se ejecutan dentro tmux
usen ese estilo de cursor). Pero prueba sin esto primero: sidebe, probablemente puedas combinarlo \e[?8c
con la cadena existente cnorm
, ya que xterm
lo ignora \e[?8c
.