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.
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.
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.
| Tasti | Effetto |
|---|---|
| prefix [ | entra in modo copia |
| prefix ] | incolla l'ultimo buffer di tmux |
| prefix PgSu | entra in modo copia già scorrendo indietro |
| q | esce |
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 · frecce | movimento carattere e riga |
| w b | parola avanti / indietro |
| 0 $ ^ | inizio riga · fine riga · primo carattere non vuoto |
| Ctrl-u · Ctrl-d | mezza pagina su / giù |
| g · G | cima / fondo della cronologia |
| /testo · ?testo | cerca in avanti / all'indietro |
| n · N | occorrenza successiva / precedente |
| Spazio | inizia la selezione |
| v | con la configurazione consigliata: inizia la selezione (come in Vim) |
| Invio | copia la selezione ed esce |
?error, invece di
rilanciare il comando sperando che si ripeta.
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.
| Sistema | Programma da installare |
|---|---|
| Linux, X11 | xclip oppure xsel |
| Linux, Wayland | wl-clipboard (comando wl-copy) |
| macOS | pbcopy, già presente |
| WSL | clip.exe, già presente |
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.
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
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.
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.
$ 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
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 -"'ssh server cat /tmp/file | xclip -sel clip. Meno elegante di OSC 52,
ma funziona anche attraverso tre salti e una VPN.