open source

Cambiar dinámicamente la forma y el color del cursor en la terminal.

por Lógico (@logico_ar)

PUBLICADO 10:30 AM
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

Comentarios desactivados en la versión móvil.