$ tmux — corso in 10 lezioni
Lezione 06 di 10

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.

Teoria

Dove sta il file, e chi lo legge

PercorsoQuando viene letto
~/.tmux.confil posto classico, funziona su tutte le versioni
~/.config/tmux/tmux.confdalla 3.1 in poi, se preferisci tenere pulita la home
/etc/tmux.confconfigurazione 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.

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"
Ricaricare non annulla. 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

FormaSignificato
set -g opzione valoreopzione di sessione, valida globalmente
setw -g opzione valoreopzione di finestra (set-window-option)
set -ga opzione valoreaggiunge in coda invece di sostituire
set -s opzione valoreopzione del server, vale per tutto
bind tasto comandoassegna il tasto, dopo il prefix
bind -n tasto comandoassegna il tasto senza prefix — usalo con parsimonia
bind -r tasto comandoripetibile entro repeat-time
unbind tastolibera 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.

Pratica

Una configurazione di partenza, commentata

~/.tmux.conf
# ---------- 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.

Se 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

interrogare la configurazione attiva
$ 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
Trucco

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.

differenze per sistema e per versione
# 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.

Un uso pratico e salvavita: sui server di produzione metti nel file locale 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

ComandoA cosa serve
tmux -f /dev/null newavvia ignorando ogni configurazione: il test decisivo
tmux -f ~/prova.conf new -s testprova un file alternativo senza toccare il tuo
tmux list-keys -T copy-mode-vii tasti di una singola tabella
tmux kill-serverriparte da zero: l'unico modo di togliere davvero un'impostazione