Tmux (Terminal Multiplexer) è uno strumento che permette di gestire diverse sessioni di terminale all’interno di una singola finestra. Il termine “multiplexer” deriva dall’elettronica: così come un multiplexer combina più segnali in uno solo, Tmux combina più terminali virtuali in un’unica interfaccia.

In pratica, Tmux consente tra le varie cose di dividere lo schermo in più riquadri (panes), ognuno con un terminale indipendente, oppure creare sessioni persistenti che sopravvivono alla chiusura del terminale (o disconnessione SSH). È uno strumento non molto intuitivo all’inizio, ma una volta acquisita familiarità diventa il tuo migliore amico, in quanto ti permette di ridurre la complessità delle finestre aperte ed ottimizzare il processo lavorativo.

La configurazione seguente è ottimizzata per:

  • Integrazione con Neovim: escape time ridotto a 0 (elimina il ritardo quando si esce dalla modalità inserimento) e supporto colori 256/true color per visualizzare correttamente i temi
  • Navigazione Vi-style: stesse scorciatoie di Vim, così non devi imparare nuovi gesti
  • Persistenza delle sessioni: salvataggio e ripristino automatico delle sessioni abilitato di default
  • Supporto mouse: scroll, ridimensionamento panes e selezione con il mouse (non abilitati di default, ma fondamentali per l’usabilità)

Configurazione NixOS

L’installazione di Tmux può essere fatta semplicemente abilitando il servizio, ma sarebbe un’esperienza “plain-vanilla” con usabilità molto limitata. Nello script seguente ho quindi incluso non solo l’installazione di alcuni plugin che rendono il programma completo, ma anche la configurazione di opzioni per utilizzare il mouse e migliorare l’usabilità dei comandi da tastiera (prego, non c’è di che).

nix
{ pkgs, ... }:

{
  # Installazione di Tmux e dei Relativi Plugin
  environment.systemPackages = with pkgs; [
    tmux
    tmuxPlugins.sensible   # Impostazioni di default migliorate (scorciatoie, UTF-8...)
    tmuxPlugins.yank       # Copia del testo nella clipboard e non nel buffer di TMUX
    tmuxPlugins.resurrect  # Salva/ripristina sessioni manualmente
    tmuxPlugins.continuum  # Automatizza Resurrect salvando le sessioni ogni 15 minuti
  ];

  # Configurazione di TMUX 
  programs.tmux = {
    enable = true;

    # Terminale corretto per i colori
    terminal = "tmux-256color";

    # Configurazione del Prefisso con Ctrl+a e non Ctrl+b 
    shortcut = "a";

    # Inizia a contare le finestre da 1
    baseIndex = 1;

    # History più lunga
    historyLimit = 10000;

    # Tempo di escape ridotto (utile per vim/neovim)
    escapeTime = 0;

    # Modalità vi per copy-mode
    keyMode = "vi";

    extraConfig = ''

      # Permette a TMUX di utilizzare i colori coretti
      set-option -sa terminal-overrides ",xterm*:RGB"

      # Abilita mouse (scroll, resize panes, select)
      set -g mouse on

      # Split delle Finestre più intuitive
      bind | split-window -h -c "#{pane_current_path}"
      bind - split-window -v -c "#{pane_current_path}"

      # Navigazione tra panes con Alt+frecce (senza prefix)
      bind -n M-Left select-pane -L
      bind -n M-Right select-pane -R
      bind -n M-Up select-pane -U
      bind -n M-Down select-pane -D

      # Reload delle configurazioni con prefix+r
      bind r source-file /etc/tmux.conf \; display "Config ricaricata!"

      # Nuove finestre nella directory corrente
      bind c new-window -c "#{pane_current_path}"

      # Status bar minimale
      set -g status-style 'bg=#1e1e2e fg=#cdd6f4'
      set -g status-left '[#S] '
      set -g status-right '%H:%M'

      # Carica i plugin
      run-shell ${pkgs.tmuxPlugins.sensible}/share/tmux-plugins/sensible/sensible.tmux
      run-shell ${pkgs.tmuxPlugins.yank}/share/tmux-plugins/yank/yank.tmux
      run-shell ${pkgs.tmuxPlugins.resurrect}/share/tmux-plugins/resurrect/resurrect.tmux
      run-shell ${pkgs.tmuxPlugins.continuum}/share/tmux-plugins/continuum/continuum.tmux
    '';
  };
}

Una volta copiato il codice all’interno del sistema, è possibile installarlo con il comando sudo nixos-rebuild switch. Terminata l’installazione, si può avviare Tmux eseguendo tmux da terminale.

Utilizzo di Tmux

Utilizzare Tmux può presentare delle sfide all’inizio, dato che come prima cosa è necessario andar ea comprendere bene la sua logica, infatti Tmux organizza il lavoro in tre livelli gerarchici:

  • Sessione: È il contenitore principale. Ogni sessione ha un nome (es. “sviluppo”, “server”) e può contenere diverse finestre. Le sessioni persistono anche quando ti disconnetti dal terminale, permettendoti di riprendere il lavoro esattamente dove lo avevi lasciato (ndr. se spegni o riavvii il PC/Server, la sessione sparisce).
  • Finestra: Equivale a una “tab” del browser. Ogni finestra occupa l’intero schermo del terminale e può contenere uno o più panes. Nella “status bar”" in basso vedi l’elenco delle finestre numerate.
  • Pane (Riquadro): È una suddivisione dello schermo all’interno di una finestra. Questa può essere divisa verticalmente o orizzontalmente per avere più terminali visibili contemporaneamente. Ad esempio sarebbe possibile avere nvim a sinistra e lazydocker a destra per vedere i logs.
graph TD S["🖥️ Sessione: sviluppo"] S --> F1["📑 Finestra 1: editor"] S --> F2["📑 Finestra 2: server"] S --> F3["📑 Finestra 3: git"] F1 --> P1["⬛ Pane: neovim"] F1 --> P2["⬛ Pane: lazydocker"] F2 --> P3["⬛ Pane: npm run dev"] F3 --> P4["⬛ Pane: lazygit"]

Gestione delle Sessioni

Il concetto fondamentale da capire subito è che è possibile assegnare un nome a una sessione, in modo da poterla richiamare successivamente. In questa tabella è possibile andare ad utilizzare i seguenti comandi (aprendo un terminale nella sessione) in modo da poter andare a gestire la sessione.

Comando Descrizione
tmux new -s nomesessione Crea una nuova sessione con nome
tmux ls Elenca tutte le sessioni attive
tmux attach -t nomesessione Si collega a una sessione esistente
tmux detach Si scollega dalla sessione corrente (resta attiva in background)
tmux rename-session nuovonome Rinomina la sessione corrente (da dentro la sessione)
tmux kill-session -t nomesessione Termina una sessione

Grazie al plugin resurrect e continuum, è possibile salvare e ripristinare le sessioni anche dopo un riavvio del sistema. Le sessioni vengono salvate automaticamente ogni 15 minuti, ma è possibile forzare il salvataggio o il ripristino manualmente:

Bind Tasto Azione
Ctrl+a Ctrl+s Salva la sessione
Ctrl+a Ctrl+r Ripristina la sessione

Mentre le scorciatoie sotto permettono di gestire rapidamente la sessione corrente senza uscire da Tmux:

Bind Tasto Azione
Ctrl+a r Ricarica la configurazione
Ctrl+a d Si scollega dalla sessione
Ctrl+a ? Mostra tutte le scorciatoie

Gestione delle Finestre

Come detto prima le finestre in Tmux funzionano come le tab di un browser, quindi ogni finestra occupa l’intero schermo e può essere dedicata a un’attività specifica. Nella status bar in fondo è possibile vedere l’elenco delle finestre numerate, con un asterisco (*) che indica quella attiva. Questi codici permettono di poter andare a creare nuove finestre, gestirle o navigarle.

Bind Tasto Azione
Ctrl+a c Crea una nuova finestra (nella directory corrente)
Ctrl+a n Finestra successiva
Ctrl+a p Finestra precedente
Ctrl+a 1-9 Passa alla finestra per numero
Ctrl+a , Rinomina la finestra corrente
Ctrl+a & Chiude la finestra corrente

Gestione dei Riquadri (Panes)

In ultimo i Riquadri (panes) permettono di dividere una finestra in più riquadri (cosa estremamente utile, sopratutto per i fissati di Hyprland), ognuno con un terminale indipendente. Questo è particolarmente utile quando vuoi tenere sott’occhio più processi contemporaneamente, come ad esempio l’editor di codice e i log dell’applicazione, oppure se devi lavorare su pià cartelle collegate tra di loro. La navigazione tra i panes può essere fatta con il mouse (se abilitato) oppure con le scorciatoie da tastiera che abbiamo configurato nel file di configurazione iniziale.

Bind Tasto Azione
Ctrl+a | Divide verticalmente
Ctrl+a - Divide orizzontalmente
- Alt+← Sposta al pane sinistro
- Alt+→ Sposta al pane destro
- Alt+↑ Sposta al pane superiore
- Alt+↓ Sposta al pane inferiore
Ctrl+a x Chiude il pane corrente
Ctrl+a z Zoom pane (schermo intero)
Ctrl+a { Scambia pane a sinistra
Ctrl+a } Scambia pane a destra