Il .tmux.conf
tmux appena installato è usabile ma scomodo in tre o quattro punti precisi. Una cinquantina di righe li sistemano tutti — e sapere cosa stai impostando conta più che copiare la configurazione di qualcun altro.
Dove sta il file, e chi lo legge
| Percorso | Quando viene letto |
|---|---|
| ~/.tmux.conf | il posto classico, funziona su tutte le versioni |
| ~/.config/tmux/tmux.conf | dalla 3.1 in poi, se preferisci tenere pulita la home |
| /etc/tmux.conf | configurazione di sistema, letta prima di quella personale |
Il file viene letto una volta sola, all'avvio del server. Questo spiega il dubbio più frequente dei primi giorni: hai modificato il file, hai aperto una finestra nuova, e niente è cambiato. La finestra nuova sta nel vecchio server. Serve ricaricare.
prefix : source-file ~/.tmux.conf # dalla shell, verso un server già acceso: $ tmux source-file ~/.tmux.conf # la scorciatoia da mettere nel file stesso: bind r source-file ~/.tmux.conf \; display "ricaricato"
source-file riesegue le
righe del file, ma non toglie le impostazioni che hai cancellato dal file nel
frattempo: quelle restano in memoria fino al riavvio del server. Quando il
comportamento non torna, tmux kill-server è l'unica prova
definitiva — dopo esserti assicurato di non avere lavoro in sospeso dentro.
La grammatica di una riga di configurazione
| Forma | Significato |
|---|---|
| set -g opzione valore | opzione di sessione, valida globalmente |
| setw -g opzione valore | opzione di finestra (set-window-option) |
| set -ga opzione valore | aggiunge in coda invece di sostituire |
| set -s opzione valore | opzione del server, vale per tutto |
| bind tasto comando | assegna il tasto, dopo il prefix |
| bind -n tasto comando | assegna il tasto senza prefix — usalo con parsimonia |
| bind -r tasto comando | ripetibile entro repeat-time |
| unbind tasto | libera un tasto assegnato di fabbrica |
Il -g vuol dire «globale» e serve praticamente sempre: senza,
l'impostazione vale solo per la sessione corrente e sparisce alla prossima. Se una
riga che sembra giusta non ha effetto sulle sessioni nuove, controlla di non
averlo dimenticato.
Una configurazione di partenza, commentata
# ---------- tasti ---------- unbind C-b set -g prefix C-a bind C-a send-prefix bind r source-file ~/.tmux.conf \; display "ricaricato" # ---------- numerazione ---------- set -g base-index 1 setw -g pane-base-index 1 set -g renumber-windows on # ---------- reattività ---------- set -sg escape-time 10 # il ritardo di Esc: vitale per Vim set -g repeat-time 600 set -g focus-events on # l'editor si accorge del cambio pannello set -g display-time 2000 # i messaggi restano due secondi # ---------- cronologia e mouse ---------- set -g history-limit 50000 set -g mouse on # ---------- nomi ---------- set -g allow-rename off setw -g automatic-rename off set -g set-titles on set -g set-titles-string "#S · #W" # ---------- divisioni (lezione 3) ---------- bind | split-window -h -c "#{pane_current_path}" bind - split-window -v -c "#{pane_current_path}" bind c new-window -c "#{pane_current_path}" unbind '"' unbind % # ---------- copia alla Vim (lezione 5) ---------- setw -g mode-keys vi bind -T copy-mode-vi v send -X begin-selection bind -T copy-mode-vi y send -X copy-pipe-and-cancel 'xclip -sel clip -i' # ---------- colori ---------- set -g default-terminal "tmux-256color" set -ga terminal-overrides ",*256col*:Tc"
Le due righe che risolvono più problemi di tutte
escape-time è il ritardo con cui tmux decide se un Esc
ricevuto è un tasto a sé o l'inizio di una sequenza. Di fabbrica sono 500
millisecondi, ereditati da un'epoca di terminali lenti: dentro Vim significa mezzo
secondo di attesa ogni volta che esci dal modo INSERT. Portarlo a 10 è il singolo
cambiamento più percepibile di tutto il file.
default-terminal e la riga successiva riguardano i colori. tmux
dichiara ai programmi che gira un tipo di terminale, e se dichiara qualcosa di
povero i temi dell'editor si sgranano. La seconda riga abilita i colori a 24 bit —
true color — quando il terminale sottostante li supporta.
tmux-256color dà errore («missing or unsuitable
terminal»), la definizione manca dal database locale: succede spesso su macOS.
Ripiega su set -g default-terminal "screen-256color", che funziona
ovunque al prezzo di qualche capacità in meno.
Verificare invece di indovinare
$ tmux show -g # tutte le opzioni di sessione $ tmux show -g escape-time # una sola $ tmux show -gw # le opzioni di finestra $ tmux list-keys | grep split # com'è assegnato davvero un tasto $ tmux list-commands # tutti i comandi disponibili $ tmux info # stato del server, client, terminale
Configurazioni condizionali: un file solo per tutte le macchine
Chi lavora su più computer finisce per avere tre .tmux.conf
leggermente diversi, e a divergere. if-shell permette di tenerne uno,
con le poche righe che cambiano dentro una condizione.
# appunti: comando diverso su macOS e Linux if-shell "uname | grep -q Darwin" \ "bind -T copy-mode-vi y send -X copy-pipe-and-cancel 'pbcopy'" \ "bind -T copy-mode-vi y send -X copy-pipe-and-cancel 'xclip -sel clip -i'" # opzione introdotta nella 3.2: attivala solo se c'è if-shell -b '[ "$(echo "$(tmux -V | cut -d" " -f2) >= 3.2" | bc)" = 1 ]' \ "set -g popup-border-style fg=colour214" # impostazioni locali di questa macchina, se il file esiste if-shell "[ -f ~/.tmux.conf.local ]" "source-file ~/.tmux.conf.local"
L'ultima riga è quella che userai di più: il file condiviso sta in git insieme
agli altri dotfile, e ~/.tmux.conf.local resta fuori dal
versionamento con dentro le cose specifiche — il nome del server nella status bar,
un colore diverso per distinguere la produzione.
set -g status-style bg=colour124. La status bar diventa
rossa, e non lanci mai più un comando pensando di essere sulla macchina di prova.
È il costo di una riga contro il tipo di errore che rovina un pomeriggio.
Quando qualcosa non funziona
| Comando | A cosa serve |
|---|---|
| tmux -f /dev/null new | avvia ignorando ogni configurazione: il test decisivo |
| tmux -f ~/prova.conf new -s test | prova un file alternativo senza toccare il tuo |
| tmux list-keys -T copy-mode-vi | i tasti di una singola tabella |
| tmux kill-server | riparte da zero: l'unico modo di togliere davvero un'impostazione |