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'écriventprefix + 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#
- Documentation officielle tmux
- man tmux — la référence complète
- tmux cheatsheet (OH-My-Tmux)
- TPM — Tmux Plugin Manager
- tmux-resurrect
- vim-tmux-navigator
- The Tao of tmux — livre gratuit