Cambiar dinámicamente la forma y el color del cursor en la terminal.
por Lógico (@logico_ar)17.2.2019
Por medio de códigos de escape ANSI vamos a mejorar los indicios visuales de los diferentes modos de nuestra terminal.
En el post de Cómo entrar y usar el modo Vi en Zsh vimos un modo distinto de operación que puede tomar la terminal (vi-mode
). Si leíste el artículo e ingresaste al modo VI, habrás notado que el indicador por defecto deja un poco que desear, es sólo un espartano <<<
al final del prompt. Pasa algo similar en VIm (y según el colorscheme) puede ser que no se note la diferencia entre un modo y otro.
Entonces ¿qué podemos hacer?. La respuesta más fácil es instalar nuestro tema para Zsh, pero si no te gusta o querés crear tu propio theme vamos a aprender a utilizar los códigos de escape para manipular la terminal a voluntad.
Terminal escape sequences.
Los códigos de escape ANSI son básicamente comandos que se le envían directamente a la terminal para que sean interpretados por ella y ejecute una acción. Estas secuencias varían según la librería en la cual está basada la terminal. En este artículo vamos a utilizar las secuencias compatibles con VTE que funcionan para:
- iTerm2
- GNOME Terminal
- guake
- Konsole
- macOS Terminal
- mrxvt
- URxvt / rxvt
- Terminator
- Tilda
- Xfce Terminal
- Terminology
- xterm
- Yakuake
Ahora vamos a la parte práctica, si por ejemplo ejecutamos lo siguiente (importante la opción -ne
) en una terminal:
echo -ne "\e[1 q"
Veremos que en vez de imprimir en pantalla la cadena de caracteres (comportamiento normal de echo
), la terminal mágicamente cambió el cursor a un bloque. Esto indica que el comando fue correctamente interpretado. Si en cambio queremos cambiarlo a una barra vertical ingresamos:
echo -ne "\e[5 q"
Ahí comenzamos a ver la potencialidad de los códigos de escapes. A lo que nos lleva a la posibilidad de cambiar el color, en nuestro caso, el cursor.
echo -ne "\e]12;red\x7"
El cursor ahora cambió a color rojo. Podemos modificar el color a cualquiera de nuestro gusto modificando la cadena red por el número de color X11, el nombre o el código hexadecimal (ej #FF00FF
).
Las secuencias de escape pueden combinarse para ejecutarse varias a la vez, si quisieramos cambiar el cursor a barra vertical y de color verde tendriamos que ingresar:
echo -ne "\e]12;green\x7;\e[5 q"
Cambiar el cursor en vi mode de Zsh.
Ahora ya podemos darle un uso práctico a la aprendido. Así que manos a la obra y veamos como cambiar el cursor cuando entramos en el vi-mode en Zsh. Agregamos la siguiente funcion en ~/.zshrc
function zle-line-init zle-keymap-select {
if [ $KEYMAP = vicmd ]; then
echo -ne "\033]12;deepskyblue\x7\e[1 q"
else
# the insert mode for vi
echo -ne "\033]12;199\x7\e[5 q"
fi
zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select
Reiniciamos la terminal y ya estaria listo.
Cambiar el color del cursor (y la forma) en VIM.
Para modificar el cursor en VIM según el modo (NORMAL
| INSERT
| REPLACE
) agregamos lo siguiente a nuestro ~/.vimrc
let &t_SR = "\033]12;199\x7\e[3 q"
let &t_SI = "\033]12;199\x7\e[5 q"
let &t_EI = "\033]12;deepskyblue\x7\e[1 q"
augroup myCmds
au!
autocmd VimEnter * silent !echo -ne "\033]12;deepskyblue\x7\e[1 q"
augroup END