~/il-codice-di-marco

Tmux: Configurazione Minimale e Produttiva

Also available in: ๐Ÿ‡ฌ๐Ÿ‡ง English | ๐Ÿ‡ฎ๐Ÿ‡น Italiano

Tre finestre.

Nessun pannello.

Zero plugin.

Una per lโ€™editor.

Una per la compilazione continua.

Una per lโ€™esecuzione e i test.

Questo รจ il mio setup quotidiano con tmux.

In questo articolo ti mostro come costruire una configurazione minimale, portabile e produttiva partendo da zero.

Introduzione

Cosโ€™รจ Tmux?

tmux รจ un multiplexer di terminale che ti permette di gestire piรน sessioni, finestre e pannelli in unโ€™unica shell, anche da remoto, senza perdere nulla quando ti disconnetti

Immagina di poter:

  • Dividere una singola finestra del terminale in piรน pannelli
  • Gestire piรน progetti contemporaneamente
  • Disconnetterti dal server senza perdere il lavoro in corso
  • Velocizzare il tuo workflow con keybinding personalizzati

Perchรฉ una Configurazione Minimale?

In questa guida adottiamo un approccio plugin-free per diversi motivi:

Velocitร : Nessun overhead di caricamento plugin
Portabilitร : Funziona su qualsiasi sistema senza dipendenze
Manutenibilitร : Facile da comprendere
Apprendimento: Capisci esattamente cosa fa ogni riga

Prerequisiti e Installazione

Installazione Tmux

Ubuntu/Debian:

sudo apt update
sudo apt install tmux

macOS (con Homebrew):

brew install tmux

Verifica Installazione

tmux -V
# Output atteso: tmux 3.5a o superiore

Alcuni concetti fondamentali

Prima di iniziare, รจ fondamentale capire la gerarchia di tmux:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  SESSIONE (session): "progetto-web"             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚  FINESTRA 1 (window): "editor"            โ”‚  โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚  โ”‚
โ”‚  โ”‚  โ”‚ PANNELLO 1  โ”‚   PANNELLO 2         โ”‚   โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   (vim)     โ”‚   (terminale)        โ”‚   โ”‚  โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚  FINESTRA 2 (window): "server"            โ”‚  โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚  โ”‚
โ”‚  โ”‚  โ”‚          PANNELLO 1                  โ”‚ โ”‚  โ”‚
โ”‚  โ”‚  โ”‚          (server logs)               โ”‚ โ”‚  โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Una Sessione in tmux รจ un contesto di lavoro, potrebbe ad esempio essere un intero progetto. Potremmo cioรจ avere una sessione per il nostro programma a cui stiamo lavorando, una usata per aggiornare il nostro blog o magari unโ€™altra dove lavoriamo alla configurazione del nostro NeoVim.

Una finestra invece รจ, allโ€™interno di una sessione, uno schermo virtuale, come una scheda del nostro browser preferito, un tab per intenderci.

Un pannello รจ una divisione allโ€™interno di una finestra

TermineDescrizioneAnalogia
SessionContesto di lavoro completoUn progetto intero
WindowSchermo virtuale allโ€™interno di una sessioneUna scheda del browser
PaneDivisione di una windowSplit screen

Il Prefix Key

Il prefix รจ la โ€œchiave magicaโ€ che attiva i comandi tmux. Di default รจ Ctrl+b, ma nella nostra configurazione lo cambieremo in Ctrl+Space per ergonomia.

Come funziona:

  1. Premi Ctrl+Space (il prefix)
  2. Rilascia
  3. Premi il comando (es. c per new window)

โš ๏ธ Nota: in alcuni terminali o layout di tastiera Ctrl+Space potrebbe non funzionare correttamente. In tal caso Ctrl+a รจ unโ€™ottima alternativa con supporto universale.

Setup Iniziale

Per prima cosa dobbiamo creare il nostro file di configurazione:

touch ~/.tmux.conf

quindi, usando il nostro editor preferito (inutile credo dirvi quale sia il mio ๐Ÿ˜€), andiamo ad aggiungere passo-passo delle configurazioni che dettaglierรฒ riga per riga

Impostazioni Generali

Cambio del Prefix Key

unbind C-b
set -g prefix C-Space
bind C-Space send-prefix

Cosa fa:

  • unbind C-b: Rimuove il binding di default Ctrl+b
  • set -g prefix C-Space: Imposta Ctrl+Space come nuovo prefix
  • bind C-Space send-prefix: Permette di inviare Ctrl+Space allโ€™applicazione sottostante (premendolo due volte)

Perchรฉ:

  • Ctrl+Space รจ piรน ergonomico: si preme con il pollice invece del mignolo

  • Non interferisce con comandi comuni come Ctrl+b in Vim (page up)

  • รˆ una combinazione meno usata rispetto a Ctrl+b

    Alcuni preferiscono Ctrl+a, io preferisco lo spazio, ma รจ solo questione di trovare la combinazione piรน pratica per noi e che non ci crei problemi coi software che solitamente utilizziamo nel nostro workflow da terminale.

Uso pratico:

# Creare una nuova finestra:
Ctrl+Space, poi c

# Se un'applicazione ha bisogno di Ctrl+Space:
Ctrl+Space, Ctrl+Space

Ricarica Configurazione

bind r source-file ~/.tmux.conf \; display "Configurazione ricaricata!"

Cosa fa: Crea un keybinding per ricaricare il file di configurazione senza uscire da tmux

Perchรฉ: Quando modifichi ~/.tmux.conf, invece di chiudere e riaprire tmux, puoi ricaricare al volo le modifiche

Uso pratico:

# 1. Modifica ~/.tmux.conf con il tuo editor
vim ~/.tmux.conf

# 2. Salva le modifiche

# 3. In tmux, premi:
Ctrl+Space, poi r

# Vedrai: "Configurazione ricaricata!"

Supporto Mouse

set -g mouse on

Cosa fa: Abilita completamente il supporto del mouse in tmux

Funzionalitร  abilitate:

  • Clicca su un pannello per attivarlo
  • Trascina i bordi tra pannelli per ridimensionare
  • Clicca su una finestra nella status bar per selezionarla
  • Scroll con la rotella per navigare la history
  • Seleziona testo con il mouse e copia

Nota: Con il mouse attivo, per selezionare testo e copiarlo nella clipboard di sistema, potrebbe essere necessario tenere premuto Shift mentre selezioni

Uso pratico:

# Scenario: hai 4 pannelli aperti
# Invece di usare Ctrl+hjkl per navigare, 
# semplicemente clicca sul pannello desiderato

History Limit

set -g history-limit 20000

Cosa fa: Imposta a 20.000 il numero di righe di output memorizzate per ogni pannello

Perchรฉ:

  • Default: solo 2.000 righe
  • 20.000: permette di risalire a output molto precedenti
  • Utile per analizzare log lunghi o ritrovare output passati

Uso pratico:

# Dopo aver eseguito comandi con molto output:
Ctrl+Space, poi [        # Entra in copy mode
# Ora puoi scorrere all'indietro per 20.000 righe
# Usa q per uscire

๐Ÿ“ Consumo memoria: 20.000 righe sono circa 2-3 MB per pannello (dipende dalla lunghezza delle righe)


Numerazione da 1

set -g base-index 1
setw -g pane-base-index 1

Cosa fa: Fa iniziare la numerazione di finestre e pannelli da 1 invece che da 0 come da impostazione predefinita di tmux

Perchรฉ:

Tastiera:  [1] [2] [3] [4] [5] [6] [7] [8] [9] [0]
Con 0:      ^                               prima finestra (scomodo!)
Con 1:      ^                               prima finestra (comodo!)

I tasti 1-9 sono piรน facili da raggiungere rispetto a dover arrivare a 0 per la โ€œprimaโ€ finestra

Uso pratico:

Ctrl+Space, poi 1    # Vai alla PRIMA finestra (non alla seconda!)

Rinumerazione Automatica

set -g renumber-windows on

Cosa fa: Quando chiudi una finestra, le successive vengono rinumerate per mantenere la sequenza

Esempio:

Situazione iniziale:  [1:vim] [2:server] [3:logs] [4:test]

Chiudi finestra 2 (server)

โŒ SENZA renumber:    [1:vim] [3:logs] [4:test]     # Numerazione con buchi!
โœ… CON renumber:      [1:vim] [2:logs] [3:test]     # Sempre sequenziale!

Vantaggio: Non devi โ€œsaltareโ€ numeri quando switchi tra finestre, mantieni sempre una sequenza 1-2-3-4


True Color Support

set -ga terminal-overrides ",xterm-256color:Tc"

Cosa fa: Abilita il supporto per true color (16 milioni di colori) invece dei soli 256 colori

Perchรฉ:

  • Temi moderni di Vim/Neovim richiedono true color
  • Gradienti e sfumature nei colori
  • Sintassi highlighting piรน ricco

Dettagli tecnici:

  • -ga: append (aggiunge invece di sovrascrivere)
  • Tc: capability per true color
  • xterm-256color: terminal type

Prerequisito: Il tuo terminale deve supportare true color (iTerm2, Alacritty, Kitty, terminali moderni)


Divisione Finestre

Split Orizzontale e Verticale

bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"

Cosa fa:

  • | (pipe): divide la finestra orizzontalmente (crea colonne)
  • - (trattino): divide la finestra verticalmente (crea righe)
  • -c "#{pane_current_path}": il nuovo pannello parte dalla stessa directory

Visualizzazione:

Split ORIZZONTALE (|):       Split VERTICALE (-):
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚          โ”‚          โ”‚      โ”‚                     โ”‚
โ”‚  Pane 1  โ”‚  Pane 2  โ”‚      โ”‚      Pane 1         โ”‚
โ”‚  (vim)   โ”‚ (shell)  โ”‚      โ”‚      (vim)          โ”‚
โ”‚          โ”‚          โ”‚      โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚      Pane 2         โ”‚
                             โ”‚     (shell)         โ”‚
                             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Uso pratico:

# Stai editando codice e vuoi un terminale a destra
Ctrl+Space, poi |

# Stai editando e vuoi vedere i log sotto
Ctrl+Space, poi -

Mnemonic:

  • | assomiglia a una linea verticale โ†’ split orizzontale
  • - assomiglia a una linea orizzontale โ†’ split verticale

Senza -c "#{pane_current_path}": Il nuovo pannello partirebbe dalla home directory, costringendoti a navigare alla directory corrente

๐Ÿ“ Di default tmux consente lo split usando % e ", questa configurazione non li sovrascrive, resteranno comunque utilizzabili


Nuova Finestra nella Directory Corrente

bind c new-window -c "#{pane_current_path}"

Cosa fa: Quando crei una nuova finestra con c, parte dalla stessa directory del pannello corrente

Esempio:

# Sei in: /home/user/progetti/app/src
Ctrl+Space, poi c
# La nuova finestra inizia in: /home/user/progetti/app/src
# (non in /home/user come farebbe di default)

Beneficio: Non devi fare cd ogni volta che apri una nuova finestra per lavorare sullo stesso progetto


bind -n C-h select-pane -L
bind -n C-l select-pane -R
bind -n C-k select-pane -U
bind -n C-j select-pane -D

Cosa fa: Naviga tra i pannelli usando Ctrl+hjkl senza premere il prefix

Layout Vim:

        k (su)
        โ†‘
h (sx) โ†+โ†’ l (dx)
        โ†“
        j (giรน)

Uso pratico:

# Hai 4 pannelli aperti
โ”Œโ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”
โ”‚  1  โ”‚  2  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  3  โ”‚  4  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”˜

# Sei nel pannello 1, vuoi andare a destra (2):
Ctrl+l    # Nessun prefix!

# Dal pannello 2, vuoi andare giรน (4):
Ctrl+j

โš ๏ธ Conflitto Potenziale:

Questi binding sovrascrivono alcuni comandi standard:

  • Ctrl+l: clear screen in bash/zsh
  • Ctrl+h: backspace in alcuni terminali

Se non vuoi avere conflitti:

# Versione con prefix (richiede Ctrl+Space prima)
bind h select-pane -L
bind l select-pane -R
bind k select-pane -U
bind j select-pane -D

Alternativa per clear: Se perdi Ctrl+l per clear, puoi:

  • Usare il comando clear o reset
  • Creare un alias: alias cls='clear'
  • Usare Ctrl+Space poi Ctrl+l (invia il comando allโ€™applicazione)

bind -n S-Left previous-window
bind -n S-Right next-window

Cosa fa:

  • Shift+Freccia Sinistra: vai alla finestra precedente
  • Shift+Freccia Destra: vai alla finestra successiva

Uso pratico:

# Hai 3 finestre: [1:vim] [2:server] [3:logs]
# Sei nella finestra 2 (server)

Shift+Freccia Sinistra   # Vai a [1:vim]
Shift+Freccia Destra     # Torni a [2:server]
Shift+Freccia Destra     # Vai a [3:logs]

Alternative built-in:

Ctrl+Space, poi n     # next window
Ctrl+Space, poi p     # previous window
Ctrl+Space, poi 1     # vai alla finestra 1
Ctrl+Space, poi 2     # vai alla finestra 2
# ... etc

Ridimensionamento Pannelli

bind -n M-Left resize-pane -L 3
bind -n M-Right resize-pane -R 3
bind -n M-Up resize-pane -U 3
bind -n M-Down resize-pane -D 3

Cosa fa: Ridimensiona il pannello corrente usando Alt+Frecce, 3 celle alla volta

Nota: M = Meta (tipicamente il tasto Alt o Option su Mac)

Uso pratico:

# Scenario: hai un editor a sinistra e un terminale a destra
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚            โ”‚      โ”‚
โ”‚   Editor   โ”‚ Term โ”‚
โ”‚            โ”‚      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”˜

# Vuoi dare piรน spazio all'editor:
Alt+Freccia Destra (piรน volte)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”
โ”‚                  โ”‚T โ”‚
โ”‚     Editor       โ”‚e โ”‚
โ”‚                  โ”‚r โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”˜

Personalizzazione: Se 3 celle sono troppe/poche, modifica il numero:

bind -n M-Left resize-pane -L 5   # 5 celle alla volta

Alternative con prefix (e repeat):

# Con -r (repeat) puoi tenere premuto il tasto
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

Sincronizzazione Pannelli

bind C-y set-window-option synchronize-panes\; display-message "Sync: #{?pane_synchronized,ON,OFF}"

Cosa fa: Attiva/disattiva la sincronizzazione dellโ€™input su tutti i pannelli della finestra corrente

Quando รจ utile:

  • Eseguire lo stesso comando su piรน server SSH contemporaneamente
  • Aggiornare contemporaneamente piรน server
  • Configurare simultaneamente piรน macchine

Uso pratico:

# Scenario: amministrazione multi-server 

# 1. Crea 3 pannelli con SSH a server diversi 
Ctrl+Space |         # Split 
ssh user@server1.com 
Ctrl+Space |         # Split ancora
ssh user@server2.com 
Ctrl+Space -         # Split verticale 
ssh user@server3.com 

# 2. Attiva sincronizzazione Ctrl+Space Ctrl+y 

# 3. Digita un comando - viene eseguito su TUTTI i server! 

sudo apt update 
sudo apt upgrade -y 

# 4. Disattiva sincronizzazione quando hai finito Ctrl+Space Ctrl+y 

Copy Mode

Modalitร  Vi

setw -g mode-keys vi

Cosa fa: Abilita i keybinding di Vi/Vim nella copy mode (invece dei binding di default Emacs)

Navigazione in Copy Mode:

TastoAzione
hsinistra
jgiรน
ksu
ldestra
wparola successiva
bparola precedente
0inizio riga
$fine riga
ginizio documento
Gfine documento
/ricerca
nprossima occorrenza
Noccorrenza precedente

Selezione e Copia

bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel

Cosa fa:

  • v: inizia selezione visuale (come in Vim)
  • y: โ€œyankโ€ (copia) la selezione e esce dalla copy mode

Workflow completo:

# PASSO 1: Entra in copy mode
Ctrl+Space, poi [

# PASSO 2: Naviga fino al testo che vuoi copiare
# (usa hjkl, o frecce, o ricerca con /)

# PASSO 3: Inizia selezione
v

# PASSO 4: Estendi selezione (muoviti con hjkl)
# Il testo selezionato sarร  evidenziato

# PASSO 5: Copia
y

# PASSO 6: Incolla (in un altro pannello)
Ctrl+Space, poi ]

Integrazione con Clipboard di Sistema

La configurazione base copia nel buffer interno di tmux. Per copiare nella clipboard di sistema:

Linux (con xclip):

# Installa xclip
sudo apt install xclip

# Aggiungi a ~/.tmux.conf
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"

macOS:

# Usa pbcopy (giร  presente)
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"

Con selezione mouse:

# Linux
bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"

# macOS
bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"

Barra di Stato

Intervallo di Aggiornamento

set -g status-interval 5

Cosa fa: Aggiorna la barra di stato ogni 5 secondi

Perchรฉ:

  • Mantiene lโ€™orologio aggiornato
  • Se aggiungi script custom (es. battery, CPU), vengono aggiornati
  • 5 secondi รจ un buon compromesso tra aggiornamento e performance

Posizione Barra

set -g status-position bottom

Opzioni:

  • bottom: in basso (default e piรน comune)
  • top: in alto

Quando usare top: Se usi un terminale dropdown (es. Guake, Yakuake) che appare dallโ€™alto, la status bar in alto รจ piรน naturale


Contenuto Barra Sinistra

set -g status-left '<#S> #[default] '

Cosa mostra:

  • #S: nome della sessione
  • Esempio: <progetto-web>

Variabili utili:

VariabileMostra
#SNome sessione
#IIndice finestra corrente
#PIndice pannello corrente
#WNome finestra corrente
#HHostname completo
#hHostname (solo nome)
#(comando)Output di un comando

๐Ÿ”ง Esempi personalizzati:

# Con hostname
set -g status-left '#h <#S> | '

# Con icone (richiede font con simboli)
set -g status-left '  #S | '

# Con info utente
set -g status-left '#(whoami)@#h <#S> | '

Contenuto Barra Destra

set -g status-right '%d/%m/%Y %H:%M '

Cosa mostra: Data e ora in formato italiano: 08/02/2026 15:30

Formati data/ora:

CodiceOutputEsempio
%dGiorno08
%mMese02
%YAnno (4 cifre)2026
%HOra (24h)15
%IOra (12h)03
%MMinuti30
%SSecondi45
%pAM/PMPM
%AGiorno settimanaDomenica
%BNome meseFebbraio

Esempi personalizzati:

# Formato USA
set -g status-right '%m/%d/%Y %I:%M %p'
# Output: 02/08/2026 03:30 PM

# Con giorno della settimana
set -g status-right '%A %d/%m/%Y %H:%M'
# Output: Domenica 08/02/2026 15:30

# Con hostname
set -g status-right '#H | %d/%m/%Y %H:%M'
# Output: mio-server | 08/02/2026 15:30

# Con batteria (richiede script personalizzato)
set -g status-right '๐Ÿ”‹ #(battery.sh) | %H:%M'
# Output: ๐Ÿ”‹ 87% | 15:30

Formato Finestre

setw -g window-status-format ' #I:#W '
setw -g window-status-current-format ' [#I:#W] '

Cosa mostra:

  • Finestre normali: 1:vim 2:bash 3:server
  • Finestra corrente: [2:bash] (con parentesi quadre)

Variabili finestre:

VariabileMostra
#IIndice finestra (1, 2, 3โ€ฆ)
#WNome finestra
#FFlag finestra (* = corrente, - = ultima, Z = zoomed)
#TTitolo pannello

Personalizzazioni:

# Con simboli
setw -g window-status-format ' #I:#W '
setw -g window-status-current-format ' โ–บ #I:#W โ—„ '

# Con flag
setw -g window-status-format ' #I:#W#F '
setw -g window-status-current-format ' #I:#W#F '

# Minimale
setw -g window-status-format '#I'
setw -g window-status-current-format '[#I]'

Colori Barra di Stato

set -g status-style "bg=#1d2021,fg=#d5c4a1"

Cosa fa: Imposta sfondo (bg) e colore testo (fg) della barra di stato

Formati colori supportati:

Hex:

set -g status-style "bg=#1d2021,fg=#d5c4a1"

Nomi colori:

set -g status-style "bg=black,fg=white"
# Colori: black, red, green, yellow, blue, magenta, cyan, white

Colori 256:

set -g status-style "bg=colour235,fg=colour250"
# colour0 ... colour255

RGB (true color):

set -g status-style "bg=#1d2021,fg=#d5c4a1"

Colore Finestra Corrente

setw -g window-status-current-style "bg=#458588,fg=#1d2021,bold"

Cosa fa: La finestra attiva avrร  sfondo blu (#458588), testo scuro (#1d2021) in grassetto

Attributi testo:

# Combinazione di attributi
setw -g window-status-current-style "bg=blue,fg=white,bold,underscore"

# Attributi disponibili:
# - bold
# - dim
# - underscore (sottolineato)
# - blink
# - reverse (inverte fg e bg)
# - italics

Performance

Escape Time

set -sg escape-time 10

Cosa fa: Riduce a 10ms il tempo che tmux aspetta dopo ESC per vedere se fa parte di una sequenza

Perchรฉ รจ importante: Default di tmux: 500ms (mezzo secondo!)

Quando premi ESC in Vim:

โŒ CON 500ms: Vim aspetta โ†’ ritardo percepibile โ†’ frustrazione
โœ… CON 10ms:  Vim risponde โ†’ istantaneo โ†’ felicitร 

Impatto: Cruciale per chi usa Vim/Neovim dentro tmux. Il passaggio da insert a normal mode diventa istantaneo

Non mettere 0: 0 potrebbe far perdere alcune sequenze di escape valide. 10 รจ il minimo raccomandato


Titolo Finestra

set -g set-titles on
set -g set-titles-string '#T'

Cosa fa: Permette alle applicazioni di cambiare il titolo della finestra del terminale


Comandi Essenziali

Gestione Sessioni

# Creare sessioni
tmux new -s nome-sessione          # Nuova sessione con nome
tmux new -s progetto -n editor     # Con nome finestra iniziale

# Listare sessioni
tmux ls                            # Da fuori tmux
Ctrl+Space s                       # Dentro tmux (interattivo)

# Attaccarsi a sessioni
tmux attach -t nome-sessione       # Riconnettiti
tmux a -t nome                     # Forma abbreviata
tmux attach                        # Alla ultima sessione

# Rinominare sessione
Ctrl+Space $                       # Rinomina sessione corrente

# Staccarsi (detach)
Ctrl+Space d                       # Detach
Ctrl+Space D                       # Scegli quale sessione detach

# Eliminare sessioni
tmux kill-session -t nome          # Da fuori
Ctrl+Space :                       # Poi digita: kill-session
exit                               # Dall'ultima finestra della sessione

Gestione Finestre

# Creare e navigare
Ctrl+Space c                 # Nuova finestra
Ctrl+Space ,                 # Rinomina finestra
Ctrl+Space &                 # Chiudi finestra (con conferma)
Ctrl+Space w                 # Lista finestre (interattivo)

# Muoversi tra finestre
Ctrl+Space n                 # Finestra successiva (next)
Ctrl+Space p                 # Finestra precedente (previous)
Ctrl+Space [0-9]             # Vai alla finestra N
Ctrl+Space l                 # Ultima finestra visitata
Ctrl+Space '                 # Prompt: numero finestra
Ctrl+Space f                 # Cerca finestra per nome

# Con la nostra config
Shift+Destra                 # Finestra successiva
Shift+Sinistra               # Finestra precedente

# Spostare finestre
Ctrl+Space :                 # Poi: swap-window -t 2
                             # (scambia con finestra 2)
Ctrl+Space .                 # Sposta e rinumera

๐ŸŽฏ Tip: Dare nomi significativi alle finestre

Ctrl+Space ,    # Poi digita: "editor"
Ctrl+Space c    # Nuova finestra
Ctrl+Space ,    # Digita: "server"
Ctrl+Space c    # Nuova finestra
Ctrl+Space ,    # Digita: "logs"

# Risultato: [1:editor] [2:server] [3:logs]

Gestione Pannelli

# Creare pannelli
Ctrl+Space |                 # Split orizzontale (nostra config)
Ctrl+Space -                 # Split verticale (nostra config)
Ctrl+Space %                 # Split orizzontale (default)
Ctrl+Space "                 # Split verticale (default)

# Navigare tra pannelli
Ctrl+hjkl                    # Con nostra config (no prefix!)
Ctrl+Space o                 # Cicla tra pannelli
Ctrl+Space ;                 # Vai all'ultimo pannello attivo
Ctrl+Space q                 # Mostra numeri pannelli

# Ridimensionare
Alt+Frecce                   # Con nostra config
Ctrl+Space Ctrl+Frecce       # Default (tieni premuto per ripetere)

# Layout predefiniti
Ctrl+Space Spazio            # Cicla tra layout
Ctrl+Space Alt+1             # Layout even-horizontal
Ctrl+Space Alt+2             # Layout even-vertical
Ctrl+Space Alt+3             # Layout main-horizontal
Ctrl+Space Alt+4             # Layout main-vertical
Ctrl+Space Alt+5             # Layout tiled

# Operazioni pannelli
Ctrl+Space x                 # Chiudi pannello (con conferma)
Ctrl+Space z                 # Toggle zoom (fullscreen temporaneo)
Ctrl+Space !                 # Converti pannello in finestra
Ctrl+Space {                 # Sposta pannello a sinistra
Ctrl+Space }                 # Sposta pannello a destra
Ctrl+Space Ctrl+o            # Ruota posizione pannelli

Zoom tip: Ctrl+Space z รจ fantastico per concentrarti temporaneamente su un pannello:

# Hai 4 pannelli, uno con Vim
โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”
โ”‚ V  โ”‚  T โ”‚
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”ค
โ”‚ S  โ”‚  L โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”˜

# Premi Ctrl+Space z nel pannello Vim
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚            โ”‚
โ”‚    VIM     โ”‚
โ”‚ (fullscr)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

# Premi di nuovo Ctrl+Space z per tornare ai 4 pannelli

Copy Mode

# Entrare in copy mode
Ctrl+Space [                 # Entra
q                            # Esci

# Navigazione (con mode-keys vi)
hjkl                         # Su/giรน/sinistra/destra
w / b                        # Parola successiva/precedente
0 / $                        # Inizio/fine riga
g / G                        # Inizio/fine documento
Ctrl+u / Ctrl+d              # Mezza pagina su/giรน
Ctrl+b / Ctrl+f              # Pagina completa su/giรน

# Ricerca
/testo                       # Cerca "testo" in avanti
?testo                       # Cerca "testo" indietro
n                            # Prossima occorrenza
N                            # Occorrenza precedente

# Selezione e copia (con nostra config)
v                            # Inizia selezione
y                            # Copia e esci
Esc                          # Annulla selezione

# Incolla
Ctrl+Space ]                 # Incolla dall'ultimo buffer
Ctrl+Space =                 # Scegli da quale buffer incollare

Tips

Configurazione Condizionale

Per diversi OS:

# In ~/.tmux.conf

# Configurazioni specifiche per OS
if-shell "uname | grep -q Darwin" \
    'bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"' \
    'bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"'

# Configurazioni specifiche per versione tmux
if-shell "test $(tmux -V | cut -d' ' -f2 | tr -d '[:alpha:]') -ge 3.2" \
    'set -g allow-passthrough on'

Problema: Sessioni tmux si perdono dopo riavvio

Sintomi: Dopo il riavvio del server, le sessioni tmux non ci sono piรน

Spiegazione: Tmux salva le sessioni in RAM, non su disco

Soluzione: tmux-resurrect

Anche se preferiamo config senza plugin, per questo caso vale la pena:

# 1. Installa TPM (Tmux Plugin Manager)
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

# 2. Aggiungi a ~/.tmux.conf
# Lista plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'

# Inizializza TPM (tieni questa riga alla fine del file)
run '~/.tmux/plugins/tpm/tpm'

# 3. Ricarica config
Ctrl+Space r

# 4. Installa plugin
Ctrl+Space I (I maiuscola)

# 5. Uso:
# - Salva sessione: Ctrl+Space, Ctrl+s
# - Ripristina: Ctrl+Space, Ctrl+r

Risorse Utili

Documentazione Ufficiale

  • Manual tmux: man tmux nel terminale
  • Guida ufficiale: https://github.com/tmux/tmux/wiki
  • FAQ: https://github.com/tmux/tmux/wiki/FAQ

Cheatsheet

SESSIONI
--------
tmux                           Nuova sessione
tmux new -s nome               Nuova sessione con nome
tmux ls                        Lista sessioni
tmux attach -t nome            Attacca a sessione
Ctrl+Space d                   Detach
Ctrl+Space s                   Lista sessioni (interattivo)
Ctrl+Space $                   Rinomina sessione

FINESTRE
--------
Ctrl+Space c                   Nuova finestra
Ctrl+Space ,                   Rinomina finestra
Ctrl+Space w                   Lista finestre
Ctrl+Space n                   Next window
Ctrl+Space p                   Previous window
Ctrl+Space [0-9]               Vai a finestra N
Ctrl+Space &                   Chiudi finestra

PANNELLI
--------
Ctrl+Space |                   Split orizzontale
Ctrl+Space -                   Split verticale
Ctrl+hjkl                      Naviga pannelli
Ctrl+Space z                   Toggle zoom
Ctrl+Space x                   Chiudi pannello
Ctrl+Space !                   Pannello โ†’ finestra
Alt+Frecce                     Ridimensiona

COPY MODE
---------
Ctrl+Space [                   Entra copy mode
hjkl                           Naviga
v                              Inizia selezione
y                              Copia
q                              Esci
/testo                         Cerca
n / N                          Next/previous match

ALTRO
-----
Ctrl+Space ?                   Mostra tutti i keybinding
Ctrl+Space :                   Prompt comandi
Ctrl+Space r                   Ricarica config

Esempio di Workflow: Sviluppo Rust ๐Ÿฆ€

Il mio approccio allo sviluppo Rust con tmux รจ minimalista: una sessione per progetto, tre finestre dedicate, zero pannelli. Ogni finestra occupa lโ€™intero schermo, mantenendo il focus su un singolo task alla volta.

Setup: 3 Finestre Dedicate

# Creo una sessione dedicata al progetto
tmux new -s rust-project
cd ~/progetti/my-rust-app

Finestra 1: Editor

# tmux crea automaticamente la prima finestra
Ctrl+Space ,               # Rinomino: "editor"
nvim src/main.rs

# Tutto lo schermo per il codice, nessuna distrazione
# Git workflow completamente gestito da fugitive:
# - :Git per status
# - :Git commit per commit
# - :Git push per push
# - etc.

Finestra 2: Cargo Watch

Ctrl+Space c               # Nuova finestra
Ctrl+Space ,               # Rinomino: "watch"

# Compilazione automatica ad ogni salvataggio
cargo watch -x 'check --all-features' -x 'test --all-features'

Tip: Installa cargo-watch se non lโ€™hai:

cargo install cargo-watch

Finestra 3: Run & Test

Ctrl+Space c               # Nuova finestra
Ctrl+Space ,               # Rinomino: "run"

# Qui eseguo manualmente:
# - Test specifici
# - Cargo run
# - Altri comandi cargo ad-hoc
# - Comandi git complessi (solo quando fugitive non basta)

Risultato finale:

[1:editor] [2:watch] [3:run]

Workflow Tipico

# 1. Avvio o riattacco la sessione
tmux attach -t rust-project

# 2. Finestra "editor" (Ctrl+Space 1):
#    - Scrivo codice
#    - Salvo
#    - Git workflow via fugitive:
:Git                       # Git status
:Git add %                 # Stage file corrente
:Git commit                # Commit con messaggio
:Git push                  # Push

# 3. Finestra "watch" (Ctrl+Space 2):
#    - Vedo immediatamente errori/warning di compilazione
#    - I test girano automaticamente

# 4. Finestra "run" (Ctrl+Space 3):
#    - Test specifici:
cargo test test_authentication -- --nocapture

#    - Lancio l'applicazione:
cargo run --release

#    - Git complesso (solo se necessario):
git rebase -i HEAD~3
git cherry-pick abc123

Con i nostri binding รจ semplicissimo passare tra le finestre:

# Metodo 1: Numero diretto (quello che uso di piรน)
Ctrl+Space 1               # Editor
Ctrl+Space 2               # Watch  
Ctrl+Space 3               # Run

# Metodo 2: Frecce (dalla nostra config)
Shift+Destra               # Finestra successiva
Shift+Sinistra             # Finestra precedente

# Metodo 3: Next/Previous
Ctrl+Space n               # Next
Ctrl+Space p               # Previous

Questo รจ il mio workflow quotidiano per Rust con tmux: semplice, efficace e completamente integrato con Neovim. ๐Ÿฆ€


File Configurazione Completo

# ==============================================
# CONFIGURAZIONE TMUX MINIMALE E PRODUTTIVA
# ==============================================

# --- IMPOSTAZIONI GENERALI ---
unbind C-b
set -g prefix C-Space
bind C-Space send-prefix

bind r source-file ~/.tmux.conf \; display "Configurazione ricaricata!"

set -g mouse on
set -g history-limit 20000
set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on
set -ga terminal-overrides ",xterm-256color:Tc"

# --- DIVISIONE FINESTRE ---
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"

# --- NAVIGAZIONE TRA PANNELLI ---
bind -n C-h select-pane -L
bind -n C-l select-pane -R
bind -n C-k select-pane -U
bind -n C-j select-pane -D

# --- NAVIGAZIONE TRA FINESTRE ---
bind -n S-Left previous-window
bind -n S-Right next-window

# --- RIDIMENSIONAMENTO PANNELLI ---
bind -n M-Left resize-pane -L 3
bind -n M-Right resize-pane -R 3
bind -n M-Up resize-pane -U 3
bind -n M-Down resize-pane -D 3

# --- SYNCRO PANNELLI ---
bind C-y set-window-option synchronize-panes\; display-message "Sync: #{?pane_synchronized,ON,OFF}"

# --- COPY MODE ---
setw -g mode-keys vi
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel

# --- BARRA DI STATO ---
set -g status-interval 5
set -g status-position bottom
set -g status-left '<#S> #[default] '
set -g status-right '%d/%m/%Y %H:%M '
setw -g window-status-format ' #I:#W '
setw -g window-status-current-format ' [#I:#W] '

# --- TEMA ---
set -g status-style "bg=#3c3836,fg=#eebd35"
setw -g window-status-current-style "bg=#458588,fg=#1d2021,bold"

# --- PERFORMANCE ---
set -sg escape-time 10
set -g set-titles on
set -g set-titles-string '#T'

Commenti