kitty: imágenes en terminal a través de SSH
He estado investigando terminales con tiling (divisibles gráficamente en partes o tiles). Me he encontrado con kitty, y me ha llamado la atención la posibilidad de mostrar imágenes. Ya conocía esta característica en otras terminales, pero kitty puede hacerlo no sólo localmente, sino también a través de SSH. Para lograrlo define su propio protocolo, enviando los píxeles de la imagen mediante secuencias de escape.

Necesitamos kitty tanto en cliente como en servidor.
Al principio instalé mediante el paquete que proporciona mi distro, Fedora 31. No me funcionó por un bug, que reporté y ya está arreglado. Desafortunadamente, esto significa que hasta la próxima release tendremos que compilarlo.
Para que kitty funcione correctamente a través de SSH, necesitamos ejecutar este comando.
kitty +kitten ssh <usuario_ssh>@<servidor_ssh>
En mi caso:
kitty +kitten ssh test@192.168.1.31
Esto es sólo necesario la primera vez. Después podemos hacer ssh a secas. +kitten ssh ejecuta un kitten. Los kittens son scripts para aumentar funcionalidad de kitty. Según la propia página:
Has a framework for Kittens, small terminal programs that can be used to extend kitty‘s functionality. For example, they are used for Unicode input, Hints and Side-by-side diff.
Este kitten ssh sube un termfile necesario para que funcionen todas las teclas y escape codes. Veremos que se ha creado un fichero ~/.terminfo/x/xterm-kitty
:
[j@localhost kitty]$ ssh test@192.168.1.31
test@192.168.1.31's password:
Last login: Sun Apr 19 12:42:33 2020 from 192.168.1.95
[test@localhost ~]$ ls -l ~/.terminfo/x/xterm-kitty
-rw-rw-r--. 1 test test 2197 Apr 18 21:05 /home/test/.terminfo/x/xterm-kitty
Este fichero define el tipo de terminal xterm-kitty. Debería aparecer en la variable de entorno $TERM:
[test@localhost ~]$ echo $TERM
xterm-kitty
Ahora podremos mostrar imágenes usando el kitten icat.
[test@localhost ~]$ kitty +kitten icat <imagen>
Recordemos que esto sólo funcionará si nuestra terminal local es kitty.
El mayor inconveniente de esta herramienta es que las imágenes se descolocan al redimensionar la ventana. Por ejemplo:

Compilación
Si no las tenemos, las herramientas de compilación básicas:
dnf groupinstall "Development Tools"
Después dependencias. En mi caso, Fedora 31, son éstas:
sudo dnf install harfbuzz-devel libXrandr-devel libXinerama-devel libXcursor-devel libxkbcommon-x11-devel dbus-devel python-devel libXi-devel wayland-protocols-devel wayland-devel libpng-devel fontconfig-devel mesa-libGL-devel
Después es lo normal:
git clone https://github.com/kovidgoyal/kitty && cd kitty
make
Y ejecutar finalmente con:
./kitty/launcher/kitty
Para evitarme poner toda la ruta al ejecutable podemos mover la carpeta a otro directorio adecuado (creo que lo mejor es /usr/local/lib64) y hacer un enlace simbólico:
sudo mv kitty/ /usr/local/lib64/
sudo ln -s /usr/local/lib64/kitty/kitty/launcher/kitty /usr/local/bin/kitty
Podemos añadir un launcher de GNOME en /usr/share/applications/kitty.desktop
[Desktop Entry]
Version=1.0
Type=Application
Name=kitty
GenericName=Terminal emulator
Comment=A fast, feature full, GPU based terminal emulator
TryExec=kitty
Exec=kitty
Icon=kitty
Categories=System;TerminalEmulator;
Si el servidor no tiene interfaz gráfica no podremos iniciar kitty tal cual porque necesita una ventana y OpenGL, pero sí podremos ejecutar kittens como el icat que hemos visto en este artículo