Tiempo estimado de lectura: 3 minutos.
Una terminal es una app muy sencilla, solo recibe una entrada y devuelve una salida del shell, pero no, no es sencilla.
Uso la terminal todo el tiempo, mas que nada la abro en fullscreen y ejecuto un Tmux que se guarda automáticamente. Para eso uso la terminal de Ubuntu, GNOME Terminal. Todo venía bien hasta que tuve ganas de usar fuentes con ligaduras, como por ejemplo la fuente FiraCode.
Me propuse buscar alguna alternativa:
- Alacritty: no tiene la soporte para ligaduras.
- iTerm2 y Warp: solo soportan Mac.
- kitty: no soporta bien Tmux.
- GNOME Console: una alternativa light a gnome-terminal, tampoco tiene la soporte para ligaduras.
- QTerminal: es una terminal de escritorio basado en Qt, ¡tiene la soporte para ligaduras! Pero no puedo pasarle un comando y que se mantenga abierto.
Ya que no estoy interesado en que tenga tabs, ni configuración ni nada raro me propuse a hacer una. ¿Qué tan difícil puede ser? Bueno por empezar, hay que parsear el input. Fácil. Excepto que el input no es sólo texto, sino cualquier tecla que apretas. Luego hay llamás al shell. No momento, al custom shell que tiene el usuario. Bien, esta en la variable SHELL del environment.
Ahora si, ejecutamos y tomamos el output y listo. No, hay que parsear los colores. Pero podríamos usar una librería como VTE (Virtual Terminal Emulator). Ah no, no soporta ligaduras. Entonces hay que parsear algo como \e[33;1m
y convertirlo en color de la letra o del fondo, o si es negrita o si esta subrayado. Todo eso hay que parsearlo a mano. Ah y eso no es suficiente, en realidad hay que hacer un master de pseudoterminal que se comunicará con un slave, esto lo podés hacer con PTY. Ah ¿y el scroll? ¿y el historial? Conclusión, no, no es para nada sencillo hacer una terminal. Tal vez algún otro día.
La Ilustración es de Katerina Limpitsouni publicada en unDraw.