tmux en la práctica: iTerm2 y tmux

Beneficios y desventajas de usar iterm2 vs tmux localmente. Cómo configurar el perfil iTerm2 para anular las asignaciones de teclas para activar acciones tmux analógicas

Esta es la segunda parte de la serie de publicaciones "tmux en la práctica".

Entonces estás usando el emulador de terminal iTerm2 en OSX. Y has oído hablar de tmux y has decidido probarlo. Google aquí, Google allí, después de un tiempo, comprende conceptos como multiplexación de terminales, ventanas, división de paneles y comprende el uso de tmux en máquinas remotas para conservar el estado de la sesión y sobrevivir a desconexiones abruptas.

En algún momento, es posible que se pregunte sobre el uso de tmux localmente.

"Dado que iTerm ya puede crear múltiples ventanas virtuales dentro de una sola ventana 'física', puede dividir, intercambiar y cambiar el tamaño de los paneles, ¿realmente necesito usar tmux en mi máquina local en lugar de iTerm?"

Cuando estaba aprendiendo tmux, volvía a la misma pregunta una y otra vez. No estaba claro sin algo de práctica. Así que decidí intentarlo y hoy puedo compartir contigo los beneficios y los inconvenientes.

iTerm2 vs tmux en la máquina local: ventajas e inconvenientes

Beneficios:

  • Ventanas con nombre. Similar a las pestañas en iTerm, pero puede darles un nombre
  • Una línea de estado con información de todo el sistema. Incluye CPU, memoria, estado en línea / fuera de línea, batería, usuario, host y fecha y hora.
  • Al tener una línea de estado y un conjunto de ventanas con nombre en su interior, puedo convertir iTerm en modo de pantalla completa. Esto me permite trabajar en un entorno sin distracciones y también obtener 3 filas adicionales. Estos anteriormente fueron tomados por la barra de menú OSX, el marco de la ventana iTerm y la fila de pestañas iTerm.
  • Supervise la ventana para detectar actividad o silencio. Cuando ejecuto un comando de larga duración en un panel, puedo cambiar a otro panel y recibir una notificación cuando no aparecen más resultados en el panel anterior durante algún intervalo

    iTerm tiene algo similar, pero solo se trata de notificarle cuando la ejecución regresa al símbolo del sistema y requiere instalar una integración de shell adicional

  • Diseños de paneles redefinidos. Uniforme horizontal, uniforme vertical, principal horizontal, principal vertical y en mosaico
  • Posibilidad de cambiar entre varias sesiones tmux locales por proyecto para cambiar fácilmente de contexto
  • Si está utilizando tmux tanto localmente como en una máquina remota, obtendrá el mismo entorno de terminal familiar
  • Cuando usa tmux, confía mucho menos en las características únicas de iTerm2

    Esto facilita la migración a un emulador de terminal diferente , ya sea en el mismo sistema operativo o en otro (Linux)

Inconvenientes:

  • tmux mantiene su propio búfer de retroceso. Es más difícil acceder a él y copiar texto que en iTerm (solo desplácese y seleccione con el mouse)
  • Si copia texto en tmux, se almacena en el propio búfer de tmux y no se comparte con el portapapeles de su sistema operativo de forma predeterminada. Para ser 100% correcto, compartir con el portapapeles del sistema funciona en iTerm2, pero solo porque admite secuencias de escape OSC 52 ANSI que permiten que aplicaciones como tmux accedan y almacenen datos en el portapapeles. iTerm2 es un caso especial. Simplemente intente copiar texto en tmux que se ejecuta en la Terminal predeterminada de OSX, que no es compatible con OSC52
  • Si ya está acostumbrado a las combinaciones de teclas iTerm, debe aprender y cambiar a combinaciones de teclas tmux , que son engorrosas. En lugar de una sola pulsación de tecla como ⌘⌥->, necesita dos teclas para s: precorregir seguidas de otra tecla, asignada a una acción específica de tmux.

Personalmente, decidí seguir adelante con tmux y sus características, y confiar menos en las características específicas de iTerm2. De hecho, en este momento estoy usando iTerm solo como un túnel hacia tmux.

Los problemas con el búfer de desplazamiento hacia atrás y la integración con el portapapeles del sistema operativo son muy vitales , por lo que incluso puede decidir dejar de adoptar tmux. Abordaremos estos temas en mis próximas publicaciones.

Anule las asignaciones de teclas de iTerm para activar la acción de tmux

Hoy, veamos cómo podemos usar combinaciones de teclas iTerm familiares mientras trabajamos en el entorno tmux. La idea es mapear las pulsaciones de teclas en iTerm para activar acciones de tmux.

La forma más fácil sería simplemente ir .tmux.confy asignar las acciones de tmux a esas combinaciones de teclas. Por ejemplo, para cambiar el tamaño del panel en iTerm, usamos " ^⌘↑", mapeemos la misma pulsación de tecla en tmux de una manera algo ingenua:

bind ^⌘↑ resize-pane -U

Sin embargo, el código anterior no funcionará porque no puede usar ⌘ en combinaciones de teclas tmux, y el uso de SHIFT también es muy limitado. E incluso si eso fuera posible, iTerm interceptaría esa pulsación de tecla antes.

En su lugar, configuramos un nuevo perfil iTerm y anulamos las asignaciones de teclas para enviar secuencias de bytes preconfiguradas, que activarán la acción correspondiente en tmux.

Por ejemplo, cuando se ^⌘↑presiona “ ”, la secuencia de bytes 0x01 0x1b 0x5b 0x31 0x3b 0x35 0x41se envía a través del terminal a la instancia tmux en ejecución. Los interpreta como C-a C-↑atajos de teclas y los dispara resize-pane -Usegún nuestra .tmux.confconfiguración.

Entonces, ¿cómo puedes obtener esos códigos hexadecimales? Uso showkey, odo hexdumpcomandos para ver la representación binaria de pulsaciones de teclas en el teclado:

$ showkey -aPress any keys - Ctrl-D will terminate this program
^A 1 0001 0x01^[[1;5A 27 0033 0x1b 91 0133 0x5b 49 0061 0x31 59 0073 0x3b 53 0065 0x35 65 0101 0x41

Nota : showkeyno está disponible en OSX, pero siempre puede usar SSH en una máquina remota Linux y usarlo. Si suena como una enorme sobrecarga, sólo tiene que utilizar O d o Hexdump.

$ od -t x1
^A^[[1;5A // press C-a C-↑ on your keyboar0000000 01 1b 5b 31 3b 35 410000007

Puede reasignar cualquier clave de esta manera, pero hago esto solo para las más comunes, que tienen acción analógica en tmux.

Al final del día, puedo crear nuevos paneles tmux usando ⌘Dy ⌘⇧D, seleccionar paneles usando ⌘⌥→ , ^Tab para cambiar a la ventana usada más recientemente, ⌘⇧Entrar para ampliar el panel, ^⌘←cambiar el tamaño del panel a la izquierda, ⌘[ seleccionar el panel anterior, ⌘Weliminar el panel actual, Etcétera. Entonces, no necesito luchar contra mi memoria muscular para las acciones más comunes.

Para todas las demás acciones sin correspondencia sigo usando tmux way: C-aprefix seguido de la tecla de acción. Si tiene curiosidad acerca de la lista completa de tales combinaciones de teclas y cómo funciona todo esto en acción, consulte mi repositorio tmux-config.

Also, I’ve found predefined layouts to be very useful: even-horizontal, even-vertical, main-horizontal, main-vertical, tiled. I usually work in main-vertical layout, and need to swap secondary pane with main forth and back. This is so common, that I decide to setup a keybinding both in tmux (prefix \) and iTerm (⌘\).

# Swap panes back and forth with 1st pane# When in main-(horizontal|vertical) layouts, the biggest/widest panel is always @1bind \ if '[ #{pane_index} -eq 1 ]' \ 'swap-pane -s "!"' \ 'select-pane -t:.1 ; swap-pane -d -t 1 -s "!"'

As an extra step, you can setup this new iTerm profile as default, and tell it to jump into tmux session right at the start.

And don’t forget to run you iTerm2 in full screen mode. It’s worth it.

Native integration between iTerm2 and tmux

There is an integration between iTerm2 and tmux powered by iTerm that you might be interesting in.

The idea is that iTerm still handles window and pane management, maintain scrollback buffers, copy/paste as usual, but all windows are backed by tmux session under the hood. It’s tmux session indeed, but abstracted and encapsulated by familiar iTerm environment for you. You can close iTerm, open it back and reattach to previous session, without state lost.

However, it makes little sense for local environment (only useful in case of an iTerm crash which is an extremely rare event). Personally, I don’t like this approach, because it hides me from the fact I’m using tmux, and exposes only those most common tmux features, which have analogues in iTerm (create window, split pane, resize window/pane, close session).

Resources and links

Tmuxintegration · Wiki · George Nachman / iterm2 · GitLab — //gitlab.com/gnachman/iterm2/wikis/TmuxIntegration

iTerm2 keymaps for tmux — Dan Lowe — //tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Auto-Starting Tmux in iTerm2 — Sašo Matejina — Medium — //medium.com/@sasom/auto-starting-tmux-in-iterm2-4276182d452a

samoshkin/tmux-config: Tmux configuration, that supercharges your tmux to build cozy and cool terminal environment — //github.com/samoshkin/tmux-config