tmux en la práctica: búfer de retroceso

La diferencia entre los búferes de scrollback de terminal y tmux, y cómo modificar el modo de copia, el desplazamiento y la selección del mouse del comportamiento de tmux.

Esta es la tercera parte de mi serie de artículos sobre tmux en la práctica.

Por lo general, los emuladores de terminal implementan un búfer de desplazamiento hacia atrás, por lo que puede explorar la salida pasada, cuando se mueve fuera de la vista. tmux, al igual que otras aplicaciones de terminal de pantalla completa como vim, se ejecuta en el llamado búfer de pantalla alternativo de un terminal principal. El búfer alternativo tiene dimensiones exactas de ancho y alto como tamaño de ventana física.

Hay varios efectos de usar un búfer alternativo:

  • Se pierde cualquier salida que exceda la parte visible del búfer alternativo. Tan pronto como las líneas desaparecen, se pierden. Para evitar la pérdida del historial, tmux implementa su propio búfer de retroceso "interno". La consecuencia de esto es que no puede trabajar con tmux inner scrollback como lo hace habitualmente dentro de su terminal.
  • Cualquier salida producida dentro de tmux (lo mismo es cierto para vim, nano, man, less, etc.) no se extiende al historial de retroceso del terminal externo. Cuando cierra su aplicación de pantalla completa, vuelve al mismo estado en el que inició la aplicación y ya no ve la salida desde el interior de la aplicación.

En la práctica, si se acostumbra a desplazarse hacia atrás usando ⌘↑en su iTerm y si va a hacer lo mismo dentro de la sesión tmux en ejecución, controlará y desplazará el búfer de retroceso del iTerm externo, en lugar del búfer de retroceso interno de tmux.

La solución es usar controles específicos de tmux para acceder a su propio búfer de retroceso: Ctrl-bluego [ingresar al modo de copia, usar las Down/Upflechas o las teclas PageDowny PageUp, qo Entersalir del modo de copia.

Algunas personas que encuentran esto molesto - configuran el búfer de desplazamiento hacia atrás de tmux para que se les permita aparecer en el búfer de desplazamiento hacia atrás de la terminal principal - para que puedan usar controles de desplazamiento familiares. Vea esta publicación. Sin embargo, esta solución se limita a tener una sesión tmux con 1 ventana y 1 panel solamente. Y cuando desconecta / cierra una sesión tmux, la terminal principal se contamina con la salida de la ventana tmux.

Personalmente, uso tmux scrollback sin los trucos anteriores, pero modifico su configuración para que sea más amigable y familiar.

En primer lugar, no me gusta prefix,[ingresar al modo de copia. Me he acostumbrado a ⌘↑comenzar a desplazarme en iTerm, y agregué la siguiente combinación de teclas raíz:

# trigger copy mode bybind -n M-Up copy-mode

Una vez que esté en el modo de copia, puede continuar presionando M-Uppara desplazarse 1 línea hacia arriba. Los controles habituales PageDowny PageUpestán disponibles para desplazarse por toda la pantalla, y extra M-PageDowny M-PageUppara desplazarse por la mitad de la pantalla (realmente conveniente).

# Scroll up/down by 1 line, half screen, whole screenbind -T copy-mode-vi M-Up send-keys -X scroll-upbind -T copy-mode-vi M-Down send-keys -X scroll-downbind -T copy-mode-vi M-PageUp send-keys -X halfpage-upbind -T copy-mode-vi M-PageDown send-keys -X halfpage-downbind -T copy-mode-vi PageDown send-keys -X page-downbind -T copy-mode-vi PageUp send-keys -X page-up

Además, incluso cuando estoy dentro de la sesión tmux, aún puedo seguir usando ⌘↑y ⌘↓controlando el búfer de desplazamiento interno tmux, en lugar del de iTerm. Es posible mediante el uso de un perfil iTerm personalizado con algunas combinaciones de teclas anuladas para activar acciones de tmux. Entonces, ⌘↑presionado en iTerm solo envía la M-Uppulsación de tecla a la sesión tmux.

Lea mi parte anterior de la serie "tmux en la práctica" para obtener más detalles: tmux en la práctica: integración de iTerm2 y tmux.

Otro valor predeterminado de tmux que preferiría cambiar es el desplazamiento de la rueda del mouse. Se desplaza 5 filas, lo que se siente como un gran salto. Reduzcamos el desplazamiento a 2 filas:

# When scrolling with mouse wheel, reduce number of scrolled rows per tick to "2" (default is 5)
bind -T copy-mode-vi WheelUpPane select-pane \; send-keys -X -N 2 scroll-upbind -T copy-mode-vi WheelDownPane select-pane \; send-keys -X -N 2 scroll-down

Bueno, ahora hablemos de copiar texto una vez que esté en modo de copia. Me acostumbro a copiar texto con el mouse. Habilitemos la compatibilidad con el mouse:

set -g mouse on

De forma predeterminada, cuando selecciona texto con el mouse en tmux, se copia en el búfer y se elimina inmediatamente del modo de copia. Su posición de desplazamiento actual se restablece al final de la salida y se le coloca en un modo de símbolo del sistema. Veamos esto en acción:

Como puede ver, cada vez que selecciono texto con el mouse, me quita el modo de copia. Es muy molesto. Por lo general, cuando estoy atascado con alguna tarea, tiendo a seleccionar algún texto aquí o allá solo para meditar (¿me ayuda a concentrarme?). O tal vez desee seleccionar un texto para resaltarlo para su colega sentado a su lado.

Así que modifiquemos esto. No queremos que nos saquen del modo de copia. No queremos que la selección se borre en el evento final de arrastre del mouse. El texto de la selección se puede copiar después con el clic izquierdo del mouse.

# Do not copy selection and cancel copy mode on drag end event# Prefer iTerm style selection: select, then mouse click to copy to bufferunbind -T copy-mode-vi MouseDragEnd1Panebind -T copy-mode-vi MouseDown1Pane select-pane \;\ send-keys -X copy-pipe "pbcopy" \;\ send-keys -X clear-selection

Veamos el resultado:

Para acceder a los elementos del búfer de copia y pegar el elemento más reciente, utilice C-py p:

bind p paste-bufferbind C-p choose-buffer

Es todo por hoy. Manténganse al tanto. En la siguiente parte de la serie "tmux en la práctica", hablaremos sobre la integración del portapapeles y cómo compartir texto copiado dentro de tmux con el portapapeles del sistema (tanto localmente como cuando se trabaja de forma remota, en OSX y Linux).

Por cierto, puedes ver todos esos ajustes de configuración en acción, solo revisa mi repositorio tmux-config.

Truco

Si desea omitir el modo de copia tmux por completo y seleccionar texto a través de iTerm, simplemente mantenga presionado pt> key while dragging you mouse.

Resources and links

shell — What exactly is scrollback and scrollback buffer? — Unix & Linux Stack Exchange — //unix.stackexchange.com/questions/145050/what-exactly-is-scrollback-and-scrollback-buffer

tmux scrollback with iTerm2 • dan.carley.co — //dan.carley.co/blog/2013/01/11/tmux-scrollback-with-iterm2/

tmux copy mouse selected text to clipboard automatically on mouse release — Stack Overflow — //stackoverflow.com/questions/36815879/tmux-copy-mouse-selected-text-to-clipboard-automatically-on-mouse-release

keyboard shortcuts — tmux — scroll up/down with shift + page up/down into a pane — Super User — //superuser.com/questions/702189/tmux-scroll-up-down-with-shift-page-up-down-into-a-pane

[question/request] copy-mode without automatically selecting a pane? · Issue #1021 · tmux/tmux — //github.com/tmux/tmux/issues/1021

ssh — Leaving tmux scrollback in terminal (iTerm2) — Stack Overflow — //stackoverflow.com/questions/12865559/leaving-tmux-scrollback-in-terminal-iterm2

command line — Use terminal scrollbar with tmux — Super User — //superuser.com/questions/310251/use-terminal-scrollbar-with-tmux