Table of Contents
Llevo en mac muchos años trabajando con la misma terminal: iTerm2. Es muy conocida por la comunidad macera y no es para menos, una terminal no es que tenga mucho trabajo que hacer pero lo poco que debe hacer, lo hace muy bien (tabs, integración con tmux, personalización.)
El problema viene cuando nos vamos a otro sistema operativo. Recientemente he tenido el placer (y no es irónico) de trabajar con el entorno Windows y su WSL2, y me he vuelto loco por encontrar algo parecido.
Lo primero que necesitaba era entender qué necesitaba realmente, que venía a ser el theme y los tabs. El tema de los themes es algo muy común en la mayoría de terminales y los tabs, en los modernos, también. Pero añadí un tercer elemento a la ecuación de lo que buscaba, y es que fuera cross platform, no tener que estar configurando N terminales para cada SO que tenga que usar a lo largo de mi carrera, ahí entra Alacritty.
Disclaimer: No hago un uso intensivo de la terminal, como developer paso más tiempo en IntelliJ.
Alacritty se vende como el más rápido dado que tira de OpenGL, y es cierto que he notado cierta velocidad a la hora de cargar, aunque puede ser placebo, no tengo queja de la velocidad de iTerm2. También es un terminal configurable mediante dotfile, un punto muy positivo dado que puedo incluirlo en mi colección de .dotfiles.
En este artículo vamos a ver una configuración simple pero muy funcional acerca de la terminal Alacritty en conjunto con ZSH y tmux.
Como hemos comentado previamente, Alacritty se configura mediante un dotfile que guardaremos en nuestro stow directory, por lo que crearemos toda la estructura de ficheros que luego linkaremos en nuestra $HOME con stow.
La ruta en la que nos basaremos nosotros para linkar la configuración será `$HOME/.config/alacritty/alacritty.yml`, aunque tienes más directorios en la documentación.
$ cd ~/.dotfiles
$ mkdir -p alacritty/.config/alacritty $ touch alacritty/.config/alacritty/alacritty.yml
Configurando Alacritty
Antes de configurar nada, Alacritty tiene ya unas configuraciones sensatas por defecto, entre ellas, la opción de que la configuración se refresca automáticamente sin tener que reiniciar la terminal.
Una vez creado el fichero de configuración, empezaremos a completarlo, comenzaremos por la sección de la ventana, donde definiremos una mínima opacidad, que se ejecute en modo ventana (no fullscreen) y con un padding para crear distancia entre el texto y el borde del terminal:
window:
opacity: 0.965
startup_mode: Windowed
padding:
x: 8
y: 8
El siguiente step es el histórico de comandos que guarda la terminal como caché:
scrolling:
history: 100000
multiplier: 3
En History le indicaremos el número de líneas a guardar en el buffer y multiplier es el número de líneas que nos moveremos en cada tick del scroll.
Ahora nos toca configurar la shell que lanzaremos cuando Alacritty se abra con el siguiente snippet:
shell:
program: /bin/zsh
args:
- --login
El argumento login es para que la shell lea las configuraciones dentro de la home del usuario, si no se indica, no llegará a leer el fichero ~/.zshrc.
Como último, Alacritty te permite configurar también key bindings para que realicen acciones, os dejo aquí los míos (por el momento):
key_bindings:
- { key: H, mods: Command, action: Hide }
- { key: Q, mods: Command, action: Quit }
- { key: V, mods: Command, action: Paste }
- { key: C, mods: Command, action: Copy }
- { key: Key0, mods: Command, action: ResetFontSize }
- { key: Equals, mods: Command, action: IncreaseFontSize }
- { key: Minus, mods: Command, action: DecreaseFontSize }
Aquí no creo que haga falta explicar nada ya que de normal son comunes a muchas aplicaciones, a parte que la acción define muy bien lo que hace sin lugar a dudas.
Hay unos apartados dentro de la configuración donde le indicas la font-family a utilizar, tamaños y colores, al ser algo muy personal no voy a dedicarle una sección, abajo del todo tendréis un link a mi configuración por si interesa pero es bastante self explanatory.
El complemento perfecto
Si tengo que sacarle una pega a Alacritty es la falta de gestión de tabs y paneles de manera nativa, es por ello que tenemos que tirar de herramientas externas como tmux. En este artículo no vamos a definir que es tmux dado que ya hablamos de él hace 5 años en otro artículo y no ha cambiado mucho desde entonces, sigue haciendo su función de una manera excelente.
Tmux también basa su configuración en un dotfile linkado en $HOME/.tmux.conf
A continuación os dejo mi configuración respecto a los keybindings que uso diariamente (a tener en cuenta es que mi prefijo es C-a [Control + A])
# create new window and pane
bind c new-window -c "#{pane_current_path}"
bind-key h split-window -v -c '#{pane_current_path}'
bind-key v split-window -h -c '#{pane_current_path}'
# close window and pane without confirmation
bind-key C-w kill-pane
bind-key & kill-window
# utils
bind-key b break-pane -d
bind-key C-j choose-tree
Mi día a día consiste en abrir tabs, ya sean verticales (C-a v) o horizontal (C-a h), realizar ciertas acciones, y cerrarlas (C-a w). Si veo que la tab pilla muy valor y me interesa darle más prioridad, lo saco a su propia window (C-a b). Cuando termino de usar el window, lo cierro (C-a &). Si la cosa se complica, lanzó el árbol de windows/tabs que tengo en la sesión actual (C-a C-j) y las cierro directamente desde el árbol.
Solo queda una combinación más que no suelo usar mucho, pero siempre está bien tenerla:
# reload tmux C-a + r
bind-key r source-file ~/.tmux.conf \; display-message "~/.tmux.conf reloaded"
Con ello, pulsando [C-a r] recargamos la configuración de tmux, evitando tener que cerrar sesión y volver a abrir.
Alacritty
Hasta ahora, hemos configurado Alacritty por un lado y tmux por el otro, poca relación han tenido, lejos que uno llama al otro. Ahora entramos en una parte que le he visto mucho valor, sobretodo a la hora de conectar con tmux, ya que es una herramienta tan potente y tan versátil, que la gente suele tenerle mucho respeto, y es la creación de bindings de Alacritty que lancen comandos de tmux.
A continuación dejo la lista de keybindings completa:
key_bindings:
- { key: H, mods: Command, action: Hide }
- { key: Q, mods: Command, action: Quit }
- { key: V, mods: Command, action: Paste }
- { key: C, mods: Command, action: Copy }
- { key: Key0, mods: Command, action: ResetFontSize }
- { key: Equals, mods: Command, action: IncreaseFontSize }
- { key: Minus, mods: Command, action: DecreaseFontSize }
- { key: T, mods: Command, chars: "\x01\x63" } # new window
- { key: W, mods: Command|Shift, chars: "\x01\x77" } # close window
- { key: V, mods: Shift, chars: "\x01\x76" } # new pane (vertical)
- { key: H, mods: Shift, chars: "\x01\x68" } # new pane (horizontal)
- { key: W, mods: Shift, chars: "\x01\x77" } # close pane
- { key: B, mods: Shift, chars: "\x01\x62" } # make window from pane
# move to window 1, 2, 3 with command+n
- { key: Key1, mods: Command, chars: "\x01\x31" }
- { key: Key2, mods: Command, chars: "\x01\x32" }
- { key: Key3, mods: Command, chars: "\x01\x33" }
- { key: Key4, mods: Command, chars: "\x01\x34" }
- { key: Key5, mods: Command, chars: "\x01\x35" }
- { key: Key6, mods: Command, chars: "\x01\x36" }
- { key: Key7, mods: Command, chars: "\x01\x37" }
- { key: Key8, mods: Command, chars: "\x01\x38" }
- { key: Key9, mods: Command, chars: "\x01\x39" }
Los chars a enviar cuando pulsemos la combinación de teclas elegida se pueden sacar con muchas herramientas, personalmente he usado “xxd”, junto con los parámetros -xs se inicia esperando un input, es ahí donde pulsando la combinación de teclas que tenemos configurados en tmux, sacaremos su valor hexadecimal para configurar en Alacritty, por ejemplo:
Aquí podemos ver en la primera línea que hemos pulsado “C-a+c + enter”, que es el comando que lanzaremos en tmux para crear una nueva ventana. El resultado desglosado vendría a ser:
01 C-a 63 c 0a enter
En este caso, la creación de una nueva windows la hemos configurado cuando pulsamos CMD + t (no hace falta añadir el enter en hexadecimal al comando).
- { key: T, mods: Command, chars: "\x01\x63" } # new window
Author
-
Software developer with over 16 years experience working as Fullstack Developer & Backend Developer.
Ver todas las entradas