/*
 * Accueil; tout; à propos + @ + FAQ;
 * => Lire cette page via gemini (gemini?);
 */

Comment j'utilise tmux ?

Voilà plusieurs semaines que j'utilise tmux au quotidien. Alors qu'auparavant j'ouvrais plusieurs fenêtres afin d'avoir de multiples terminaux, je n'ai maintenant plus qu'une session tmux.

Si tmux ne vous dit rien, sachez qu'il s'agit d'un outil permettant d'avoir "plusieurs terminaux dans 1 seul". (oui, c'est très approximatif...).

Cela permet notamment :

Vous remarquerez certainement de nombreuses similitudes avec la configuration de Roman Zolotarev.

Configuration tmux de Roman Zolotarev

Au fait, tmux est présent de base dans OpenBSD :)

Ça ressemble à quoi ?

Démonstration de tmux (IMG)   Démonstration de tmux (IMG)

Comme vous pouvez le voir, ma fenêtre est divsée en plusieurs parties un peu comme le ferait un tiling window manager. Chaque partie est appelée un "pane", avec à gauche cet article pendant que je le rédige, en haut à droite un peu de code awk et en bas à droite la prise de capture d'écran.

Vous distinguez en bas à gauche la liste des fenêtres disponibles : je les ai regroupées par thèmes, la plupart sont lancés automatiquement avec ma session.

En bas à droite, il s'agit d'une barre de status : mon terminal est en plein écran. J'y affiche l'espace disque restant, le niveau de batterie, le volume sonore et la date. Lorsque mpd joue de la musique, on voit le titre de la chanson jouée.

Au démarrage

Je démarre à chaque début de session un script qui va créer les différentes fenêtres que je veux dans tmux, à savoir une pour mes mails, une pour un client XMPP, une pour pouvoir accéder rapidement à mes cours.

Cela se passe dans le script starttmux suivant :

#!/bin/ksh
session=0
showtmux()
{
    xterm -class tmux -e tmux a -t $session
    exit
}
# set up tmux
tmux has-session -t $session && showtmux
# show sync by default, then run ksh
tmux new -d -s $session "/home/prx/bin/prxsync pull; ksh"
# mutt
tmux new-window -d -n "mails" "mutt"
# xmpp
tmux new-window -d -n "chat" "profanity"
# educ
tmux new-window -d -n "educ" -c "$HOME/work/educ/College/Cours" rover
tmux split-window -h -d -t "educ" -c "$HOME/work/educ/College/Cours" ksh
showtmux

Je n'utilise qu'une seule session tmux, sauf exceptions : la 0.

Au début, le script vérifie si la session n'existe pas déjà pour l'afficher au lieu de la charger.

Ensuite, je lance un script de synchronisation appelé "prxsync" et ouvre un shell ksh dans la fenêtre principale.

Puis, j'ouvre dans leurs fenêtres respectives mutt et profanity.

Enfin, je crée une nouvelle fenêtre "educ" que je divise en 2 (split-window) pour y afficher mes cours avec le gestionnaire de fichiers rover.

La dernière ligne permet d'afficher tmux dans xterm.

La configuration

Pour retrouver les mêmes habitudes, peu importe la machine sur laquelle je me retrouve, j'essaie au maximum d'utiliser les raccourcis par défauts.

J'ai bien évidemment réalisé quelques ajustements, mais je dois avouer qu'on se fait très bien aux raccourcis de tmux au départ un peu étonnants (ctrl-b par exemple).

Voici ma configuration :

set-option -g base-index 1    # my keyboard start from 1 at the left
set-option -g escape-time 0   # vi
set-option -g history-limit 50000
set-option -g default-command "/bin/ksh"
set-option -g default-terminal tmux-256color
set-option -g mouse on
set-option -g status-interval 10
set-option -g status-right-length 142
set-option -g status-right '#{?client_prefix,#[fg=green#,bg=black] PREFIX,#(bin/status)}'

Je veux que la numérotation commence à 1, pas à 0.

Ensuite, je retire le délai avant de prendre en compte la touche echap, que j'utilise très souvent avec vi.

La dernière ligne permet de définir une barre de status simple que je détaillerai ensuite. "PREFIX" est affiché lorsque j'ai entrée ctrl-b, ça évite les étourderies.

Voici maintenant les raccourcis que j'ai rajouté :

# map prefix to 'C-space', disabled
#unbind C-b
#set-option -g prefix C-space
#bind-key C-space send-prefix
# vi <3
set -g mode-keys vi
set -g status-keys vi
# à la dwm keybinds : resize with HJKL, select with hjkl.
bind -r H resize-pane -L 2
bind -r J resize-pane -D 2
bind -r K resize-pane -U 2
bind -r L resize-pane -R 2
bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R
# move to urgent window
bind a previous-window -a
# last window
bind Tab select-window -l
# copy-mode : v
bind v copy-mode 
# copy whole visible pane in new buffer, choose with "#"
bind y capture-pane -N -J
# split in same directory
bind c new-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
# Save buffer also in X clipboard
bind -T copy-mode-vi 'y' send -X copy-pipe-and-cancel \
  'xclip -i -selection clipboard'
bind -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel \
  'xclip -i -selection clipboard'
bind -n MouseDown2Pane run \
  'tmux set-buffer "$(xclip -o -selection clipboard)";tmux paste-buffer'

J'ai laissé en exemple au début une façon d'utiliser ctrl-space au lieu de ctrl-b pour préfixe.

Je définis très rapidement des raccourcis ressemblant à ceux de vi, par habitude.

Le status

Voici le script pour afficher les infos en bas à droite :

fs_perc()
{
    df -h $1 | awk 'NR==2 {print $5}'
}
get_vol()
{
	sndioctl output.level | awk -F = '{printf "%d\n",$2*100}'
}
loadavg()
{
	sysctl -n vm.loadavg
}
bat()
{
	#apm | awk 'NR==1 && !/absent/ {printf " ⚡%s", $4}'
	test $(apm -a) -eq 0 && printf "⚡%s%%" $(apm -l)
}
printf "%s  %s  💽 %s  🔉 %s  %s" \
     "$(mpd-status)"\
     "$(bat)" \
     "$(fs_perc /home)" \
     "$(get_vol)%" \
	 "$(date "+📆 %Y-%m-%d 🕓 %H:%M ")"

Le script mpd-status est le suivant :

#!/bin/sh
mpc | awk '
(NR == 1) { 
	status = $0
	if (length(status) > 42) {
		status = substr($0, 1, 42) "..."
	}
}
(NR == 2) && /playing/ {
    isplaying = 1
}
END { if (isplaying) { printf "♪ %s \n", status } }
'

Le mot de la fin

Comme pour awk, je regrette de ne pas avoir pris le temps de me familiariser avec tmux plus tôt. Je vous invite donc à le faire ;)

Une réaction?

Envoyez votre commentaire par mail.
Mode d'emploi de la liste de diffusion pour recevoir les réponses.