$ tmux — corso in 10 lezioni
Lezione 05 di 10

Scorrere, cercare, copiare

Dentro tmux la rotella del mouse e la selezione del terminale non funzionano più come prima. Non è un difetto: tmux tiene lui la cronologia di ogni pannello, e in cambio ti dà una ricerca e una copia che il terminale non aveva.

Teoria

Il modo copia

Ogni pannello ha una scrollback: le righe uscite dallo schermo, tenute in memoria da tmux. Per leggerle bisogna entrare in un modo apposito, che sospende l'input verso il programma e trasforma il pannello in un documento da navigare — esattamente come il modo NORMAL di Vim.

COPY 1:codice* 2:git [12/3480]

Quando sei in modo copia l'indicatore in alto a destra del pannello mostra la posizione nella cronologia. Si esce con q — o con Invio dopo aver copiato qualcosa.

TastiEffetto
prefix [entra in modo copia
prefix ]incolla l'ultimo buffer di tmux
prefix PgSuentra in modo copia già scorrendo indietro
qesce

Muoversi, con i tasti di Vim

tmux ha due dialetti di scorciatoie per questo modo: emacs (predefinito) e vi. Se vieni dall'editor, attiva il secondo e non ci pensi più: setw -g mode-keys vi.

Tasti (mode-keys vi)Effetto
h j k l · freccemovimento carattere e riga
w bparola avanti / indietro
0 $ ^inizio riga · fine riga · primo carattere non vuoto
Ctrl-u · Ctrl-dmezza pagina su / giù
g · Gcima / fondo della cronologia
/testo · ?testocerca in avanti / all'indietro
n · Noccorrenza successiva / precedente
Spazioinizia la selezione
vcon la configurazione consigliata: inizia la selezione (come in Vim)
Inviocopia la selezione ed esce
La ricerca è il motivo per cui vale la pena entrarci. Un errore scorso via cinque minuti fa si ritrova con prefix [ e poi ?error, invece di rilanciare il comando sperando che si ripeta.
Pratica

Portare il testo fuori da tmux

Quello che copi in modo copia finisce nei buffer di tmux, che sono cosa diversa dagli appunti del sistema operativo. Per usarlo altrove — nel browser, in una mail — serve un ponte, e il ponte cambia a seconda del sistema.

SistemaProgramma da installare
Linux, X11xclip oppure xsel
Linux, Waylandwl-clipboard (comando wl-copy)
macOSpbcopy, già presente
WSLclip.exe, già presente
~/.tmux.conf — selezione alla Vim che copia nel sistema
setw -g mode-keys vi

bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi C-v send -X rectangle-toggle
bind -T copy-mode-vi y send -X copy-pipe-and-cancel 'xclip -sel clip -i'
bind -T copy-mode-vi Escape send -X cancel

# su macOS, al posto di xclip:
# bind -T copy-mode-vi y send -X copy-pipe-and-cancel 'pbcopy'

# cronologia più lunga di quella di fabbrica (2000 righe)
set -g history-limit 50000

Con queste righe il flusso diventa identico a quello dell'editor: prefix [ per entrare, / per trovare il punto, v per selezionare, y per copiare. Il testo è negli appunti del sistema e il modo copia si chiude da solo.

Dentro SSH gli appunti stanno dall'altra parte. xclip sul server copia negli appunti del server, che non esistono o non vedi. Le due vie d'uscita sono il supporto OSC 52 — dove il terminale locale riceve il testo attraverso la connessione, si attiva con set -g set-clipboard on e richiede un emulatore compatibile — oppure il trucco qui sotto, che passa dal file.

Il mouse, se lo vuoi

una riga, quattro comportamenti
set -g mouse on

# da quel momento:
#   rotella          → entra in modo copia e scorre
#   clic su pannello → lo attiva
#   clic sul bordo   → trascina per ridimensionare
#   clic sul nome    → cambia finestra

Il costo è che la selezione col mouse non è più quella del terminale: trascinando selezioni dentro tmux, quindi i numeri di riga dei pannelli affiancati non finiscono più nella copia — che è un vantaggio — ma per usare la selezione nativa del terminale devi tenere premuto Shift.

Trucco

capture-pane: tutto l'output in un file

A volte non vuoi copiare un pezzo: vuoi tutto quello che è passato in un pannello — per allegarlo a una segnalazione, per passarlo a grep, per rileggerlo con calma nell'editor. capture-pane lo scarica senza selezionare niente.

dalla shell, o dalla riga di comando di tmux
$ tmux capture-pane -p -S - > sessione.txt
#                   │  │
#                   │  └── -S -  : parti dall'inizio della cronologia
#                   └───── -p    : stampa su standard output

$ tmux capture-pane -p -S -1000 | grep -i error
$ tmux capture-pane -pt sito:2.1 -S - > log-del-pannello.txt

L'ultimo esempio anticipa la lezione 7: sito:2.1 è l'indirizzo del pannello 1 della finestra 2 nella sessione «sito». Puoi catturare l'output di un pannello mentre guardi da un altro, che è comodissimo quando un processo lungo sta scrivendo cose che vuoi analizzare senza interromperlo.

Una scorciatoia per aprirlo direttamente in Vim

~/.tmux.conf
bind C-s run-shell 'tmux capture-pane -p -S - > /tmp/tmux-$(date +%s).txt' \; \
         display "cronologia salvata in /tmp"

# oppure: apri l'intera cronologia in vim, in un pannello nuovo
bind e capture-pane -p -S - \; \
       run-shell 'tmux split-window -h "tmux show-buffer | vim -"'
Serve anche per il ponte con gli appunti sopra SSH. Catturi il pannello in un file sul server, e da locale ssh server cat /tmp/file | xclip -sel clip. Meno elegante di OSC 52, ma funziona anche attraverso tre salti e una VPN.