tmux: Terminal MUltipleXer

Terminal MUltipleXer (tmux) es otra de esas herramientas que se convierte en imprescindible una vez descubres que existe.

Tmux es un multiplexador de terminales; permite lanzar múltiples terminales (ventanas y paneles) dentro de única pantalla (sesión de consola, sesión telnet/ssh, pestaña de terminal en un GUI). Cada terminal es totalmente gestionable y separada de las demás: podemos cambiar entre ellas y lanzar procesos, crear paneles dentro de cada ventana, etc.

Por ejemplo, la siguiente captura ilustra una sesión de tmux con 3 ventanas, siendo la ventana activa la 2 (puede verse en la barra de estado, en rojo). La primera y última de las ventanas no son visibles (porque la visible es la 2, véase el asterisco en la barra de estado al lado de su nombre) y están ejecutando una sesión de bash la 1 y una sesión de vim la 3).

La ventana activa (la 2) la hemos a su vez dividido en 3 paneles que están corriendo de forma separada los comandos "top" y un reloj digital, y tenemos uno de los 3 paneles reservado para teclear comandos.


 Aspecto de tmux

Para realizar las diferentes acciones, se utiliza un atajo de teclado que permite enviarle comandos a tmux para crear o eliminar ventanas o divisiones en las ventanas (paneles), o movernos a la anterior (previous) o siguiente (next).

Por defecto, estas son las combinaciones de teclado básicas:

Atajo Acción
Ctrl+B c Crear una nueva ventana (c de create).
Ctrl+B n Cambiar a la ventana siguiente (n de next).
Ctrl+B p Cambiar a la ventana anterior (p de previous).
Ctrl+B NUMERO Cambiar a la ventana número NUMERO.
Ctrl+B & Cerrar la ventana actual
(aunque si hacemos un exit se cierra).

Estas combinaciones de teclas se realizan pulsando Ctrl+B, soltando dicha tecla y pulsando después la tecla del comando deseado.

En nuestro caso, lo primero que haremos será cambiar dicha combinación de teclas prefijo de cada comando (Ctrl+B) por la que se usa en otros programas similares y que es mucho más cómoda: Ctrl+A.

A partir de ahora, todos los comandos que mostraremos usarán Ctrl+A (y, además, indicaremos cómo cambiar Ctrl+B por Ctrl+A en el fichero de configuración).

Como os habréis dado cuenta algunos, es similar al programa GNU screen que, al igual que tmux, permite ejecutar múltiples terminales desde una misma pantalla y cambiar entre dichas terminales, desasociarla de la terminal para dejarla corriendo en background y recuperarla desde otro PC diferente, etc.

Estas son algunas de las funciones que permite tmux:

  • tmux permite ejecutar múltiples ventanas dentro de una misma terminal.
  • Una misma ventana puede ser visible o manipulable por múltiples clientes remotos (por ejemplo, podemos compartir una sesión SSH en un servidor con un cliente que quiere ver las acciones que se realizan).
  • Las ventanas pueden a su vez dividirse en paneles horizontales y verticales.
  • Los paneles pueden a su vez dividirse en más paneles verticales y horizontales.
  • Es fácil moverse entre ventanas y entre paneles.
  • Se pueden hacer búsquedas de texto en el histórico de un panel o ventana.
  • Los paneles (divisiones de las ventanas) pueden redimensionarse o incluso grabarse como "layouts" predefinidos.
  • Soporta menúes interactivos para moverse entre ventanas, sesiones o clientes.
  • Soporte para UTF-8 y terminales de 256 colores.
  • Bloqueo de terminales manualmente o automáticamente tras un timeout.
  • Dettach de terminales para procesos críticos o continuación de tareas desde otro cliente.
  • Muchas otras funcionalidades que veremos a lo largo de este manual o en la documentación de tmux.



Instalando tmux

Podemos instalar tmux desde nuestro gestor de paquetes preferido. Si queremos hacerlo desde consola en las 2 variantes de paquetes típicas (DEB y RPM) bajo las distribuciones habituales, podemos hacerlo con:

Distribución Comando
CentOS, RedHat, Fedora yum install tmux
Debian, Ubuntu, Mint apt-get install tmux
Gentoo emerge tmux

En otras distribuciones el proceso es similar, y en el caso de que necesitemos compilar su código fuente (que no suele ser habitual), podemos obtenerlo de http://tmux.sourceforge.net .



Funcionalidad básica de tmux

Antes de entrar en materia, y para quien no conozca screen, vamos a ver algún ejemplo de sesión típica de tmux: ejecutaremos el programa, crearemos múltiples terminales y usaremos alguna de las funciones básicas e imprescindibles (como el detach).

Para eso, comenzaremos creando un fichero de configuración .tmux.conf en nuestro directorio $HOME que contenga lo siguiente:

# Ademas de Ctrl+A, agregamos un atajo de teclado tipo screen (Ctrl+A)
# Para tmux < 1.6:
set-option -g prefix C-a,C-b

# Para tmux >= 1.6:
#set-option -g prefix C-a
#set-option -g prefix2 C-b

# Empezar la numeración de las ventanas creadas en 1 (la primera ventana)
set -g base-index 1

En este fichero de configuración añadimos al "atajo" disparador de los comandos que lleva tmux por defecto (Ctrl+B, o C-b en terminología tmux) el disparador adicional Ctrl+A (C-a). Lo hacemos por varios motivos: el primero porque muchos estamos acostumbrados a Ctrl+A debido a screen, y el segundo porque es más sencillo llegar a la tecla A que a la B con el Ctrl-izquierdo pulsado).

Es una decisión muy personal el cambiar totalmente el atajo de teclado de C-b a C-a. Por un lado, si estás acostumbrado a screen, es la mejor opción. Por otro, el atajo real de teclado de tmux es C-b, por lo que muchos manuales harán referencia a C-b y si tienes que compartir una cuenta de un servidor (por ejemplo, root) con otra persona, puede que alguno de sus usuarios prefiera el atajo por defecto. Por eso, en nuestro caso ponemos ambos atajos como válido simultáneamente.

Nótese que este primer comando es diferente según la versión que usemos de tmux: hay que usar el primer comando para tmux < 1.6 y el segundo par de comandos para tmux >= 1.6 .

La segunda opción de nuestro .tmux.conf básico hace que los terminales que vamos creando se numeran a partir del 1 (el inicial) y no desde el 0, porque es más intuitivo a la hora de cambiar entre ellos que el orden de los terminales coincida con el de la fila numérica del teclado.


Ejecutar y utilizar tmux

Para lanzar tmux, simplemente tenemos que ejecutar tmux en una terminal de texto. Se creará en la pantalla actual una nueva sesión de tmux que contendrá una terminal:


 Arranque de tmux

Abajo a la izquierda podemos ver la cadena "1:bash*" que nos indica que estamos en la terminal número 1, que está ejecutando "bash", y que es la terminal activa (*).

Si quisieramos lanzar tmux directamente dándole un nombre a nuestra sesión (por si vamos a abrir varios) podemos hacerlo con tmux new -s "Nombre de sesión".

En vuestro caso, es posible que los colores varíen y que si no habéis creado el fichero de configuración básico de la anterior sección la terminal indicada sea la 0. Esto es así porque tengo un fichero de configuración con la barra de estado personalizada en cuanto a colores y funciones.

En cualquier caso, ahora podemos teclear comandos en nuestra terminal con total normalidad. Supongamos que ejecutamos top. Queremos mantener este top activo mientras seguimos trabajando en una sesión de consola, así que creamos una nueva terminal con:

Atajo Comando
Ctrl+A c Crear una nueva ventana.

(Recuerda, se debe pulsar Ctrl+A, soltarlo, y luego pulsar c).

Se creará una nueva terminal con un intérprete de comandos (bash en mi caso) y ahora la barra de estado mostrará 2 terminales:



Top sigue ejecutándose en la ventana 1 sin problemas, y nosotros tenemos una nueva ventana (la 2) donde se está ejecutando bash y podemos continuar trabajando. Podríamos crear más ventanas con Ctrl+A seguido de c (tantas como necesitemos), pero para nuestro ejercicio es suficiente con estas 2.

Ahora podemos movernos entre terminales con los siguientes comandos:

Atajo Comando
Ctrl+A n Cambiar a la ventana siguiente (n de next).
Ctrl+A p Cambiar a la ventana anterior (p de previous).
Ctrl+A NUMERO Cambiar a la ventana número NUMERO.

Es decir, con Ctrl+A n y Ctrl+A p podemos cambiar entre nuestra ventana con "top" y la que tiene "bash".

También podemos ir a la ventana 1 (top) con Ctrl+A 1 y a la 2 (bash) con Ctrl+A 2 (de esta forma tenemos acceso a 9 ventanas de forma directa, simplemente mirando el número de la barra de estado).

Para cerrar cualquiera de la 2 ventanas, podemos salir de la shell (exit) o bien usar un atajo de teclado que mata la ventana y todos sus paneles:

Atajo Comando
Ctrl+A & Forzar el cierre de la ventana actual y sus paneles (matar).
exit o Ctrl+D Si estamos en una shell y la cerramos, se cierra la ventana.

Cuando cerramos la última ventana abierta en tmux (por ejemplo con exit), también se cierra tmux en sí mismo.

Podemos trabajar de esta forma en nuestro PC en múltiples aplicaciones de texto con una única ventana / terminal (ya sea en modo texto o con un kde o gnome-terminal) sin levantar las manos del teclado. Por supuesto, si estamos usando SSH o telnet para trabajar en servidores remotos nos encontraremos que tmux es imprescindible para no tener que abrir múltiples sesiones de trabajo.


El histórico de la ventana

Cabe destacar que por el mero hecho de estar utilizando tmux, el funcionamiento del "histórico" de las terminales cambia. Me refiero al histórico de los comandos, ese que en gnome-terminal podemos recorrer con la barra de scroll o en la consola con Ctrl+RePag/AvPag.

Dentro de tmux, la consola o gnome-terminal ya no tiene acceso a ese histórico, porque es tmux quien lo genera y mantiene (por ejemplo, pensad en las ventanas ocultas).

¿Quiere eso decir que no podemos volver atrás a consultar qué hicimos hace unos minutos o para copiar y pegar la salida de un comando? No, simplemente que para acceder al buffer histórico lo tenemos que hacer con un comando. Concretamente, Ctrl+A seguido de [.

Atajo Comando
Ctrl+A [ Cambiar a modo "histórico del buffer"
Ctrl+A RePag Cambiar a modo "histórico del buffer" retrocediendo ya una página.
q Salir del modo "inspección del histórico del buffer"

Una vez dentro de este modo histórico (pulsando el comando correspondiente), sí que podremos usar los cursores y AvPag / RePag (incluso teclas de vi o de emacs) para movernos a través del buffer histórico y poder copiar texto. Es más, podemos incluso buscar cadenas de texto en el buffer con Ctrl+A f.

Finalmente, podemos salir del modo histórico con q.

¿Para qué sirve el modo histórico? Básicamente, para inspeccionar la salida de comandos anteriores o para seleccionar texto y copiarlo a un buffer o guardarlo en fichero. Por ejemplo, podemos guardar toda la salida de una serie de comandos en un buffer que se puede pegar o guardar en fichero. Esto se haría así:


  1. Cambiamos a modo copia con Ctrl+A [.
  2. Usamos los cursores, Inicio/Fin, RePg/AvPg para moverse por el buffer histórico.
  3. Pulsamos ESPACIO donde queramos iniciar la selección de texto.
  4. Pulsamos ENTER donde queremos que acabe la selección de texto. Al hacerlo, el texto entre las 2 marcas se COPIA en un buffer.
  5. Abrimos un editor de texto y pulsamos Ctrl+A ] para pegar el contenido del buffer de tmux en la terminal.


Aparte de estos comandos de "copiar y pegar", también tenemos otros comandos de gestión de buffers como:

  1. Ctrl+A :show-buffer → Ver el contenido de la selección realizada.
  2. Ctrl+A :list-buffers → Ver el contenido de las últimas selecciones realizadas (van rotando).
  3. Ctrl+A :choose-buffer → Elegir uno de los buffers del histórico como "current buffer".
  4. Ctrl+A :save-buffer file.txt → Salvar el contenido del buffer a fichero de texto.

(Nota: tanto show-buffer como save-buffer aceptan un parámetro -b # con el número de buffer a pegar).

También podemos, en vez de usar combinaciones de teclas, ejecutar el binario tmux más una orden para lo mismo:

$ tmux show-buffer
$ tmux list-buffers
$ tmux save-buffer file.txt

Si queremos que la rueda del ratón funcione como cuando Tmux no está siendo ejecutado (es decir, que se scrollee hacia atrás el texto y podamos copiar y pegar con el ratón), podemos poner lo siguiente en nuestro .tmux.conf:

set -g terminal-overrides 'xterm*:smcup@:rmcup@'

También podemos poner un "keybinding" más cómodo que Ctrl+A [ para entrar en modo histórico del buffer, por ejemplo Ctrl+A Space:

bind-key Space copy-mode


El detach de terminales

Finalmente queremos mostrar una de las mayores ventajas de tmux con respecto a lanzar múltiples ventanas o pestañas de terminal para ejecutar las aplicaciones: la posibilidad de detach.

Sea cualquiera de las siguientes situaciones:


  • Estamos trabajando en un gnome-terminal con múltiples pestañas en la edición de varios ficheros y con comandos en ejecución, y se cuelga el gnome-terminal o lo cerramos por error, perdiendo todo el trabajo realizado.
  • Estamos en el trabajo conectados por SSH a un servidor realizando algún tipo de tarea que está en ejecución y queremos poder continuar el trabajo desde casa.
  • Tenemos que traspasar una sesión de trabajo SSH a otro compañero o a un cliente.
  • Lanzar en un servidor vía SSH un comando crítico y se corta la conexión, perdiéndose la ejecución del comando a medias y provocando problemas graves.


En ese caso, tmux es nuestra salvación. Tanto si lo hacemos manualmente con un comando (Ctrl+A d o Ctrl+A :detach), como si tmux pierde la conexión entre sus terminales y la pantalla, se produce un detach y todas nuestras aplicaciones siguen ejecutándose en el sistema y podemos recuperar de nuevo la sesión tal cual la teníamos, siempre y cuando no se reinicie la máquina que las ejecuta.

Para ello basta con volver a acceder al sistema donde estábamos y lanzar tmux attach para que tmux vuelva a conectarse (attach) a las terminales que se están ejecutando en background.

Es decir, que en nuestros 3 supuestos anteriores podríamos:


  • Crash de gnome-terminal: Lanzar otro gnome-terminal y recuperar la sesión con tmux attach.
  • Continuar sesión en casa: Hacer un Ctrl+A d (detach de la sesión), cerramos la conexión SSH, nos vamos a casa, conectamos por SSH al servidor y hacemos un tmux attach (porque nuestra terminal seguía en ejecución, sólo que "desconectada" de la "pantalla" de la terminal).
  • Traspasar trabajo a cliente/compañero (variante de la anterior): Hacer un Ctrl+A d (detach de la sesión), cerramos la conexión SSH, y le pedimos al compañero o cliente que acceda por SSH al servidor con el mismo usuario, y haga un tmux list-sessions y un tmux attach o tmux attach -t la_sesion.
  • Ejecutar comando crítico: Antes de ejecutar el comando crítico, lanzamos tmux y ejecutamos dicho comando dentro de tmux. Si hubiera un corte de conectividad, por ejemplo, se produce un dettach y el comando se sigue ejecutando en background. Podemos reconectarnos por SSH al servidor y retomar el control sobre el comando (que sigue ejecutandose) con tmux attach.


Creo que con los 4 ejemplos mostrados no es necesario recalcar la importancia vital que esta funcionalidad tiene para los administradores de sistemas (y para otros usuarios que hagan mucho uso de la terminal)…



Diferencias entre tmux y Screen

Como ya has notado si conoces screen, Tmux es muy similar a screen, pero presenta las siguientes diferencias principales:

  • tmux utiliza un modelo cliente-servidor: el servidor mantiene todas las sesiones, en contraposición a screen que generaba un proceso por sesión. La desventaja es que en caso de caída del servidor de tmux, se pierden todas las terminales. Afortunadamente, tmux es muy estable y lo normal es nunca padecer una situación como esa.
  • La licencia de tmux es BSD en lugar de la GNU GPL v3 de screen.
  • La configuración es, en general, más intuitiva y con bastantes opciones personalizables.
  • tmux está en continuo desarrollo (no como screen).
  • tmux dispone de opciones para utilizar configuraciones/posiciones de paneles pretederminadas.
  • screen está disponible en más entornos que tmux (por ejemplo: IRIX). No obstante, tmux está disponible para la mayoría de sistemas habituales, por lo que puede que no nos veamos afectados por esta diferencia.



Fichero de configuración completo de tmux

En la página de manual de tmux o en la documentación de su web podemos encontrar gran cantidad de opciones de configuración para el fichero $HOME/.tmux.conf.

A continuación muestro mi .tmux.conf ligeramente comentado para ver alguna de la posibilidades disponibles. Nótese que algunas de las opciones funcionan sólo a partir de versiones específicas de Tmux (1.6 o superior, 1.8 o superior, etc), por lo que si alguna de las opciones os da error al lanzar tmux, simplemente eliminad o comentadla en el fichero:

set -g status-utf8 on                       # enable utf-8
set -g history-limit 100000                 # scrollback buffer n lines
set-window-option -g xterm-keys on
set-window-option -g utf8 on

### Add screen's like shortcut (C-A)
#set-option -g prefix C-a,C-b               # For tmux < 1.6:
set-option -g prefix C-a                    # For tmux >= 1.6:
set-option -g prefix2 C-b                   # For tmux >= 1.6:
# set-option -g prefix C-a                  # To replace it completely

set -g base-index 1                         # Start numbering windows in 1

### don't rename windows automatically (Use C-A , to rename window)
set-window-option -g automatic-rename off
set-option -g allow-rename off

set -s escape-time 0                        # Reduce time for escape sequences

### Colours can be defined both with RGB or with colour0 to colour255:
set -g default-terminal "screen-256color"

### Custom status bar
set -g status-bg black
set -g status-left "#[bg=#f0c674] #H #[bg=default]  "
set -g status-right "#[bg=#f0c674] %d/%m/%Y - %H:%M "
set -g status-justify left
set -g status-bg "#b5bd68"
set -g status-left-length 25
set -g status-right-length 20
set-window-option -g window-status-format " #I: #W "
set-window-option -g window-status-current-format " #[fg=cyan,bold]#I: #[fg=default,bold]#W "
set-window-option -g window-status-current-fg white
set-window-option -g window-status-current-bg black
set-option -g pane-border-fg colour235
set-option -g pane-active-border-fg green

set-option -g pane-border-fg colour235
set-option -g pane-active-border-fg green

### Keyboard bindings

### Split windows with easier shortcuts: | and -
unbind %
bind | split-window -h
bind - split-window -v

### bind to reload config (thanks to gentoo wiki :)
unbind r
bind r source-file ~/.tmux.conf \; display-message "Configuration file reloaded."

### How to send commands to nested tmux windows (C-A C-A command)
bind-key a send-prefix

### Change to buffer mode with prefix + space (appart from C-A [ or C-A PgUp)
bind-key Space copy-mode

### Change and Move Windows
bind-key Left previous-window                  # C-a Left and C-a Right to move to prev/next window
bind-key Right next-window
bind-key S-Left swap-window -t -1              # C-a Shift+Left or Shift+Right to move Window to left/right
bind-key S-Right swap-window -t +1
bind-key P swap-window -t -1
bind-key N swap-window -t +1                   # Also C-a N y C-a P (uppercase)
bind-key R command-prompt 'rename-window %%'   # Set the window name
bind-key C-R refresh-client

bind-key Pageup previous-window
bind-key Pagedown next-window
#tmux swap-window -s SOURCE_NUM -t DEST_NUM

### Pane movement
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R

### Pane resize
bind-key H resize-pane -L 5
bind-key J resize-pane -D 5
bind-key K resize-pane -U 5
bind-key L resize-pane -R 5

# For tmux 1.8+, Zoom / unZoom panel (C-A z or Vim's C-A _):
bind-key z resize-pane -Z

### Sane scrolling
set -g terminal-overrides 'xterm*:smcup@:rmcup@'

Si utilizamos los colores en formato "colourXXX", podemos utilizar el siguiente "oneliner" de Benjamín Albiñana para ver las correspondencias de color:

for i in {0..255} ; do
   printf "\x1b[38;5;${i}mcolour${i}\n"
done



Uso de paneles

Como hemos ya dicho en la descripción de tmux, además de poder tener múltiples ventanas (una de ellas visibles, el resto oculta), también podemos dividir la ventana actual en paneles visibles y ejecutar en ellos diferentes cosas.

A continuación podemos ver una ventana de tmux con una división horizontal. El panel superior ejecuta top y el de abajo, está disponible para el intérprete de comandos:


 split

Nota: aprovechando los 2 comandos bind de nuestro .tmux.conf, usaremos los nuevos atajos de teclado más intuitivos que hemos creado. Si no hemos hecho dicho bind, más abajo tenemos una tabla donde se incluyen los atajos de teclado originales.

# Split windows with easier shortcuts: | and -
unbind %
bind | split-window -h
bind - split-window -v

Podemos partir el área de trabajo actual en 2 paneles separados por una ralla vertical con Ctrl+A |, o bien en 2 paneles separados por una ralla horizontal con Ctrl+A -.

Atajo Comando
Ctrl+A | Dividir verticalmente la ventana actual en dos paneles.
Ctrl+A - Dividir horizontalmente la ventana actual en dos paneles.

Para movernos entre los 2 paneles creados, podemos usar Ctrl+A seguido de una dirección de las teclas del cursor:

Atajo Comando
Ctrl+A Cursor-Arriba Moverse al panel de arriba del actual.
Ctrl+A Cursor-Abajo Moverse al panel de abajo del actual.
Ctrl+A Cursor-Izquierda Moverse al panel de la izquierda del actual.
Ctrl+A Cursor-Derecha Moverse al panel de la derecha del actual.

Podemos cerrar cualquiera de los paneles con un "exit" (si es una terminal de bash) o con un atajo de teclado:

Atajo Comando
Ctrl+A x Matar panel actual (pide confirmación).

Nótese que una vez dividida la pantalla en 2 paneles, podemos volver a dividir cualquiera de ellos con los mismos comandos, pudiendo obtener múltiples divisiones según nos interese, como hemos visto en la primera captura que ilustra este artículo:


 Aspecto de tmux

Los paneles se pueden redimensionar el tamaño usando Ctrl+Flechas_del_cursor y Alt+Flechas_del_cursor después de haber pulsado Ctrl+A:

Atajo Comando
Ctrl+A Ctrl-Cursores Redimensionar el panel actual en 1 unidad (en la dirección del cursor pulsada).
Ctrl+A Alt-Cursores Redimensionar el panel actual en 5 unidades (en la dirección del cursor pulsada).

La última funcionalidad básica sobre paneles es la de convertir un panel en una ventana nueva completa, eliminando el panel de la ventana actual y creando una ventana nueva (numerada) para él.

Atajo Comando
Ctrl+A ! Convertir el panel actual en una ventana completa individual.

Finalmente, para tmux 1.8 o superior podemos añadir a nuestro .tmux.conf el parámetro bind-key z resize-pane -Z, con lo cual podremos usar Ctrl+A z para hacer zoom o restaurar el tamaño original de un panel.

Atajo Comando
Ctrl+A z Hacer zoom del panel actual (ocupará toda la pantalla).
Pulsar de nuevo para recuperar el tamaño original.

Este atajo es muy útil si tenemos la pantalla dividida en paneles (verticales, horizontales) y necesitamos en un momento determinado ver uno de ellos a pantalla completa (un fichero de configuración, la salida de un comando, logs). Pulsamos C-A z, y al acabar volvemos a pulsarlo para dejarlo a su tamaño original.

Veremos más funcionalidades en una posterior sección con de atajos de teclado completos.



Atajos de teclado completos y uso avanzado

Veamos ahora un resumen general de todos los comandos y atajos de tmux.


Gestión de sesiones

Atajo Comando
tmux (En la consola). Ejecutar tmux.
exit Si estamos en una shell y la cerramos, se cierra la terminal.
Ctrl+A d Hacer un "dettach" de la sesión de tmux.
tmux attach (En la consola). Ejecutar tmux enganchándose a una sesión.
Ctrl+A ? Muestra una ayuda con los atajos de teclado.
Ctrl+A s Elegir sesión si tenemos abierta más de una.


Gestión de ventanas

Atajo Comando
Ctrl+A c Crear una nueva ventana.
Ctrl+A n Cambiar a la ventana siguiente (n de next).
Ctrl+A p Cambiar a la ventana anterior (p de previous).
Ctrl+A NUMERO Cambiar a la ventana número NUMERO.
Ctrl+A & Forzar el cierre de la ventana actual y sus paneles (matar).
Ctrl+A w Ver una lista de todas las ventanas para cambiar entre ellas con los cursores.
Ctrl+A , Cambiar el nombre de la ventana actual en la barra de estado
Ctrl+A [ Cambiar a modo "histórico del buffer"
Ctrl+A RePag Cambiar a modo "histórico del buffer" retrocediendo ya una página.
Ctrl+A f Hacer búsquedas de texto en el "histórico del buffer".
Ctrl+A Alt-n Moverse a la siguiente ventana que haya tenido actividad o un "bell".
Ctrl+A Alt-p Moverse a la anterior ventana que haya tenido actividad o un "bell".
Ctrl+A l Volver a la anterior ventana seleccionada (tras un salto).
Space En modo Histórico del Buffer: marca inicio de selección.
Enter En modo Histórico del Buffer: marca fin de selección (y copiar al buffer desde Inicio a Fin).
q En modo Histórico del Buffer: salir de modo selección / histórico del buffer


Gestión de paneles

Atajo Comando
Ctrl+A % Dividir verticalmente la ventana actual en dos paneles (cambiado en nuestra conf a Ctrl+A |
Ctrl+A " Dividir horizontalmente la ventana actual en dos paneles (cambiado en nuestra conf a Ctrl+A -.
Ctrl+A cursores Moverse entre paneles (al de arriba, abajo, etc).
Ctrl+A x Matar panel actual.
Ctrl+A o Moverse cíclicamente entre paneles.
Ctrl+A ! Convertir el panel actual en una ventana completa individual.
Ctrl+A q Mostrar brevemente los números identificativos de cada panel.
Ctrl+A t Mostrar un reloj digital en el panel actual.
Ctrl+A Ctrl-Cursores Redimensionar el panel actual en 1 unidad (en la dirección del cursor pulsada).
Ctrl+A Alt-Cursores Redimensionar el panel actual en 5 unidades (en la dirección del cursor pulsada).
Ctrl+A Alt-NUMERO Permite cambiar los paneles entre una de los 5 layouts predeterminados.
Ctrl+A { Intercambiar el panel actual con el anterior.
Ctrl+A } Intercambiar el panel actual con el siguiente.
Ctrl+A ; Moverse al último panel activo.

Recuerda que en nuestro .tmux.conf de ejemplo hemos creado nuevos atajos de teclado más intuitivos para sustituir a Ctrl+A % y Ctrl+A ", y para añadir el nuevo (tmux 1.8+) Zoom/unZoom:

Atajo Comando
Ctrl+A | Dividir verticalmente la ventana actual en dos paneles.
Ctrl+A - Dividir horizontalmente la ventana actual en dos paneles.
Ctrl+A z Zoom / unzoom del panel actual.


Otros comandos

A continuación se muestran otros comandos menos habituales (aunque puedan pertenecer a categorías anteriores):

Atajo Comando
Ctrl+A $ Cambiar el nombre de la sesión (conjunto de ventanas) actual.
Ctrl+A , Cambiar el nombre de la ventana (pestaña) para que no cambie automáticamente según lo que estamos ejecutando en ella
Ctrl+A . Cambiar el número de índice de la ventana (a otro número).
Ctrl+A : Introducir un comando de tmux en lugar de un atajo (por ejemplo :detach)
Ctrl+A # Listar los diferentes buffers de pegado disponibles.
Ctrl+A = Seleccionar de forma interactiva un buffer de pegado y pegar su contenido.
Ctrl+A ] Pegar el buffer de pegado más reciente que se haya copiado.
Ctrl+A D Selecciona a qué cliente desconectar con un dettach.
Ctrl+A r Forzar redibujado de la pantalla para el cliente.
Ctrl+A ~ Mostrar mensajes anteriores de tmux, si los hay.



Lanzando tmux con ventanas predeterminadas

Podemos añadir ventanas a una sesión de tmux ya creada, por lo que podemos aprovechar esta funcionalidad para hacernos un script que ejecute tmux con un set pretederminado de ventanas e incluso con paths de inicio o aplicaciones ya arrancadas en alguna de ellas.

Veamos un ejemplo de $HOME/bin/start_tmux.sh:

#!/bin/bash

# Nombre para la sesion:
sn=main

# Arrancar la sesion en $HOME, con la primera ventana:
cd $HOME
tmux new-session -s "$sn" -d

# Crear 1 terminal mas para mi usuario y una para "root"
tmux new-window -t "$sn"
tmux new-window -n "root" 'sudo su - root'

# Seleccionar la primera ventana y hacer un attach a la sesion:
tmux select-window -t "$sn:1"
tmux -2 attach-session -t "$sn"

De esta forma, podemos usar $HOME/bin/start_tmux.sh como "tmux" inicial en nuestro gestor de ventanas, en aplicaciones como tilda, etc.



En resumen

Creo que resulta bastante evidente que tmux es una herramienta imprescindible para los Administradores de Sistemas tanto localmente como en remoto, permitiendo ejecutar comandos críticos, disponer de paneles informativos (top/ps/watch) mientras trabajamos, etc. Incluso podemos entregar o recoger sesiones de trabajo SSH a clientes, o mostrarles interactivamente cómo realizar una determinada tarea.

A nivel personal (en escritorios), también puede resultar más interesante que el úso de múltiples terminales. Podemos tener un panel que ocupe el 80% de la pantalla con la edición de un programa, y un panel inferior para probar la ejecución, por ejemplo.

Y todo esto, con la seguridad de que la sesión se puede desligar (dettach) en cualquier momento, ya sea manualmente o por un error, y podemos recuperarla más tarde con "tmux attach" (siempre que no detengamos el servidor tmux o reiniciemos el ordenador).


SANTIAGO ROMERO
http://www.sromero.org/
Santiago Romero 2016-07-12


<Volver a la sección de GNU/Linux>