#+TITLE: Introduction à /Tmux/
#+AUTHOR: Marc Fuentes
#+EMAIL: marc.fuentes@inria.fr
#+DATE: 11/02/2016
#+STARTUP: content hidestars inlineimages

Collègue, Camarade,
bienvenue à toi dans la bidouille

Ce fichier est disponible en ligne à
	[[http://sed.bordeaux.inria.fr/org/tmux.org]]
* Buts de ce « Midi de la Bidouille »
 - se connecter/ se deconnecter à une session en tâche de fond
 - gérer plusieurs fenêtres dans un même terminal
 - travailler avec des sous-fenêtres
 - faire des copiés/collés entre fenêtres 
 - scripter tmux
 - une application à gdb

* Configuration 
** Si tu veux une config quasiment identique à l'original
#+BEGIN_SRC shell
echo set-option -g prefix C-a >>~/.tmux.conf
echo bind-key C-a send-prefix >>~/.tmux.conf
echo unbind-key C-b >>~/.tmux.conf
echo "bind-key r source-file ~/.tmux.conf \\; display \"config rechargée\" ">>~/.tmux.conf
#+END_SRC
** Sinon deux configurations un peu plus élaborées qui nécessitent de modifier le bashrc sont 
disponibles : 
 - Avec le mode *vi* pour se deplacer
   #+BEGIN_SRC shell
   wget https://raw.githubusercontent.com/aitzkora/nahasketa/master/tmux/tmux_vim
   cp tmux_vim ~/.tmux.conf
   wget https://raw.githubusercontent.com/aitzkora/nahasketa/master/tmux/a_rajouter_au_bashrc
   cat a_rajouter_au_bashrc >>~/.bashrc
   #+END_SRC
 - Avec le mode «classique » pour se deplacer
   #+BEGIN_SRC shell
   wget https://raw.githubusercontent.com/aitzkora/nahasketa/master/tmux/tmux_std
   cp tmux_std ~/.tmux.conf
   wget https://raw.githubusercontent.com/aitzkora/nahasketa/master/tmux/a_rajouter_au_bashrc
   cat a_rajouter_au_bashrc >>~/.bashrc
   #+END_SRC
* Lancer une session  / se connecter à une session
** Dans un terminal, lancez tmux
   #+BEGIN_SRC shell
     tmux -2 # pour autoriser le mode 256 couleurs
   #+END_SRC
** voir les sessions tmux 
   #+BEGIN_SRC shell
     tmux ls 
   #+END_SRC
** se connecter à une session existante : dans un *autre* terminal
   #+BEGIN_SRC shell
     tmux at -t 0 # 0 est ici le numéro de la session
   #+END_SRC
** se deconnecter 
  - taper « C-a d »
** exemple sur *plafrim* «en direct»
  - se connecter à *plafrim*
  - lancer tmux 
  - lancer un job dans la session
  - se detacher
  - se deconnecter de *plafrim*
  - se reconnecter sur la *même* machine
  - se reconnecter à la session précédente

* Gérer plusieurs fenêtres 
  
 - «C-a c » : crée une nouvelle fenêtre
 - «C-a n » : bascule à la fenêtre suivante
 - «C-a p » : bascule à la fenêtre précédente
 - «C-a & » : supprimer une fenêtre 
 - «C-a f » : recherche une fenêtre
 - «C-a C-t » : retour a la fenêtre antérieure (« C-a l » dans la config de base)
 - «C-a 1 » : va à la fenêtre 1
 - «C-a 2 » : va à la fenêtre 2
 - «C-a <nb> » : va à la fenêtre <nb>
 
* Travailler avec des sous-fenêtres

 - «C-a " » : divise horizontalement une fenêtre
 - «C-a % » : divise verticalement une fenêtre - n'existe pas dans GNU Screen ^_^ -
 - «C-a x » : supprime une sous-fenêtre 
 - «C-a C-o » : change la disposition des sous-fenêtres
 - «C-a → » : bascule dans la sous-fenêtre à droite
 - «C-a ↑ » : bascule dans la sous-fenêtre en haut
 - 
* Faire des copiés-collés
  
** Pour copier, il faut passer en mode « édition » : 
*** mode classique : 
   - tapes « C-a [ »
   - promênes-toi avec ←, → , ↑, ↓
   - tapes « Espace » au début d'une zone à copier
   - tapes « Entrée » à la fin de la zone
*** mode « vim » :
   - tapes « C-a Escape »
   - promênes-toi avec i, j, k , l
   - tapes « v » au début d'une zone à copier
   - tapes « y » à la fin de la zone
** pour copier tout le contenu d'une sous-fenêtre 
   - tapes « C-a : » puis capture pane
** pour coller (le tampon 0)
   - tapes « C-a ] » en mode classique (« C-a )»  dans la config fournie )
** pour voir les differents tampons 
   - tapes « C-a : » puis list-buffers
** pour coller depuis un tampon
   - tapes « C-a : » puis choose-buffer 
** On peut integrer /Tmux/ avec le presse-papier GNU Linux en rajoutant 
   #+BEGIN_SRC shell
   echo "bind-key C-c run \"tmux save-buffer - | xclip -i -sel clipboard\" ">>~/.tmux.conf 
   echo "bind-key C-v run \"tmux set-buffer \"$(xclip -o -sel clipboard)\"\\; tmux paste-buffer\" ">>~/.tmux.conf
   #+END_SRC
** un greffon de Vim (qui marche aussi avec GNU Screen) permet de faire des copiés-collés rapides
   entre une fenêtre d'édition et une fenêtre de compile
   voir à ce propos le lien [[https://github.com/jpalardy/vim-slime]]
* « Scripter » /Tmux/
 - La plupart des commandes de redimensionnement, d'ouverture de fenêtre, etc... peuvent être executer en mode commande
  « C-a : » ou sur la ligne de commande en précédent de l'executable ~tmux~
 - On peut par exemple dans le gestionnaire de fenêtres associer une touche à l'ouverture d'une fenêtre tmux 
    ~bindsym $mod+m exec tmux neww cmus~ # pour i3 ouvre une nouvelle fenêtre en lançant cmus 
 - à titre d'exemple, on pourra executer le script disponible à l'adresse suivante :
  [[https://github.com/aitzkora/nahasketa/blob/master/tmux/inutil.sh]]
  il utilise :
   - ~select-pane~ pour selectionner une sous-fenêtre
   - ~split-window~ pour couper une fenêtre en deux
   - ~send-keys~ pour envoyer des données sur une sous-fenêtre donnée
* Application au déverminage parallèle
** On peut utiliser tmux pour multiplexer une même entrée de commandes GNU gdb, dans différentes
   fenêtres executant chacune un processus mpi. Pour cela,
    - télécharger le programme suivant 
     #+BEGIN_SRC shell
       wget https://raw.githubusercontent.com/aitzkora/nahasketa/master/tmux/tmux-mpi
     #+END_SRC
    - écrire un script gdb
     #+BEGIN_SRC shell
        vim monscript 
     #+END_SRC
    - lancer plusieurs gdb en parallèle
     #+BEGIN_SRC shell
      tmux-mpi 4 gdb -x ./monscript
     #+END_SRC
    - déverminer en parallèle
