tmux + terminator + awesome

index | OSiUX | blog | docs | charlas | links

porqué usar tmux?

Durante mucho tiempo que uso screen y me resulta muy útil, muchos desconocen que se pueden hacer split horizontal y vertical usando (CTRL-A + | y CTRL-A + -).

Luego de leer varios tutoriales para tmux llegué a dos conclusiones:

  1. es un reemplazo de screen (muchos sugieren mapear el CTRL-B por CTRL-A
  2. es para usar con monitores grandes!

Debido a esto es que tarde en implementarlo, screen parecía suficiente y tmux no me resultaba del todo atractivo.

tmux + terminator + awesome

Hasta que decidí probarlo y descubrí que podía adaptarlo a mi manera de trabajar. Habitualmente uso awesome 1 y terminator, me resultan muy cómodos, por un lado terminator permite realizar un split muy fácil, usando CTRL+SHIFT+E y CTRL+SHIFT+O. Por otro lado usando SUPER+1..9 me permite cambiar de workspace fácilmente, de esta manera venía trabajando con 1 terminal por workspace, esto resulta muy útil para mantener el foco en una única aplicación y no distraerse.

Ahora en cada terminal hay una sesion de tmux corriendo y cada sesion esta dividida en diferentes ventanas y en muy pocos casos además cada ventana en diferentes paneles. No me resulta cómodo usar varios paneles porque no puedo tener diferentes tamaños de fuente en cada panel (al menos yo no encontré cómo hacerlo) y esa funcioalidad la realizo con terminator, normalmente lo utilizo para ver logs locales o remotos relacionados a lo que estoy trabajando.

tmux-terminator-awesome.png

definiendo sesiones

Sin dudas, una de las mejores características de tmux es el poder definir la composisión de una sesión, la cantidad y tamaño de las ventanas y/o paneles.

Un ejemplo de cómo se puede definir una sesion mediante un script bash , por ejemplo ~/bin/tmuxosiux es el siguiente:

#!/bin/bash
cd ~
tmux new-session -d -s osiux -n 'mm' 'mutt -F ~/config/mutt/muttrc-imap-osiux-gin'
tmux new-window -t osiux:2 -n 'mx' 'mutt -F ~/config/mutt/muttrc-imap-xuiso-gin'
tmux a -t osiux

De esta manera se crea una sesion osiux con dos ventanas mm y mx, en la primera levanto un mutt con la cuenta osiux y en la otra ventana un mutt con la cuenta xuiso. Para simplificar su ejecución defini el alias tmx.

Entonces tengo asociada cada sesion de tmux a un workspace de awesome con el siguiente esquema:

ws alias comando
1 tmo tmuxosiris
2 tgca tmuxgca
3 tmx tmuxosiux
7 temacs tmuxemacs
8 tmoc tmuxmoc
9 tchat tmuxchat

Otros alias que uso bastante son:

alias tas='tmux a -s '
alias tls='tmux ls'   
alias tma='tmux a'    
alias tns='tmux new-session -d -s '

screen dentro de tmux

No cambié el default de CTRL+B de tmux como reemplazo de screen, esto permite que pueda ejecutar screen dentro de tmux e invocar los comandos de screen mediante CTRL+A y al mismo tiempo sin superponerse los comandos de tmux. Generalmente utilizo screen en servidores remotos para procesos que requieran una ejecución prolongada.

tmux-screen.png

local y remoto de la misma manera

La gran ventaja de usar tmux es poder mantener abiertos todos los programas con la configuración de ventanas y paneles tanto localmente como remotamente vía ssh, es decir, no necesito cerrar nada y al terminar el día, al volver a casa puedo conectarme por ssh al trabajo y esta todo donde lo dejé, continuar con algo que me olvidé o necesitaba mi atención, hacer un tmux detach o CTRL-B y quedarme que esta ahi corriendo en segundo plano y que puedo recuperar mediante un tmux attatch en cualquier momento y desde cualquier lugar.

tmux list-windows -a

chat:2: finch* (1 panes) [140x47] 
emacs:2: emacs!* (1 panes) [140x47] 
gca:2: vim* (1 panes) [140x47] 
gca:3: socks# (1 panes) [140x47] 
gca:4: ssh#- (1 panes) [140x47] 
gcoop:1: mg!* (1 panes) [140x47] 
gcoop:3: mo#!- (1 panes) [140x47] 
moc:2: mocp* (1 panes) [140x47] 
osiux:1: mm!* (1 panes) [140x47] 
osiux:2: mx#!- (1 panes) [140x47] 

Dado que la única aplicación que uso que no vive dentro de una terminal es Firefox, todo mi entorno se reduce a una terminal y tmux, ya sea local combinando con awesome como remotamente mediante ssh, y esto además de resultar muy cómodo es extremadamente productivo, pueden pasar 2 días y puedo volver en cualquier momento a un archivo abierto en una línea determinada de cualquier proyecto y remotamente!

tmux-terminator-ssh.png

Por tratarse de una conexión ssh que sólo envía texto plano, no requiero de ancho de banda, de ser necesario puedo recuperar la sesión desde un telefono espía con android

tmux-juice-ssh-android.png

tmux es un excelente monitor

También resulta muy útil utilizar tmux como herramienta de monitoreo, por ejemplo en malbec a veces es necesario monitorear las conexiones de red y como hay varias placas de red, mediante un script tmux es muy simple ver que esta sucediendo en cada interfaz de red al mismo tiempo:

#!/bin/bash
cd /
tmux ls | grep gorra >/dev/null 2>/dev/null 
OK=$(echo $?)
if [ $OK -eq 0 ]
then
   tmux a -t gorra
else
   tmux new-session -d -s gorra 'iftop -n -i eth3'
   tmux select-window -t gorra:0
   tmux split-window -h -t 0 'iftop -n -i eth5'
   tmux select-window -t gorra:0
   tmux split-window -h -t 1 'iftop -n -i eth0'
   tmux split-window -h -t 0 'iftop -n -i eth4'

   tmux select-window -t gorra:0
   tmux split-window -v -t 0 'nbwmon -i eth3'
   tmux select-window -t gorra:0
   tmux split-window -v -t 1 'nbwmon -i eth5'
   tmux select-window -t gorra:0
   tmux split-window -v -t 2 'nbwmon -i eth0'
   tmux select-window -t gorra:0
   tmux split-window -v -t 3 'nbwmon -i eth4'

   tmux a -t gorra
fi

tmux-malbec-gorra.png

Para visualizar varios archivos de logs al mismo tiempo:

tmux-tail-logs.png

Nota al pie de página: