tmux: l'outil magique pour gérer vos terminaux (partie 2)

Posté le 24 mai 2011

Nous allons voir comment utiliser tmux sous votre gestionnaire de fenêtres préféré (j'ai choisi ici Openbox mais n'importe quel autre WM fera l'affaire) pour remplacer les onglets du terminal (ici rxvt-unicode) et lancer les applications en mode texte dans un seul et unique terminal.

Préparons le terrain:

Tout d'abord, nous allons écrire un petit script shell pour automatiser l'exécution de tmux dans un terminal. Le but de ce dernier étant d'ouvrir un terminal, d'y créer une session tmux si elle n'existe pas, ou bien de se rattacher à une session existante, et enfin de donner le focus au terminal. Pour cela, nous aurons besoin d'installer une petite application supplémentaire: wmctrl. Cet outil très pratique permet d’interagir en ligne de commandes avec tout gestionnaire de fenêtres compatible avec les spécifications EWMH.

Si vous êtes sous Archlinux:

pacman -S wmctrl

ou encore si vous êtes l'heureux utilisateur d'un système sous OpenBSD:

pkg_add -i wmctrl

A présent, si vous ne l'avez pas encore fait, référez-vous à l'article précédent et créez un fichier .tmux.conf à la racine de votre répertoire perso et contenant ceci:

# Default session
new -d -s "MaSession"

Ceci permettra de créer une session par défaut nommée MaSession.

Prenez maintenant votre fidèle compagnon, j'ai nommé l'éditeur de texte, et créez un nouveau fichier comme ceci:

#!/bin/sh
# Prend en paramètre le nom de la session tmux a créer ou à laquelle se rattacher.
# Puis ouvre un terminal ou en utilise un déjà existant et lui donne le focus.

WINDOW_NAME="Comete's TMUX Terminal"
TERM_EXIST=`wmctrl -l|grep "$WINDOW_NAME"`

if [ -z $1 ]; then
    echo "Merci de préciser le nom de la session tmux en paramètre."
    echo -e "\nExemple: ./terminux.sh MaSession"
    exit 0
fi

# Si aucun terminal n'est ouvert, on le lance
# et on y attache la session tmux
if [ -z "$TERM_EXIST" ]; then
    urxvt -T "$WINDOW_NAME" -e tmux -2 attach -t "$1" &
    sleep 0.5
fi

# On donne le focus au terminal
wmctrl -a "$WINDOW_NAME"

Pour ma part, j'ai appelé ce script terminux.sh mais vous pouvez l'appeler comme bon vous semble.

Intégration au gestionnaire de fenêtres:

J'aime configurer quelques raccourcis clavier pour les applications que j'utilise le plus souvent comme le terminal. Nous allons donc éditer le fichier ~/.config/openbox/rc.xml et ajouter dans la section <keyboard></keyboard> un nouveau raccourci:

<keybind key="A-F1">
      <action name="Execute">
        <command>/home/comete/scripts/terminux.sh MaSession</command>
      </action>
</keybind>

Ainsi en appuyant sur [Alt]+F1, vous ouvrirez un terminal contenant un session tmux nommée MaSession ou basculerez vers ce terminal si vous l'aviez déjà ouvert. Le plus sympa c'est que si vous le fermez par erreur, faites de nouveau [Alt]+F1 et vous retrouverez votre terminal comme vous l'aviez laissé, avec toutes les "fenêtres" tmux à l'intérieur ! :)

Et le meilleur pour la fin...

Pour terminer, nous allons voir comment exécuter des applications en mode texte depuis le menu d'Openbox afin qu'elles s'ouvrent directement dans votre "terminux" flambant neuf.

Pour l'exemple, nous allons lancer le rippeur et encodeur de CDs ABCDE. Editez donc le fichier ~/.config/openbox/menu.xml et ajoutez ce qui suit dans la section <menu></menu> de votre choix:

<item label="ABCDE">
    <action name="Execute">
        <execute>
            tmux -2 new-window -t MaSession -n 'abcde' abcde
        </execute>
    </action>
</item>

Cette commande ajoute une nouvelle fenêtre (new-window) nommée 'abcde' (-n) à votre session 'MaSession' (-t) et y exécute la commande 'abcde'. L'option -2 permet de forcer le mode 256 couleurs si votre terminal le supporte.

Voilà ! vous n'avez maintenant plus qu'une seule fenêtre de terminal pour toutes vos applications texte, le tout rapidement accessible et souple à l'usage. ;)

Petite astuce: s'il vous arrive d'utiliser également tmux sur des serveurs distants le tout dans votre tmux local, vous remarquerez que c'est le local qui prend en priorité les combinaisons de touches [Ctrl+b]+... Pour contrôler le tmux distant, il vous suffit de doubler le [Ctrl+b], par exemple:

[Ctrl+b][Ctrl+b]+c