Ainsi que l’indique le site officiel, “tmux is a terminal multiplexer”. Quand on passe la plupart de son temps sur un terminal, un terminal dit “multiplexeur” devient quasi indispensable car il permet de :

  • Créer plusieurs fenêtres et sessions de terminal à partir d’une seule fenêtre de terminal.
  • Détacher ces sessions et les réattacher plus tard, même après une déconnexion.
  • Diviser votre écran en plusieurs panneaux, chacun exécutant sa propre instance de terminal.

Installation de tmux avec Homebrew

brew install tmux

Vérification de la réussite de l’installation (ça ne mange pas de pain) :

tmux -V

Cette commande doit afficher le numéro de version de tmux.

Création d’un fichier de configuration

touch ~/.tmux.conf

Configurer la gestion des couleurs

Ajout dans le fichier ~/.tmux.conf :

# Basic options
set -g default-terminal "screen-256color"

Changement du prefix par defaut

Ajout dans le fichier ~/.tmux.conf :

# Changement prefix par defaut : C-b devient C-w
set -g prefix C-w
unbind C-b
bind-key C-w send-prefix

Le prefix est la séquence de touches qui permet d’exécuter des commandes dans tmux. Par défaut le préfixe est Ctrl b ce qui demande une petite gymnastique sur un clavier Azerty. J’utilise plutôt Ctrl w étant donné que ces deux touches sont proches l’une de l’autre et peuvent être utilisées plus rapidement.

Dans le suite de ce document, le terme prefixsera utilisé pour spécifier la séquence de touche Ctrl w. Par exemple prefix sindique qu’il faut utiliser les touches Ctrl wet s

Changement de la position de la barre de status

Ajout dans le fichier ~/.tmux.conf :

set -g status-position top

Par défaut, la barre de status est située en bas. Je préfère une position en haut de l’écran top.

Prise en charge de la souris

Ajout dans le fichier ~/.tmux.conf :

set -g mouse on

Bien que tmux peut être entièrement contrôlé avec le clavier, il peut être pratique par moment d’utiliser la souris.

Premiers pas

tmux est un outil particulièrement touffu. Cet article n’est pas un wiki exhaustif sur le sujet mais présente les fonctionnalités de base.

Création d’une session (et en sortir)

Dans tmux, une session est un environnement de travail isolé qui peut contenir plusieurs fenêtres et panneaux (ou volets). C’est comme un “conteneur” principal qui persiste même si vous vous déconnectez de votre terminal.

Concrètement, une session tmux :

  • Continue d’exister et de fonctionner même après que vous fermez votre terminal.
  • Peut être détachée (detach) et réattachée (attach) à volonté.
  • Peut contenir plusieurs fenêtres (un peu comme des onglets dans un navigateur).
  • Conserve l’état de tous vos programmes en cours d’exécution.

Par exemple, vous pourriez avoir :

  • Une session nommée “dev” pour votre travail de développement.
  • Une session “serveur” pour surveiller vos logs.
  • Une session “docs” pour travailler sur votre documentation.

L’avantage majeur est que vous pouvez démarrer un long processus dans une session, vous déconnecter, et retrouver plus tard votre processus exactement dans l’état où vous l’aviez laissé.

Pour créer une session dans tmux :

tmux new -s Session1

Vous vous retrouvez alors dans la session tmux portant le nom que vous avez choisi (Session1 pour l’exemple).

Pour sortir de la session :

  • tmux detachou
  • prefix dou
  • prefix :puis taper la commande detach

Pour connaitre les sessions disponibles :

tmux ls

Ce qui doit afficher quelque chose qui ressemble à :

Session1: 1 windows (created Thu Dec 12 14:42:00 2024

Pour retourner dans la session :

tmux attach -t Session1

Pour basculer d’une session vers une autre : prefix s. Un écran similaire à la capture ci-dessous devrait afficher :

Liste Session

La partie haute affiche les sessions actives (Session1et Session2) avec la possibilité de naviguer entre elles. La partie basse affiche le contenu de la session qui est sélectionnée. Il est alors possible de changer de session en sélectionnant celle que vous voulez et en appuyant sur la touche Entrée

Des panneaux… des panneaux everywhere

Lorsqu’on créé une session tmux, nous avons une fenêtre, laquelle est constituée d’un seul panneau. Chaque terminal appartient à un panneau.

Une session peut être constituée de plusieurs fenêtres et chaque fenêtre peut avoir plusieurs panneaux (et donc plusieurs terminaux).

J’utilise rarement plus d’une fenêtre par session. En revanche j’utilise régulièrement les panneaux dans une session. Un cas d’utilisation typique est la création d’une session dédiée au développement d’une application, avec deux panneaux : un dédié à l’édition du code, l’autre à son exécution. Tout cela dans une seule et même fenêtre.

Fenêtre avec trois panneaux

Dans l’exemple ci-dessus : une fenêtre (dans une session tmux) ayant 3 panneaux (donc 3 terminaux). Pour ajouter un panneau horizontal : prefix ". Pour ajouter un panneau vertical : prefix %. Ces séquences ne sont pas très intuitives, je propose de les remplacer dans le fichier ~/.tmux.confen ajoutant les lignes suivantes :

unbind %
bind | split-window -h
unbind '"'
bind - split-window -v

Avec le prefix, le caractère pipe |sera utilisée pour créer un panneau vertical et la touche tiret -pour créer un panneau horizontal.

La navigation entre les panneaux peut se faire avec la souris (tout comme le changement de dimension d’un panneau, grâce la ligne set -g mouse ondans le fichier de configuration) ou directement au clavier : prefix+ les flèches de navigation pour naviguer entre les panneaux.

Enfin, pour modifier la taille des panneaux avec le clavier, j’ai de me calquer sur les touches utilisées dans Neovim pour la navigation (j, k, let h) :

bind -r j resize-pane -D 5
bind -r k resize-pane -U 5
bind -r l resize-pane -R 5
bind -r h resize-pane -L 5
bind -r m resize-pane -Z

La séquence prefix jchange la taille d’un volet vers le bas. prefix kvers le haut, prefix l vers la droite, prefix h vers la gauche. prefix m permet de maximiser la taille d’un panneau.

Ajout et configuration de plugins tmux

Ajout de Tmux Plugin Manager (TPM)

La gestion des plugins est facilitée par l’installation de Tmux Plugin Manager (TPM).

Exécutez la commande :

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

Ensuite, copiez dans le fichier ~/.tmux.conf les lignes suivantes :

# List of plugins
set -g @plugin 'tmux-plugins/tpm'

# Other examples:
# set -g @plugin 'github_username/plugin_name'
# set -g @plugin 'github_username/plugin_name#branch'
# set -g @plugin 'git@github.com:user/plugin'
# set -g @plugin 'git@bitbucket.com:user/plugin'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

Exemple : personnalisation de la barre de status

La barre de status par défaut de tmux est plutôt austère. De gauche à droite elle affiche : le nom de la session en cours ([Session1]), les fenêtres de la session (celle active est suivie d’une * : 0:zsh- 1:zsh*), le nom du panneau (ici le nom du host : "Sagittarius-A-Etoile.") et enfin l’heure et la date.

tmux barre status défaut

Cette barre de status est entièrement configurable (couleurs, éléments à afficher etc.). Les options de configuration sont à ajouter dans le fichier ~/.tmux.conf. Par exemple, si j’y ajoute la ligne :

set -g status-left "hello word"

Cela va afficher Hello worldà la place du nom de session.

Afin de rendre la status bar de tmux à la fois peu plus fun et conforme à mes besoins, j’utilise deux plugins qui vont me permettre de transformer la barre de status précédente en ceci :

tmux nouvelle barre de status

Le ravalement de façade dévoile une barre de status en 3 parties :

  • À gauche le nom de session, la commande actuellement exécutée dans le panneau (zsh) et le répertoire courant (plugins). Le nom de session passe en rouge lorsqu’on utilise le prefixe de tmux.
  • Au centre les numéros de fenêtres ;
  • À droite la date et l’heure et la météo.

Installation et configuration des plugins

Pour réaliser ma barre de status j’utilise deux plugins :

  • Catppuccin : permet d’utiliser les couleurs des thèmes de Catppuccin et facilite la mise à jour des options de la barre de status ;
  • tmux-weather : pour l’affichage de la météo ;

Il faut d’abord ajouter ces deux plugins à la liste des plugins TPM, en ajoutant dans le fichier ~/.tmux.conf :

set -g @plugin 'catppuccin/tmux'
set -g @plugin 'aaronpowell/tmux-weather'

Utiliser la séquence prefix I (i majuscule) pour installer les plugins.

Customisation de tmux-weather (à ajouter dans ~/.tmux.conf) :

# Format d'affichage souhaité : %c pour l'icone de la météo, %t pour la température, %w pour la vitesse du vent
set -g @forecast-format '%c+%t+%w'
# Météo de Paris
set -g @forecast-location Paris

Customisation de Catppuccin (à ajouter dans ~/.tmux.conf) :

# Configuration de Catppuccin
set -g @catppuccin_flavor "macchiato"
set -g @catppuccin_status_background "none"
set -g @catppuccin_window_status_style "none"
set -g @catppuccin_pane_status_enabled "off"
set -g @catppuccin_pane_border_status "off"
# Partie gauche de la barre de status
set -g status-left-length 100
set -g status-left ""
set -ga status-left "#{?client_prefix,#{#[bg=#{@thm_red},fg=#{@thm_bg},bold]  #S },#{#[bg=#{@thm_bg},fg=#{@thm_green}]  #S }}"
set -ga status-left "#[bg=#{@thm_bg},fg=#{@thm_overlay_0},none]│"
set -ga status-left "#[bg=#{@thm_bg},fg=#{@thm_maroon}]  #{pane_current_command} "
set -ga status-left "#[bg=#{@thm_bg},fg=#{@thm_overlay_0},none]│"
set -ga status-left "#[bg=#{@thm_bg},fg=#{@thm_blue}]  #{=/-32/...:#{s|$USER|~|:#{b:pane_current_path}}} "
set -ga status-left "#[bg=#{@thm_bg},fg=#{@thm_overlay_0},none]#{?window_zoomed_flag,│,}"
set -ga status-left "#[bg=#{@thm_bg},fg=#{@thm_yellow}]#{?window_zoomed_flag,  zoom ,}"
# Partie droite de la barre de status
set -g status-right-length 100
set -g status-right ""
set -ga status-right "#[bg=#{@thm_bg},fg=#{@thm_blue}] 󰭦 %Y-%m-%d 󰅐 %H:%M "
set -ga status-right "#[bg=#{@thm_bg},fg=#{@thm_overlay_0}, none]│"
# ajout de la meteo sur la barre de status
set -ga status-right "#[bg=#{@thm_bg},fg=#{@thm_blue}]  #{forecast} "
# Ajout configuration de tmux pour la barre de status
set -g status-style "bg=#{@thm_bg}"
set -g status-justify "absolute-centre"

# Look & feel d'une fenêtre
set -wg automatic-rename on
set -g automatic-rename-format "Window"

set -g window-status-format " #I#{?#{!=:#{window_name},Window},: #W,} "
set -g window-status-style "bg=#{@thm_bg},fg=#{@thm_rosewater}"
set -g window-status-last-style "bg=#{@thm_bg},fg=#{@thm_peach}"
set -g window-status-activity-style "bg=#{@thm_red},fg=#{@thm_bg}"
set -g window-status-bell-style "bg=#{@thm_red},fg=#{@thm_bg},bold"
set -gF window-status-separator "#[bg=#{@thm_bg},fg=#{@thm_overlay_0}]│"

set -g window-status-current-format " #I#{?#{!=:#{window_name},Window},: #W,} "
set -g window-status-current-style "bg=#{@thm_peach},fg=#{@thm_bg},bold"

Créer facilement des sessions … depuis n’importe où

Afin de me faciliter la vie, j’ai créé un alias qui pointe vers un script, lequel me permet de créer facilement une nouvelle session depuis n’importe où dans le terminal.

Le script (que j’ai placé dans ~/.local/bin) :

~/.local/bin/tmux-session.sh

#!/bin/zsh
# Create a new tmux session with the given name
if [ $# -eq 0 ]; then
    echo "Usage: $0 <session_name>"
    exit 1
fi

session_name=$1

# If we are inside a tmux session we do not create a nested session
if [ -z "$TMUX" ]; then
    tmux new-session -A -s "$session_name"
else
    tmux switch-client -t "$session_name" 2>/dev/null ||
        tmux new-session -d -s "$session_name" &&
        tmux switch-client -t "$session_name"
fi

Rendre le script exécutable :

chmod +x ~/.local/bin/tmux-session.sh

L’alias créé :

alias tx='tmux-session.sh'

Pour créer une nouvelle session il suffit de lancer :

tx NomDeMaSession

Si cette session existe déjà, il y a bascule vers celle-ci.

Exemple concret

Voici deux captures d’écran résumant mon utilisation de tmux.

La première capture montre une session composée de deux panneaux : neovim sur le panneau du haut et l’exécution du code dans le panneau du bas. Deux en un !

Exemple tmux 1

La seconde capture montre mes 4 sessions actives simultanément dans tmux.

Exemple tmux 2