$ tmux — corso in 10 lezioni
Lezione 04 di 10

Una sessione per progetto

Finestre e pannelli organizzano un lavoro. Le sessioni organizzano la giornata: ognuna è un contesto completo che puoi lasciare in sospeso e riprendere identico, senza ricostruire nulla.

Teoria

Il contesto, non il file

L'errore comune è tenere una sessione sola con venti finestre dentro. Funziona finché i lavori sono uno; appena diventano tre — il sito del cliente, il server di posta da sistemare, la cosa personale — l'elenco delle finestre diventa illeggibile e passi il tempo a cercare.

Una sessione per progetto risolve il problema alla radice, perché ogni sessione ha il suo elenco di finestre e la sua numerazione. Passi da un contesto all'altro con un tasto e ritrovi tutto come l'avevi lasciato: editor aperto sullo stesso file, server acceso, log che scorrono.

ComandoEffetto
tmux new -s nomecrea una sessione
tmux new -s nome -c ~/progetti/sitola crea partendo da quella cartella
tmux lselenca tutte le sessioni del server
tmux a -t nomesi attacca · basta un prefisso univoco del nome
tmux asenza nome, si attacca all'ultima usata
tmux kill-session -t nomela chiude
tmux kill-serverchiude tutto: server, sessioni, processi
tmux rename-session -t vecchio nuovorinomina

Passare da una all'altra senza uscire

TastiEffetto
prefix selenco interattivo delle sessioni, con le finestre in albero e l'anteprima
prefix ( · )sessione precedente / successiva
prefix $rinomina la sessione corrente
prefix wcome s, ma parte espanso sulle finestre
prefix Dscegli quale client staccare, se in più ne sei attaccati
prefix s è la schermata da imparare davvero. Dentro si naviga con le frecce o j k, Invio sceglie, x chiude la voce selezionata, $ la rinomina, e si può scrivere per filtrare. È un pannello di controllo completo, non solo un menu.
Pratica

Una giornata con tre sessioni

al mattino
$ tmux new -s sito -c ~/progetti/sito-cliente
# dentro: prefix c per l'editor, prefix c per il server, prefix c per git

prefix d

$ tmux new -s posta -c /etc/postfix
prefix d

$ tmux ls
posta: 1 windows (created Sat Sep 12 09:40:11 2026)
sito: 3 windows (created Sat Sep 12 09:12:55 2026)
posta 1:postfix* 09:41 12-set

Da qui in poi non si esce più: prefix s, scegli, sei nell'altro contesto. Il nome a sinistra nella status bar ti dice sempre in quale mondo ti trovi — che è esattamente l'informazione che serve prima di lanciare un comando distruttivo.

Sessioni che condividono le finestre

Un caso meno noto ma utilissimo: due sessioni possono guardare le stesse finestre. Serve quando lo stesso lavoro va visto da due schermi di dimensioni diverse, o durante una sessione di lavoro condivisa.

sessioni collegate
# una seconda sessione agganciata al gruppo della prima
$ tmux new-session -t sito -s sito-piccolo

# stesse finestre, ma ognuna può guardarne una diversa
# e le dimensioni non si vincolano a vicenda
Il problema dei due schermi. Se due client sono attaccati alla stessa sessione, tmux rimpicciolisce tutto alla misura del più piccolo, e compare l'antipatica cornice di trattini. Il comando qui sopra è la soluzione pulita; l'alternativa rapida è tmux a -d -t sito, dove -d stacca gli altri client mentre ti attacchi.
Trucco

Un selettore di progetti in tre righe di shell

Il gesto «apri il progetto X» merita di essere un comando solo. Questa funzione elenca le cartelle dei tuoi progetti, ti fa scegliere con fzf, e apre o riattacca la sessione corrispondente.

nel .bashrc o .zshrc
tp() {
  local dir nome
  dir=$(find ~/progetti ~/lavoro -mindepth 1 -maxdepth 1 -type d | fzf) || return
  nome=$(basename "$dir" | tr . _)          # i punti nei nomi danno noia
  tmux new -A -s "$nome" -c "$dir"
}

tr . _ non è pignoleria: tmux usa il punto per separare finestra e pannello negli indirizzi (lezione 7), quindi un nome come sito.it crea confusione. Stessa cosa per i due punti.

La versione che funziona anche da dentro tmux

Se sei già dentro una sessione, tmux new si rifiuta di annidarsi. La risposta giusta non è uscire, è cambiare client:

funzione completa
tp() {
  local dir nome
  dir=$(find ~/progetti -mindepth 1 -maxdepth 1 -type d | fzf) || return
  nome=$(basename "$dir" | tr . _)

  tmux has-session -t "=$nome" 2>/dev/null \
    || tmux new-session -ds "$nome" -c "$dir"

  if [ -z "$TMUX" ]; then
    tmux attach -t "=$nome"          # da fuori: attacca
  else
    tmux switch-client -t "=$nome"   # da dentro: cambia
  fi
}
Il segno = davanti al nome dice a tmux di pretendere la corrispondenza esatta invece del prefisso. Senza, has-session -t sito trova anche sito-vecchio e la funzione ti porta nella sessione sbagliata. È il genere di dettaglio che si scopre solo dopo averci perso venti minuti.