tmux — Guide de prise en main et utilisation#

tmux (terminal multiplexer) permet de gérer plusieurs sessions terminales dans une seule fenêtre, de les détacher (elles continuent en arrière-plan) et de les rattacher plus tard. Indispensable pour le travail à distance, le dev multi-panneaux et la persistance de sessions SSH.


Installation#

# Debian / Ubuntu
sudo apt install tmux

# macOS (Homebrew)
brew install tmux

# Fedora / RHEL
sudo dnf install tmux

# Arch
sudo pacman -S tmux

Vérifier la version (3.x recommandée pour les fonctionnalités modernes) :

tmux -V

Concepts fondamentaux#

tmux a une hiérarchie stricte qu'il faut comprendre avant tout :

┌─────────────────────────────────────────────┐
│                  SERVER                      │
│  (processus tmux, tourne en arrière-plan)    │
│  ┌───────────────────────────────────────┐  │
│  │            SESSION                     │  │
│  │  (groupe de fenêtres nommé)            │  │
│  │  ┌──────────────────────────────────┐ │  │
│  │  │         WINDOW (fenêtre)          │ │  │
│  │  │  (équivalent d'un onglet)         │ │  │
│  │  │  ┌────────────┐ ┌────────────┐  │ │  │
│  │  │  │   PANE     │ │   PANE     │  │ │  │
│  │  │  │ (terminal) │ │ (terminal) │  │ │  │
│  │  │  └────────────┘ └────────────┘  │ │  │
│  │  └──────────────────────────────────┘ │  │
│  └───────────────────────────────────────┘  │
└─────────────────────────────────────────────┘
Concept Description Analogie
Server Processus tmux unique qui gère tout. Démarré automatiquement au premier attachement. Le moteur
Session Collection nommée de fenêtres. C'est l'unité que vous détachez/reattachez. Un workspace / bureau virtuel
Window Équivalent d'un onglet de terminal. Numérotée (0, 1, 2...). Un onglet de navigateur
Pane Sous-division d'une fenêtre. Chaque pane est un terminal indépendant. Un split dans votre éditeur
Prefix La touche qui précède toutes les commandes tmux. Par défaut Ctrl+b. Le mod key

Le préfixe (prefix)#

La touche prefix est fondamentale. Toutes les commandes tmux commencent par le préfixe. Par défaut : Ctrl+b (noté C-b).

Exemple : pour créer une nouvelle fenêtre, on tape Ctrl+b puis c. On relâche Ctrl+b avant de taper c.

Convention de notation : dans ce guide, prefix = Ctrl+b. Les raccourcis s'écrivent prefix + X (appuyer sur prefix, relâcher, puis appuyer sur X).


Premiers pas#

Démarrer / gérer des sessions#

# Nouvelle session (nommée automatiquement)
tmux

# Nouvelle session nommée
tmux new -s monprojet

# Nouvelle session avec nom + fenêtre nommée
tmux new -s monprojet -n editor

# Lister les sessions existantes
tmux ls

# Attacher la dernière session
tmux attach
tmux a          # raccourci

# Attacher une session spécifique
tmux attach -t monprojet
tmux a -t monprojet

# Détacher la session courante (elle continue en arrière-plan)
# → prefix + d

# Tuer une session
tmux kill-session -t monprojet

# Tuer toutes les sessions sauf la courante
tmux kill-session -a

# Tuer le serveur tmux entier (toutes les sessions)
tmux kill-server

Pourquoi c'est puissant : la persistance#

Vous êtes en SSH sur un serveur → vous lancez tmux → un build de 30 min tourne
  → votre SSH tombe (réseau, VPN, laptop en veille)
  → le build CONTINUE dans tmux
  → vous vous reconnectez en SSH → tmux attach → vous retrouvez tout intact

Sans tmux, la déconnexion SSH tue tous les processus du terminal.


Gestion des fenêtres (windows)#

Action Commande tmux Raccourci clavier
Créer une fenêtre :new-window prefix + c
Fenêtre suivante :next-window prefix + n
Fenêtre précédente :previous-window prefix + p
Aller à la fenêtre N :select-window -t N prefix + N (0-9)
Lister les fenêtres (choix interactif) :choose-window prefix + w
Renommer la fenêtre courante :rename-window prefix + ,
Fermer la fenêtre courante :kill-window prefix + & (confirm)
Aller à la dernière fenêtre visitée prefix + l
Réorganiser les fenêtres :move-window prefix + .

Barre de statut#

En bas de l'écran, tmux affiche la liste des fenêtres :

[monprojet] 0:editor* 1:server- 2:logs
  • * = fenêtre active
  • - = dernière fenêtre visitée
  • ! = fenêtre avec activité (bell)

Gestion des panes (splits)#

Les panes divisent une fenêtre en plusieurs terminaux visibles simultanément.

Action Raccourci Description
Split vertical (gauche/droite) prefix + % Coupe verticalement, nouveau pane à droite
Split horizontal (haut/bas) prefix + " Coupe horizontalement, nouveau pane en bas
Naviguer entre panes prefix + flèches Haut/bas/gauche/droite
Cycle entre panes prefix + o Pane suivant
Afficher les numéros de pane prefix + q Tapez le numéro affiché pour sauter
Pane plein écran (zoom toggle) prefix + z Bascule entre zoom et layout normal
Fermer le pane courant prefix + x Demande confirmation
Échanger deux panes prefix + { / prefix + } Rotation gauche/droite
Convertir pane en fenêtre prefix + ! Le pane devient sa propre fenêtre
Layout prédéfini suivant prefix + Space Cycle through layouts (even-horizontal, even-vertical, main-vertical, etc.)

Mnemonic : % ressemble à une barre verticale | → split vertical. " ressemble à une barre horizontale - → split horizontal.

Redimensionner les panes#

Mode 1 — Maintenir le préfixe :

prefix (maintenir) + Ctrl+flèches     # redimensionne dans la direction

Mode 2 — Mode redimensionnement (plus pratique) :

prefix + :                                # entrer en mode commande
resize-pane -L 10                          # Left, 10 caractères
resize-pane -R 10                          # Right
resize-pane -U 5                           # Up
resize-pane -D 5                           # Down

Mode 3 — Avec binding personnalisé (recommandé, voir section Configuration) :

# Dans ~/.tmux.conf, permet de resize avec prefix + Alt+flèches sans mode
bind -n M-Left resize-pane -L 5
bind -n M-Right resize-pane -R 5
bind -n M-Up resize-pane -U 5
bind -n M-Down resize-pane -D 5

Synchronisation des panes#

Tres utile pour taper la même commande sur plusieurs serveurs :

prefix + :
setw synchronize-panes on

Désormais, chaque touche tapée est envoyée à tous les panes simultanément. Idéal pour des mises à jour parallèles sur N machines.


Modes spéciaux#

Copy mode (mode copie / navigation)#

Le copy mode permet de naviguer dans l'historique du terminal (scrollback), de sélectionner et copier du texte.

Entrer en copy mode :

prefix + [

Une fois en copy mode (indicateur [0/0] en haut à droite), on navigue avec des touches vi ou emacs (selon la config) :

Action Mode vi Mode emacs
Haut / bas k / j Ctrl+P / Ctrl+N
Gauche / droite h / l Ctrl+B / Ctrl+F
Mot précédent / suivant b / w Esc+b / Esc+f
Début / fin de ligne 0 / $ Ctrl+A / Ctrl+E
Haut / bas de page Ctrl+u / Ctrl+d Ctrl+u / Ctrl+d
Rechercher (avant) / puis pattern Ctrl+S puis pattern
Rechercher (arrière) ? puis pattern Ctrl+R puis pattern
Suivant / précédent match n / N n / N
Commencer sélection v (char) / V (line) / Ctrl+v (block) Ctrl+Space
Copier la sélection y Alt+w
Quitter copy mode q ou Esc q ou Esc

Copier dans le presse-papier système (nécessite config, voir plus bas) :

# ~/.tmux.conf — copier vers le clipboard macOS
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
# Linux X11
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -sel clip"
# Linux Wayland
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy"

Command mode (mode commande)#

Le mode commande s'ouvre avec prefix + : et permet de taper des commandes tmux directement :

:new-session -s nom          # créer une session
:split-window -h             # split horizontal
:kill-pane                    # fermer le pane
:source ~/.tmux.conf          # recharger la config
:set mouse on                 # activer la souris

Configuration — ~/.tmux.conf#

Fichier de configuration utilisateur, lu au démarrage du serveur tmux. Voici une configuration recommandée pour un développeur :

# ═══════════════════════════════════════════════════════════════
# tmux.conf — Configuration recommandée
# ═══════════════════════════════════════════════════════════════

# ─── Général ───────────────────────────────────────────────────
# Remplacer le préfixe Ctrl+b par Ctrl+a (plus ergonomique)
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Index des fenêtres à partir de 1 (0 est loin sur le clavier)
set -g base-index 1
setw -g pane-base-index 1

# Renumber automatiquement les fenêtres quand on en ferme une
set -g renumber-windows on

# Historique plus long
set -g history-limit 50000

# Réduire le délai d'attente après escape (important pour vim)
set -sg escape-time 0

# Activer la souris (scroll, resize panes, sélection fenêtre)
set -g mouse on

# Terminal avec couleurs 256 + true color
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB"

# ─── Raccourcis clavier ────────────────────────────────────────
# Recharger la config avec prefix + r
bind r source-file ~/.tmux.conf \; display "Config reloaded!"

# Splits plus intuitifs (| = vertical, - = horizontal)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# Nouvelle fenêtre garde le chemin courant
bind c new-window -c "#{pane_current_path}"

# Navigation entre panes style vim
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Resize avec préfixe + H/J/K/L (majuscules)
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

# ─── Copy mode ─────────────────────────────────────────────────
# Mode vi (si vous préférez emacs, remplacer par emacs)
setw -g mode-keys vi

# Sélection et copie style vim
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi V send-keys -X select-line
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"

# ─── Apparence ─────────────────────────────────────────────────
# Thème sombre simple
set -g status-style "bg=default,fg=white"
set -g status-left "#[fg=green,bold][#S] "
set -g status-right "#[fg=cyan]%Y-%m-%d #[fg=yellow]%H:%M "
set -g status-left-length 50
set -g status-right-length 50

# Fenêtre active en surbrillance
setw -g window-status-current-style "fg=black,bg=cyan,bold"
setw -g window-status-style "fg=white,bg=default"

# Bordures des panes
set -g pane-border-style "fg=colour238"
set -g pane-active-border-style "fg=cyan"

# Messages
set -g message-style "bg=black,fg=cyan"

# Refresh status toutes les 5 secondes
set -g status-interval 5

Recharger la config après modification#

prefix + :source ~/.tmux.conf

Ou avec le binding défini plus haut :

prefix + r

Workflow typique pour un développeur#

1. Persistance de sessions SSH#

C'est le cas d'usage n°1 de tmux : vos sessions SSH survivent aux déconnexions.

# Sur le serveur distant
ssh user@serveur
tmux new -s dev

# ... travail ...
# Ctrl+A d (détacher) ou juste fermer le terminal

# Reconnexion plus tard
ssh user@serveur
tmux attach -t dev
# Tout est encore là

Automatiser l'attachement : ajouter à ~/.ssh/config ou ~/.bashrc :

# ~/.bashrc (sur le serveur distant)
# Attachement automatique à tmux à chaque connexion SSH
if [[ -z "$TMUX" ]] && [ -n "$SSH_CONNECTION" ]; then
    tmux attach-session -t ssh_tmux 2>/dev/null || tmux new-session -s ssh_tmux
fi

Ainsi, chaque ssh user@serveur vous place directement dans la même session tmux.

2. Layout dev standard#

Un layout classique pour le dev web :

┌──────────────────────────────────────────────┐
│                  (fenêtre 1: dev)             │
│  ┌────────────────────┐  ┌─────────────────┐ │
│  │                    │  │                 │ │
│  │   Éditeur          │  │  Serveur dev    │ │
│  │   (vim/nvim)       │  │  (logs / run)   │ │
│  │                    │  │                 │ │
│  │                    │  │                 │ │
│  └────────────────────┘  └─────────────────┘ │
│  ┌─────────────────────────────────────────┐ │
│  │  Terminal (git, tests, commandes)        │ │
│  └─────────────────────────────────────────┘ │
└──────────────────────────────────────────────┘

Script pour créer ce layout automatiquement :

#!/bin/bash
# dev-layout.sh — crée une session tmux avec layout dev

SESSION="dev"

tmux new-session -d -s $SESSION -n main
tmux split-window -h -t $SESSION:main
tmux split-window -v -t $SESSION:main.1

# Pane 0 (haut-gauche) : éditeur
tmux send-keys -t $SESSION:main.0 "nvim" C-m

# Pane 1 (haut-droite) : serveur dev
tmux send-keys -t $SESSION:main.1 "npm run dev" C-m

# Pane 2 (bas) : terminal libre
tmux select-pane -t $SESSION:main.2

# Sélectionner le pane éditeur par défaut
tmux select-pane -t $SESSION:main.0

# Attacher
tmux attach-session -t $SESSION

Lancer :

chmod +x dev-layout.sh
./dev-layout.sh

3. Monitoring multi-serveurs#

# Session avec un pane par serveur
tmux new -s monitor -d
tmux split-window -h -t monitor
tmux split-window -v -t monitor:0.0
tmux split-window -v -t monitor:0.1

# Activer la sync pour taper la même commande partout
tmux setw -t monitor synchronize-panes on
tmux send-keys -t monitor "htop" C-m

4. Workflow logging#

Session dédiée aux logs avec tail dans plusieurs panneaux :

┌──────────────┬──────────────┐
│ nginx logs   │ app logs     │
├──────────────┼──────────────┤
│ db logs      │ system logs  │
└──────────────┴──────────────┘
tmux new -s logs -d
tmux split-window -h -t logs
tmux split-window -v -t logs:0.0
tmux split-window -v -t logs:0.1

tmux send-keys -t logs:0.0 "tail -f /var/log/nginx/error.log" C-m
tmux send-keys -t logs:0.1 "tail -f /app/logs/app.log" C-m
tmux send-keys -t logs:0.2 "tail -f /var/log/postgresql/postgresql.log" C-m
tmux send-keys -t logs:0.3 "journalctl -f" C-m

tmux attach -t logs

Tableaux de raccourcis essentiels#

Sessions#

Raccourci Action
prefix + d Détacher la session
prefix + s Lister / switcher entre sessions
prefix + $ Renommer la session courante
prefix + ( Session précédente
prefix + ) Session suivante
prefix + L Dernière session active

Fenêtres#

Raccourci Action
prefix + c Nouvelle fenêtre
prefix + , Renommer la fenêtre
prefix + & Fermer la fenêtre
prefix + n Fenêtre suivante
prefix + p Fenêtre précédente
prefix + 1-9 Aller à la fenêtre N
prefix + w Liste interactive des fenêtres
prefix + . Déplacer la fenêtre (changer son index)
prefix + Space Layout de panes suivant

Panes#

Raccourci Action
prefix + % Split vertical
prefix + " Split horizontal
prefix + flèches Naviguer entre panes
prefix + o Pane suivant (cycle)
prefix + q Afficher les numéros de pane
prefix + z Zoom toggle (plein écran)
prefix + x Fermer le pane
prefix + { Échanger avec le pane précédent
prefix + } Échanger avec le pane suivant
prefix + ! Convertir pane en fenêtre

Copy mode (mode vi)#

Touche Action
prefix + [ Entrer en copy mode
h j k l Déplacer le curseur
w b Mot suivant / précédent
0 $ Début / fin de ligne
Ctrl+u Ctrl+d Page up / down
/ ? Rechercher avant / arrière
n N Match suivant / précédent
v V Ctrl+v Sélection char / ligne / bloc
y Copier la sélection
q Esc Quitter le copy mode

Divers#

Raccourci Action
prefix + ? Afficher tous les raccourcis
prefix + : Mode commande
prefix + t Afficher une horloge (fun)
prefix + r Recharger la config (si binding défini)
prefix + [ Entrer copy mode

Plugins avec TPM#

TPM (Tmux Plugin Manager) permet de gérer les plugins tmux facilement.

Installation#

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

Ajouter à la fin de ~/.tmux.conf :

# ═══════════════════════════════════════════════════════════════
# Plugins (TPM)
# ═══════════════════════════════════════════════════════════════
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# Sauvegarde automatique des sessions
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @resurrect-strategy-nvim 'session'

# Sauvegarde continue (automatique)
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @continuum-restore 'on'
set -g @continuum-save-interval '15'

# Thème
set -g @plugin 'catppuccin/tmux'
set -g @catppuccin_flavour 'mocha'

# Navigation entre panes seamless avec vim
set -g @plugin 'christoomey/vim-tmux-navigator'

# Initialiser TPM (doit être à la toute fin)
run '~/.tmux/plugins/tpm/tmux'

Installer les plugins : après avoir sauvegardé, taper :

prefix + I      # I majuscule = Install

TPM télécharge et charge les plugins automatiquement.

Mises à jour#

prefix + U      # Update

Plugins recommandés#

Plugin Rôle
tmux-sensible Defaults sensibles (corrections de comportements tmux quirks)
tmux-resurrect Sauvegarde et restaure les sessions tmux après reboot
tmux-continuum Sauvegarde automatique + restauration au démarrage de tmux
vim-tmux-navigator Navigation seamless entre panes tmux et splits vim (Ctrl+h/j/k/l)
tmux-yank Copie améliorée vers le clipboard système
catppuccin/tmux Thème élégant (mocha, latte, frappe, macchiato)
tmux-fzf Intégration fzf pour switcher entre sessions/panes/fenêtres
tmux-floax Fenêtre flottante scratch terminal

Intégration avec d'autres outils#

vim / Neovim#

vim-tmux-navigator permet de naviguer entre splits vim et panes tmux de manière transparente :

" ~/.config/nvim/init.lua ou ~/.vimrc
" Ctrl+h/j/k/l pour naviguer entre splits vim ET panes tmux
nnoremap <C-h> <cmd>TmuxNavigateLeft<CR>
nnoremap <C-j> <cmd>TmuxNavigateDown<CR>
nnoremap <C-k> <cmd>TmuxNavigateUp<CR>
nnoremap <C-l> <cmd>TmuxNavigateRight<CR>

Avec le plugin tmux correspondant, Ctrl+h à la frontière d'un pane vim saute au pane tmux voisin.

fzf#

Intégration fzf pour switcher entre sessions :

# Alias : fs = fuzzy session switcher
alias fs='tmux list-sessions -F "#{session_name}" | fzf | xargs tmux switch-client -t'

Avec tmux-fzf plugin :

prefix + T      # Session switcher via fzf
prefix + F      # Fenêtre switcher
prefix + C      | Commande fzf

SSH + tmux#

# Lancer tmux automatiquement sur connexion SSH
ssh -t user@serveur "tmux attach -t dev || tmux new -s dev"

Le flag -t force l'allocation de TTY.

Copier vers le clipboard système#

Système Commande
macOS pbcopy
Linux X11 xclip -selection clipboard ou xsel --clipboard --input
Linux Wayland wl-copy
WSL clip.exe

Configuration tmux universelle :

# ~/.tmux.conf
if-shell "uname | grep -q Darwin" \
    'bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"'

if-shell "[ -n \"$WAYLAND_DISPLAY\" ]" \
    'bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy"'

if-shell "[ -z \"$WAYLAND_DISPLAY\" ] && [ -n \"$DISPLAY\" ]" \
    'bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -sel clip"'

Docker / dev containers#

tmux est idéal pour garder un shell dans un container pendant qu'on rebuild :

# Dev container persistant
tmux new -s container -d
tmux send-keys -t container "docker exec -it myapp bash" C-m
tmux attach -t container

Trucs et astuces#

Lister tous les raccourcis#

prefix + ?

Mode souris#

set -g mouse on

Active : scroll, sélection de pane par clic, resize par drag, sélection de fenêtre par clic sur la barre de statut.

Nommage de sessions par projet#

Convention recommandée : nommer les sessions d'après le projet :

tmux new -s monapp-frontend
tmux new -s monapp-backend
tmux new -s monapp-infra

Script de démarrage multi-projets#

#!/bin/bash
# start-work.sh
tmux new-session -d -s frontend -c ~/projects/frontend
tmux new-session -d -s backend -c ~/projects/backend
tmux new-session -d -s infra -c ~/projects/infra

tmux attach-session -t frontend

Quick attach fuzzy#

Ajouter à ~/.zshrc ou ~/.bashrc :

# ta = tmux attach (fuzzy)
ta() {
    local session
    session=$(tmux list-sessions -F "#{session_name}" 2>/dev/null | fzf --query="$1" --select-1 --exit-0) &&
        tmux attach-session -t "$session" || tmux new-session -s "${1:-main}"
}

Usage :

ta              # fuzzy picker
ta front        # attache "frontend" si unique match

Envoyer une commande à tous les panes#

# Via CLI (sans entrer dans tmux)
tmux list-panes -a -F "#{pane_id}" | xargs -I {} tmux send-keys -t {} "uptime" C-m

# Via mode interactif
prefix + :
setw synchronize-panes on

Capture de pane (récupérer le contenu)#

# Capturer le contenu visible d'un pane dans un fichier
tmux capture-pane -t session:0.0 -p > output.txt

# Capturer tout l'historique
tmux capture-pane -t session:0.0 -p -S - > full_history.txt

Cheatsheet récapitulative (à imprimer)#

SESSIONS
  tmux new -s nom          créer
  tmux ls                  lister
  tmux a -t nom            attacher
  tmux kill-session -t nom tuer
  prefix + d               détacher
  prefix + s               switcher

FENÊTRES (prefix + ...)
  c     nouvelle
  n / p  suivante / précédente
  1-9   aller à la fenêtre N
  w     liste interactive
  ,     renommer
  &     fermer

PANES (prefix + ...)
  %     split vertical
  "     split horizontal
  flèches  naviguer
  o     cycle
  z     zoom
  x     fermer
  { }   échanger
  Space layout suivant

COPY MODE (prefix + [)
  h j k l   naviguer
  / ?       rechercher
  v V       sélectionner
  y         copier
  q         quitter

CONFIG
  prefix + r   recharger
  prefix + :   mode commande

Références#

tech tmux terminal productivite linux devops