tmux
                     
                    Une introduction pratique  ;-) 
                 
                
                    
                        Appuyez sur [s]  pour ouvrir les notes présentateur  dans une nouvelle fenêtre. 
                    
                    
                        Je vais essayer d'ajouter ici, pour certains slides, des points que j'ai pu donner à l'oral lors de la présentation et/ou qui ne sont pas explicitement écrits sur les slides — afin de les rendre plus utiles aux lecteurs qui n'auraient pas assisté à la présentation.
                        Le style sera volontairement un peu oral , se rapprochant un peu de ce qui s'est dit lors de la présentation live .
                     
                 
                
                    Qui ? 
                    
                    
                        Ces slides ont été utilisés comme support lors d'une présentation de tmux pour
                        mes collègues de TEA fin 2014.
                     
                 
                
                    Introduction 
                    
                        
                            Une petite introduction : tmux, screen, qu'est-ce qu'un Terminal Multiplexer , à quoi ça peut servir ? 
                         
                     
                 
                
                    tmux ? 
                    
                    
                        
                            Aujourd'hui, principalement, présentation de tmux 
                            Version récente  = 1.8 
                            Voire même 1.9 ;-) 
                         
                     
                 
                
                    Terminal multiplexer 
                    
                        Plusieurs sessions de terminaux sur une seule session [distante] 
                        Persistance 
                        Plusieurs fenêtres 
                        Partage de sessions 
                     
                    
                        
                            Persistance : on peut lancer une session depuis une machine, déconnecter, s'y rattacher depuis une autre machine et retrouver sa session. 
                            Chaque session / fenêtre fait tourner sa propre application (on peut brancher des onglets ) et a son propre buffer de scrollback. 
                            Plusieurs sessions peuvent être lancées sur la même machine et plusieurs utilisateurs peuvent contrôler la même session. 
                         
                     
                 
                
                    Usage classique 
                    
                        SSH
                            
                                lancement de tmux 
                                travail 
                             
                         
                        Déconnexion. 
                        Re-connexion SSH
                            
                                on retrouve la session tmux 
                             
                         
                        SSH depuis une autre machine : idem ! 
                        Marche aussi en local ;-) 
                     
                    
                        
                            La déconnexion peut être voulue... ou non... 
                            Et quand elle n'était pas voulue, on est content de retrouver sa session ; et que les programmes en cours n'aient pas été interrompus ! 
                         
                     
                 
                
                    GNU Screen ? 
                    
                        Stable Fonctionnalités reprises / améliorées par Tmux
                            
                                Quelques trucs  avancés 
                                Configuration vraiment  plus simple 
                             
                         
                        Mais
                            
                                Tmux n'est pas un remplacement drop-in  
                                Commandes différentes 
                             
                         
                     
                    
                        
                            Screen : 1ère version en 1987 
                            Tmux : 1ère version en 2009. Inclu de base dans OpenBSD ; disponible sur les repos des distributions Linux 
                            Tmux a un mode souris  
                            Configuration de screen = infernal ^^ 
                            La première grosse  différence = la  touche de commande... 
                         
                     
                 
                
                    Notions 
                    
                        
                            Quelques notions de base 
                            Session / Window / Pane 
                            Lancer, détacher, attacher + sessions nommées 
                            Cible : tmux >= 1.8 
                         
                     
                 
                
                    Session 
                    Lancer une nouvelle session
                    
$ tmux
                    
$ tmux new -s NOM_SESSION
                    
                        
                            Tout se fait au sein d'une session. 
                            La lancer est donc un peu une étape obligatoire  
                         
                     
                 
                
                    Quitter une session 
                    
                        Quitter tous les programmes exécutés dans la session 
                        Shell bash : exit ou Ctrl  + D  
                     
                    
                        
                            Si plus aucun programme ne tourne dans la session, elle n'a plus de raison d'être. 
                            Le shell (bash / zsh / ...) est un programme ;-) 
                            Pour quand on aura parlé des commandes  : :kill-session 
                         
                     
                 
                
                    Touche de commande 
                    
                        Nombreuses commandes 
                        Raccourcis clavier : CMD  + TOUCHE  
                        Par défaut : Ctrl  + B TOUCHE  
                     
                    
                        
                            Pour éviter d'interférer avec d'autres programmes : on ne peut pas juste  jouer des raccourcis clavier, il faut les introduire  – jouer une combinaison de touches. 
                         
                     
                 
                
                    Touche de commande 
                    Souvent remappée
                    Ctrl  + A TOUCHE 
                    
                        
                            Ctrl  + A  était la touche de commande de screen.Elle est souvent utilisée sous tmux, notamment par ceux qui avaient utilisé screen auparavant. 
                            Peut-être un risque de conflit avec vim ? 
                         
                     
                 
                
                    Touche de commande 
                    Pour la suite de cette présentation
                    CMD TOUCHE 
                    
                        
                            Pour éviter le débat Ctrl + B/A, utilisons CMD dans la suite de ces slides ^^ 
                            Avec CMD Ctrl  + B  ou Ctrl  + A , selon votre configuration. 
                         
                     
                 
                
                    Historique 
                    
                        Mode "texte", pas de molette pour scroller. 
                        CMD  + [ 
                            
                                Page-Up Page-Down Quitter : q  
                             
                         
                    
                        
                            Nous verrons plus loin qu'il existe un mode souris , qui permet de scroller (notamment) à la souris. 
                         
                     
                 
                
                    Détacher une session 
                    CMD  + d 
                    
                        Détache le terminal de la session tmux. 
                        La session continue son exécution en arrière-plan . 
                        Les programmes continuent leur exécution ! 
                     
                    
                        
                            Importance de penser à fermer les sessions inutiles (et pas juste les détacher), pour éviter d'avoir 36k trucs qui tournent sans que personne ne les voit. 
                            Y compris quand on a été déconnecté : reconnecter, rattacher, tout fermer. 
                         
                     
                 
                
                    Lister les sessions 
                    
$ tmux list-sessions
                    
$ tmux ls
                    
                        Aucune session, 
                        ou une session 
                        ou plusieurs sessions ;-) 
                     
                    
                        
                            Ou aussi la commande :list-sessions 
                         
                     
                 
                
                    Attacher une session 
                    
$ tmux attach
                    
$ tmux attach -t NOM_SESSION
                    
$ tmux a [-t NOM_SESSION]
                    
                        Attache le termination à une session tmux. 
                        On retrouve la session ! 
                        Plusieurs terminaux – et plusieurs personnes – peuvent être attachés à la même session ! 
                     
                    
                 
                
                    Tuer une session 
                    
$ tmux kill-session -t NOM_SESSION
                    
                        
                            Ferme tous les programmes qui s'exécutaient dans la session, puis ferme la session elle-même. 
                         
                     
                 
                
                    Naviguer entre sessions 
                    CMD  + s 
                    
                        
                            Affiche un menu qui permet de choisir la session qu'on veut. 
                            On peut aussi renommer la session courante, avec CMD  + $ , si on ne l'avait pas nommée lors de sa création. 
                         
                     
                 
                
                    Commandes 
                    CMD  + :  COMMANDE
                    Exemples :
                    
:set status-bg white
:set-option history-limit 16000
:set -g prefix C-a
:bind-key C-a last-window
                    
                        
                            Pas mal de commandes peuvent être utilisées directement avec le programme tmux, comme :list-sessions. 
                         
                     
                 
                
                    Bilan 
                    
                        Vous savez lancer une session (y compris nommée ). 
                        La détacher / ré-attacher. 
                        La fermer pour de bon. 
                        C'est suffisant pour commencer à utiliser tmux ! 
                     
                    
                        
                            On peut faire plein de choses qui vont plus loin, mais en les apprenant sur le tas  au fur et à mesure de l'usage. 
                            Imprimer une cheat-sheet  avec les raccourcis claviers utiles et la garder pas loin du clavier peut aider ;-) 
                         
                     
                 
                
                    Sessions, 
                    
                        
                            Pour l'instant, on a fait simple en ne manipulant que de sessions. Mais une session permet d'avoir bien plus qu'un seul programme actif. 
                         
                     
                 
                
                    Imbrication 
                    
                        Plusieurs sessions 
                        Contenant plusieurs fenêtres  (windows) 
                        Contenant plusieurs panneaux  (panes) 
                     
                    
                        
                            Bien sûr, libre à chacun d'utiliser ou non plusieurs windows et de positionner ou non plusieurs panes dedans. 
                            Désolé, j'emploirai de façon un peu mélangée les termes window  et pane  et leurs traductions françaises. 
                         
                     
                 
                
                    Session 
                    
                        Ce à quoi on attache un terminal. 
                        Peut être attachée par plusieurs personnes en même temps. 
                        Contient une ou plusieurs window(s). 
                        Usage : un thème  global
                            
                         
                     
                    
                 
                
                    Window 
                    
                        Correspond à un affichage, plein écran . 
                        Souvent assimilé à un onglet
                            
                                car représenté comme tel par défaut 
                             
                         
                        Contient un ou plusieurs pane(s). 
                        Usage : un projet  au sein du thème
                            
                                "backend" 
                                "temp" 
                                "exploitation" 
                             
                         
                     
                    
                 
                
                    
                        
                            1 window "root" 1 window monitoring : htop + nethogs + dstat 
                            1 window project backend : commandes + tig 
                            1 window mysql 
                         
                     
                 
                
                    
                        
                            1 window "root" 
                            1 window monitoring : htop + nethogs + dstat 
                            1 window project backend : commandes + tig 
                            1 window mysql  
                     
                 
                
                    Pane 
                    
                        La plus petite unité, une portion d'une window et de l'affichage. 
                        On travaille toujours dans un pane. 
                        Un ou plusieurs pane(s) par window. 
                        Usage : une vue  du projet
                            
                                "historique git" 
                                "error_log" 
                                "acces_log" 
                             
                         
                     
                    
                 
                
                    
                        
                            1 window "root" 
                            1 window monitoring : htop + nethogs + dstat 1 window project backend : commandes + tig 
                            1 window mysql 
                         
                     
                 
                
                    Windows 
                    
                        Nouvelle : CMD  + C  
                        Renommer : CMD  + ,  
                        Liste : CMD  + w  
                     
                    
                        
                            Le premier sert souvent. 
                            Le deuxième plus rarement, parce qu'on peut configurer tmux pour que les windows prennent le nom de leurs programmes en cours. 
                            Le dernier à peu près jamais : les windows sont souvent affichées, un peu sous forme d'onglets. 
                         
                     
                 
                
                    Windows 
                    
                        Sélectionner : CMD  + NUMERO  
                        Précédente : CMD  + p  
                        Suivante : CMD  + n  
                        Précédemment active : CMD  + l  
                     
                    
                        
                            Marche bien quand les numéros vont de 0 à 9 – ou de 1 à 9 si on a re-paramétré la numérotation pour correspondre à un clavier. 
                            Précédemment active est souvent remappée en CMD  + a  ou même en CMD  + CMD-a  
                         
                     
                 
                
                    Windows 
                    Mes raccourcis
                    
                        Droite : MAJ  + →  
                        Gauche : MAJ  + ←  
                     
                    
                        
                            Avec les windows représentées sous forme d'onglets en bas de l'écran, je trouve ça plus intuitif. 
                            Même si j'utilise parfois CMD  + NUMERO  pour aller loin  d'un côté ou de l'autre. 
                         
                     
                 
                
                    Windows 
                    
                        Tuer : CMD  + &  
                        Déplacer : CMD  + .  (demande de numéro) 
                        Déplacer : CMD  + :move  (déplace au prochain numéro libre) 
                     
                    
                 
                
                    Panes 
                    
                        Plusieurs panes  dans une window . 
                        Découpage horizontal ou vertical. 
                        Taille réglable. 
                     
                    
                 
                
                    
                        
                            Oui, ça fait un peu beaucoup pour être réellement pratique... C'est uniquement un exemple ^^ 
                            En général, je me limite à deux panes, même sur un grand écran, parce que j'aime avoir de la place – sauf quand il s'agit de monitorer plusieurs programmes / logs (en avoir plusieurs à la fois sous les yeux peut être pratique). 
                         
                     
                 
                
                    Panes 
                    
                        Découpage horizontal :
                            
                                CMD  + % CMD  + -  (ma config) 
                         
                        Découpage vertical :
                            
                                CMD  + " CMD  + |  (ma config) 
                         
                     
                    
                        
                            % et " ne sont pas tellement instinctifs ... 
                            Alors que - et | sont tellement plus logiques ! 
                            Et avec - et |, les deux types de découpages sont accessibles par la même touche du clavier (sur PC azerty, du moins). 
                         
                     
                 
                
                    Panes 
                    
                        Naviguer : CMD  + o  
                        Par numéros : CMD  + q  + NUM  
                        Tuer : CMD  + x  
                        Différents layouts : CMD  + ESPACE  
                        Left / Down / Up / Right : CMD  + h  / j  / k  / l  
                     
                    
                        
                            En pratique, je n'utilise jamais ces raccourci, je préfére les miens . 
                         
                     
                 
                
                    Panes 
                    Mes raccourcis
                    
                        Droite : Alt  + →  
                        Gauche : Alt  + ←  
                        Haut : Alt  + ↑  
                        Bas : Alt  + ↓  
                     
                    
                        
                            Donc, avec ma  configuration, c'est MAJ+flèches pour les windows et Alt+flèches pour les panneaux. 
                         
                     
                 
                
                    Panes 
                    
                        Break : CMD  + !  
                        Bascule full-window : CMD  + z  
                        Déplacer un pane vers gauche / droite : CMD  + {  / }  
                     
                    
                        
                            Break pane = en faire sa propre window. 
                            Basculer (temporairement) un panneau en plein écran est pratique pour sélectionner à la souris sans avoir la barre de séparation de panneux ou les autres panneaux qui se retrouvent aussi sélectionnés. 
                         
                     
                 
                
                    Panes 
                    Redimensionner
                    
                        :  resize-pane -R 10:  resize-pane -L 10:  resize-pane -U 10:  resize-pane -D 10 
                    
                        
                            Ca peut être mappé vers des raccourcis comme CMD  + <  ou CMD  + >  
                         
                     
                 
                
                    Un peu plus ? 
                    
                        
                            En gros, ce qu'il faut savoir pour un usage standard  ⇒ cf plus haut ! 
                            Un peu de configuration, fichier .tmux.conf 
                            Quelques commandes : redimensionnement, automatisations, ... 
                         
                     
                 
                
                    À l'aide ? 
                    
                    
                        
                            Affiche la liste des raccourcis clavier actuellement branchés. 
                            Il y en a un sacré paquet ;-) 
                         
                     
                 
                
                    .tmux.conf
                        Fichier de configuration par défaut
                            
                         
                        Sinon :
                            
                                tmux -f ~/.tmux.conf [new / attach / ...] 
                         
                        Contient des commandes.
                            
                                Les mêmes que celles utilisables via CMD  + :  COMMANDE 
                             
                         
                     
                    
                        
                            Mon conseil : partir d'un fichier pas trop long et l'enrichir au fur et à mesure, en ne prenant que des choses dont on a besoin / qu'on utilise. 
                         
                     
                 
                
                    Mon .tmux.conf 
                    gist.github.com/pmartin/1b35fc2214b9cac8f205 
                    
# Bindings de keys
set -g prefix C-a
set-window-option -g mode-keys vi
bind-key C-a last-window
# Changement de fenêtre avec Maj + Flèches
bind -n S-Left previous-window
bind -n S-Right next-window
                    
                        
                            Avec pas mal de morceaux copiés ici et là depuis Internet, au fil de l'utilisation. 
                         
                     
                 
                
                    Mon .tmux.conf 
                    gist.github.com/pmartin/1b35fc2214b9cac8f205 
                    
# Changement de panneau avec raccourcis style Vi
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Changement de panneau avec Alt + Flèches
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
                     
                
                    Mon .tmux.conf 
                    gist.github.com/pmartin/1b35fc2214b9cac8f205 
                    
# Splitting de window : vertical avec | et horizontal avec -
unbind %
bind | split-window -h
bind - split-window -v
# Longueur de l'historique
set-option history-limit 16000
                     
                
                    Mon .tmux.conf 
                    gist.github.com/pmartin/1b35fc2214b9cac8f205 
                    
# Status bar
set-option -g status-justify "centre"
set -g status-fg white
set -g status-bg black
set -g status-left '#H#[default]'
set -g status-left-fg white
set -g status-left-bg blue
set -g status-right '#[fg=yellow,bold]#(cut -d " " -f 1-4 /proc/loadavg)#[default] #[fg=cyan,bold]%Y-%m-%d %H:%M:%S#[default] '
set -g status-right-fg white
set-window-option -g window-status-current-fg white
set-window-option -g window-status-current-bg red
                     
                
                    Mon .tmux.conf 
                    gist.github.com/pmartin/1b35fc2214b9cac8f205 
                    
# Set window notifications
setw -g monitor-activity off
set -g visual-activity off
# Automatically set window title
set-window-option -g automatic-rename on
set-option -g set-titles on
                     
                
                    Mon .tmux.conf 
                    Je l'ai déployé sur tous nos serveurs sur lesquels je sois passé ;-)
                    
                 
                
                    Autres commandes 
                    
                        :list-windows:find-window TEXTE / CMD  + f ... 
                     
                    
                        
                            Bref, il y a plein de commandes. 
                            Quand vous aurez fait le tour des trucs de base, lisez la doc ;-) 
                         
                     
                 
                
                    Mais encore ? 
                    
                        
                            On peut aller bien plus loin 
                            screencast à base de tmux 
                            tmuxinator 
                            plugins divers 
                            Ré-affecter des windows / panes ? 
                            Mode mouse ? 
                         
                     
                 
                
                    Manipulations avancées 
                    Une multitude de possibilités !
                    
                        Déplacement de windows 
                        Déplacement de panes 
                        Transformation de windows en panes / inversement 
                        ... 
                     
                    
                        
                            Je n'en parle plus que ça : quand vous en serez là, vous trouverez comment faire (et je n'utilise quasiment jamais non plus). 
                         
                     
                 
                
                    Rechercher, copier, coller 
                    Mode copie : CMD  + [ 
                    
                        Rechercher : /  + ENTER  
                        Sélectionner : SPACE  puis flèches 
                        Copier : ENTER  
                        Coller : CMD  + ]  
                     
                    Raccourcis valables en mode vi  :
                    
:set-window-option -g mode-keys vi
                    
                        
                            Certains raccourcis, comme le /  pour rechercher, dépendent du mode : en mode vi  on recherche avec /  alors qu'en mode emacs  on recherche avec Ctrl  + s  
                            Les raccourcis sont différents en mode emacs . 
                            Commandes : list-buffers, show-buffer -b X, paste-buffer -b X 
                         
                     
                 
                
                    Scripting 
                    Commande tmux depuis un shell
                    
tmux new-session -d -s mine
tmux new-window -t mine:1 -n 'root' 'sudo -s'
tmux new-window -t mine:2 -n 'monitoring' 'htop'
tmux new-window -t mine:3 -n 'projects' 'bash'
tmux send-keys -t mine:3 'cd ~/developpement' C-m
tmux select-window -t mine:3
tmux -2 attach-session -t mine
                    
                        
                            Crée une session (détachée) nommée mine. 
                            Crée quelques windows (d'ids 1 à 3) et y lance des commandes. 
                            Tape  une instruction dans la window d'id 3.Sélectionne la window d'id 3. 
                            Attache la session. 
                         
                     
                 
                
                    Scripting 
                    Créer ou attacher une session
                    
#!/bin/bash
NAME='pmn'
tmux has-session -t $NAME 2>/dev/null
if [[ $? -eq 1 ]]; then
    tmux new-session -d -s $NAME
    tmux new-window -t $NAME:1 -n 'first' 'bash'
    tmux new-window -t $NAME:2 -n 'second' 'bash'
    tmux send-keys -t $NAME:0 'cd ~/developpement' C-m
    tmux select-window -t $NAME:0
fi
tmux attach-session -t $NAME
                    
                        
                            Détermine si la session existe 
                            Si elle n'existe pas :
                                
                                    Crée la session 
                                    Y ouvre quelques windows 
                                    En sélectionne une 
                                 
                             
                            Attache la session 
                         
                     
                 
                
                    Mouse mode 
                    
                        Scroll 
                        Redimensionnement de panes 
                        Sélection de window / pane 
                     
                    
set -g mode-mouse on
set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on
                    Mais : interfère avec sélectionner + middle-clic
                    
                 
                
                    Mouse mode 
                    Mapping pour activer / désactiver
                    
# Toggle mouse on with ^B m
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'
# Toggle mouse off with ^B M
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'
                    
                        
                            Cf cet article  
                            Pratique pour activer quand on en a besoin (pour redimensionner facilement des panes, par exemple) et désactiver quand on veut copier-coller par sélection + middle-clic. 
                         
                     
                 
                
                    tmuxinator 
                    github.com/tmuxinator/tmuxinator 
                    
                        Création de sessions depuis un fichier de configuration. 
                        Liste de windows / panes. 
                        Commandes à lancer dans chaque. 
                        Pratique pour toujours lancer la  même session. 
                     
                    
                        
                            Utile si vous éteignez fréquemment votre PC et voulez pouvoir toujours relancer la même session, contenant les mêmes windows et mêmes panes, organisés de la même manière. 
                         
                     
                 
                
                    tmuxinator 
                    ~/.tmuxinator/demo.yml (1/2)
                    
name: demo
root: ~/
windows:
  - root: sudo -s
  - monitoring:
      layout: 37d4,153x44,0,0{71x44,0,0,32,81x44,72,0[81x22,72,0,35,81x21,72,23,36]}
      panes:
        - htop
        - sudo nethogs wlan0
        - dstat
...
                    
                        
                            tmuxinator new demotmuxninator start demoAstuce : :list-windows pour obtenir les layouts 
                         
                     
                 
                
                    tmuxinator 
                    ~/.tmuxinator/demo.yml (2/2)
                    
...
  - backend:
      layout: c6f6,153x44,0,0{91x44,0,0,33,61x44,92,0,37}
      panes:
        - cd ~/projects/backend
        - tig:
          - cd ~/projects/backend
          - tig
  - mysql:
      layout: main-horizontal
      panes:
        - mysql --user=platnum --password=platnum --host=tea-db platnum
        - mysql --user=warehouse --password=warehouse --host=tea-db warehouse
                    
                        
                            tmuxinator new demotmuxninator start demoAstuce : :list-windows pour obtenir les layouts 
                         
                     
                 
                
                    tmuxinator 
                    Lancer la session demo
                    
tmuxinator start demo
                    ou
                    
mux start demo
                    
                        
                            Quelques autres commandes, je n'en parlerai pas plus, cf doc. 
                         
                     
                 
                
                    Plugins 
                    github.com/tmux-plugins 
                    
                        Gestionnaire de plugins 
                        Quelques plugins
                            
                                Options sensible . 
                                Copie vers le presse-papier système. 
                                Sauvegarde / restauration 
                                ... 
                             
                         
                     
                    
                        
                            Là aussi, je ne fais qu'évoquer l'idée, faites un tour sur la liste de plugins existant pour voir ce qu'ils permettent et comment les installer / utiliser. 
                         
                     
                 
                
                    Au final ? 
                    
                        
                            J'ai fait le tour de tout ce que je voulais dire. 
                            Avec une présentation des fonctionnalités de base, mais aussi de points plus avancés. 
                         
                     
                 
                
                    Tmux, c'est bien ! 
                    
                        On retrouve sa session en cas de déconnexion. 
                        Peu de raccourcis à connaître pour commencer. 
                        ("mon") .tmux.conf facilite ceux-ci. 
                        Usage plus avancé possible. 
                        Je ne m'en passe plus !