# Comment j'utilise tmux ? 2021-12-17T11:16:39Z 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 : * De diviser l'écran en plusieurs parties, * De copier/coller du texte sans avoir besoin de la souris * De garder la session disponible même si le terminal est fermé par inadvertance * D'automatiser le lancement de tâches : scripter son terminal. Vous remarquerez certainement de nombreuses similitudes avec la configuration de Roman Zolotarev. => https://www.romanzolotarev.com/openbsd/tmux.conf Configuration tmux de Roman Zolotarev Au fait, tmux est présent de base dans OpenBSD :) ## Ça ressemble à quoi ? => /img/log/tmux-shot.png 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 : ```script shell starttmux #!/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 : ```configuration de tmux 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é : ```suite de la configuration de tmux # 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. * H/J/K/L permet de redimensionner les panneaux * h/j/k/l permet de sélectionner les panneaux souhaités * Tab permet de retourner à la fenêtre précédente : cela imite le comportement de dwm * "a" focalise la fenêtre urgente. Pratique quand un message arrive dans profanity par exemple * Pour entrer en mode copie, je définis la touche "v" plutôt que "[", c'est un vrai caprice. * "y" me permet de copier tout le contenu d'un pane. Je peux sélectionner cette portion de texte ensuite avec "#" lorsque je suis en mode copie. * Suivent des options me permettant d'ouvrir de nouvelles fenêtres ou pane dans le même dossier que celui actuel. Cela me semblait plus logique que de devoir à chaque fois me déplacer dans le dossier dans lequel j'étais juste avant d'ouvrir un nouveau shell. Dans les rares cas où je n'en a pas besoin, c'est plus rapide d'entrer "cd" pour revenir dans mon $HOME que d'entrer tout le chemin vers le dossier courant. * Enfin j'ai piqué à Roman Zolotarev la configuration pour que ce que je copie avec tmux soit aussi dans le presse-papier de la session X, si j'en utilise une... Ça ne m'est pas très utile, mais c'est plus naturel lorsque je colle du texte dans firefox après l'avoir copié dans tmux. ## Le status Voici le script pour afficher les infos en bas à droite : ```script shell 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 : ```mpd-status script #!/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? => mailto:bla@bla.si3t.ch?subject=comment-jutilise-tmux Envoyez votre commentaire par mail. => /log/commentaires/ Mode d'emploi de la liste de diffusion pour recevoir les réponses.