Comment obtenir tmux pour ouvrir un ensemble de volets sans les saisir manuellement?

30

Donc, je veux créer une tmuxsession spécifique au projet qui affiche automatiquement certaines commandes dans certains volets. Après un tutoriel en ligne et la tmuxpage de manuel, voici ce que je propose pour un fichier de configuration:

new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

Le résultat est ... rien. tmuxdémarre avec une seule fenêtre et un seul volet dans cette fenêtre sans aucune commande exécutée.

Comment pourrais-je créer un fichier de configuration qui me permette de créer un ensemble de fenêtres et de volets avec certaines commandes pré-exécutées?

JUSTE MON AVIS correct
la source

Réponses:

36

Votre fichier de configuration fonctionne, mais il y a quelques complications.

Commandes de courte durée

Tout d'abord, les commandes que vous lancez (instances de ls ) finissent de s'exécuter très rapidement. Les fenêtres et volets des commandes sont créés, mais ils disparaissent dès que chaque commande se termine.

Si votre objectif est d'utiliser réellement de telles commandes «one shot» dans votre configuration éventuelle, vous devriez probablement utiliser l'option window remain-on-exit(et éventuellement l'option session set-remain-on-exitpour fournir une valeur par défaut pour toutes les fenêtres créées dans la session). Lorsque remain-on-exitest défini pour une fenêtre, il ne disparaîtra pas à la fin de la commande. Vous voudrez probablement mapper le respawn-windowà une clé (note: respawn-windowréapparaîtra la commande d'origine; respawn-paneest également disponible dans tmux 1.5 pour réapparaître des volets individuels).

bind-key R respawn-window

# set global r-o-e so that initial window of initial session gets it
set -g set-remain-on-exit on

# create a session and its windows/panes
new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# restore global r-o-e
set -g set-remain-on-exit off

# let session r-o-e inherit from global value for future windows
set -u set-remain-on-exit

Ou, si cela ne vous dérange pas que votre fenêtre initiale soit le numéro 1 au lieu du numéro 0, nous pouvons éviter de changer la valeur globale:

bind-key R respawn-window

# create a session with a throw-away window
new true

# for future windows, stay open after the command exits
set set-remain-on-exit on

# create the windows we really want
neww -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# for future windows, revert r-o-e to global value
set -u set-remain-on-exit

Si vous utilisiez uniquement lsune commande d'espace réservé simplifiée et que vous avez réellement l'intention de générer un certain type de commande interactive dans vos fenêtres / volets, alors vous devriez probablement générer la commande que vous aviez l'intention d'exécuter. Si votre commande destinée prend trop de temps pour le démarrage de l' utiliser pendant tmux test, puis remplacer une coquille ou une autre commande interactive simple (par exemple top, sqlite3etc.).

new-session Est la commande par défaut

Deuxièmement, exécuter tmux sans argument de commande (par exemple tmux) équivaut à utiliser la new-sessioncommande (c'est tmux-à- dire la même chose que tmux new-session). Votre .tmux.confcrée une session pour ses fenêtres / volets ( newest un alias pour new-session) et une autre session est créée pour la new-sessioncommande implicite spécifiée en démarrant tmux sans argument de commande. Si vous utilisez la barre d'état par défaut, vous verrez un [1]dans le côté gauche de la barre d'état lorsque vous êtes dans la session «supplémentaire» (la session initiale créée dans le .tmux.confnuméro est 0).

Si vous voulez éviter de créer la session supplémentaire, utilisez tmux attachplutôt que plain tmux. Les commandes de votre .tmux.confseront exécutées, créant la session 0, puis votre client s'attachera à cette session au lieu d'en créer une nouvelle.

Chris Johnsen
la source
2
OK, je suis peut-être aussi épais qu'un sandwich aux baleines ici, mais en ce moment, j'ai un fichier de configuration qui ne contient que splitwça - rien d'autre - et je n'ai toujours pas d'écran partagé parce qu'il le dit impossible d'établir la session en cours. Si j'ajoute newavant, j'obtiens ... une fenêtre, un volet. Je ne peux pas sembler, pour la vie de moi, obtenir deux volets au démarrage.
JUSTE MON AVIS correct
1
Un fichier de configuration avec new, puis splitwfonctionne pour moi lorsque je démarre tmux via tmux attach. Une chose à retenir est que le .tmux.conf(ou le fichier spécifié avec l' -foption) n'est utilisé que si aucun serveur n'est déjà en cours d'exécution. Vérifiez si un serveur fonctionne via tmux ls. Si vous souhaitez exécuter les commandes à partir d'un fichier lorsqu'un serveur est déjà en cours d'exécution, faites-le comme ceci: tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach(si vous l'exécutez en l'absence de serveur, votre .tmux.conf(ou le -ffichier) s'exécutera en premier, puis votre source-filefichier).
Chris Johnsen
Le fichier de configuration est spécifié avec -f - donc je vais tmux new -f myconfig. Le contenu de ce fichier de configuration contient uniquement new suivi de splitw. Je tue tous les processus tmux avant d'essayer la ligne de commande tmux -f myconfig. Je n'ai pas deux volets. Je ne sais vraiment pas quoi faire après ce point (à part abandonner simplement tmux).
JUSTE MON AVIS correct
4
@Just: Que vous utilisiez -fou non, tmuxsans argument de commande, c'est la même chose que tmux new-session(qui, pour les nouveaux serveurs, créera une nouvelle session en plus de ce que fait votre fichier de configuration). Votre fenêtre de prédécoupage est créée dans la session 0, mais la new-sessioncommande implicite crée (et attache à) une session supplémentaire (session 1; recherchez la [1]dans votre ligne d'état). Utilisez tmux -f myconfig attachpour éviter de créer la nouvelle session qui cache votre fenêtre pré-scindée.
Chris Johnsen
1
OK, je suppose qu'apprendre à lire finira par payer pour moi. :) Merci pour l'effort et la réponse. Tout fonctionne bien maintenant. Je souhaite qu'il y ait ici une réputation de "pot à pourboire" afin que je puisse vous donner plus qu'une simple réponse acceptée.
JUSTE MON AVIS correct
9

Je ne suis pas sûr de comprendre ce que vous entendez par "entrer manuellement", mais c'est ainsi que je le fais. J'ai écrit un script "autostart" que mon gestionnaire de fenêtres lance. Il contient:

tmux start-server                                                                                                                                                                                                                                                                                                                                                            
for i in ~/sessions_tmux/*.session; do "$i"; done

où chaque fichier .session ressemble à ceci:

#!/bin/bash

SESSION_NAME="flaskr_tutorial"
if [[ ! -z "$TMUX" ]] || [[ ! -z "$TMUX_PANE" ]]; then
    echo "Already inside a tmux session, do not know what to do"
    exit 1
fi
tmux -q has-session -t "$SESSION_NAME"
if [ $? ]; then
    exit 0
fi
NEWCWD=~/projects/flaskr/
( cd "${NEWCWD}"; tmux new-session -d -s "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'vim flaskr.py' Enter
( cd "${NEWCWD}"; tmux split -h -t "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'sudo tail -F -n 100 /var/log/messages | ccze' Enter

Attendez, il y a plus! J'ai un nombre toujours croissant de fichiers .session que je charge avec konsole:

konsole --background-mode --profile Shell --tabs-from-file ~/sessions_tmux/work_console.tabs

où work_console.tabs ressemble à ceci:

.
.
.
title: projectx;;    command: tmux attach -t projectx
title: flaskr;;      command: tmux attach -t flaskr_tutorial
.
.
.

Ensuite, j'appuie sur F12 pour lancer konsole.

John Schmitt
la source
konsole semble être cassé, donc je suis passé à Terminal , qui fonctionne bien. J'ai un plus détaillé après sur les utilisateurs tmux-liste de diffusion.
John Schmitt
1
Juste un petit commentaire, vous pouvez remplacer '! -z 'avec' -n 'dans vos tests;)
lilorox
6

supposons que vous vouliez lancer 3 tâches de surveillance du serveur (ici ping localhost), il n'est pas nécessaire de jouer avec les fichiers de configuration et les sessions enregistrées. Tout cela peut être fait à partir de la ligne de commande.

tmux new-session 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    select-layout even-vertical
Jasen
la source
Merci pour la simplicité - exactement l'exemple que je cherchais!
dsz
5

J'ai trouvé teamocil très utile pour automatiser les fenêtres / sessions tmux.

Son écrit en Ruby vous avez donc besoin que installé.

Voici un exemple de configuration:

session:
  name: 'my project'
  windows:
    -name: vim
     root: '~/code/my_project'
     splits:
       - cmd: vim
       - cmd: guard

Vous pouvez avoir un arrangement de fenêtres et de séparations.

Kris
la source
4

Une autre alternative similaire à teamcoil est tmuxinator , elle est en développement actif et fonctionne assez bien. Il est également recommandé (et le type de revue) sur l'incroyable tmux: productive souris sans développement de la Bibliothèque Pragmatique .

Pablo Olmos de Aguilera C.
la source
Je l'ai trouvé un peu plus propre que teamocil (mais très similaire néanmoins) et je l'utilise en ce moment. Je suis assez content de son fonctionnement!
Aktau
4

**

  • Mieux vaut sauvegarder votre session!

** J'ai trouvé que pour un administrateur paresseux comme moi, je préfère enregistrer la session de tmux, plutôt que de passer des heures à essayer de le construire parfaitement. J'administre plus de 30 serveurs et mes sessions tmux sont dynamiques, la configuration changeant tout le temps. C'était une douleur dans le cou, jusqu'à ce que je découvre récemment que tmux-resurrect ce plugin est tout simplement génial. Essaie. Actuellement, les référentiels Ubuntu ont tmux 1.8, ce plugin a besoin de 1.9, vous devez donc mettre à niveau manuellement

sudo apt-get install python-software-properties software-properties-common
sudo add-apt-repository ppa:pi-rho/dev
sudo apt-get update
sudo apt-get install  tmux=2.0-1~ppa1~t

Après quoi, vous pouvez l'installer en

git clone https://github.com/tmux-plugins/tmux-resurrect ~/clone/path

Ensuite, ajoutez cette ligne au bas de ~ / .tmux.conf (si ~ / .tmux.conf n'est pas disponible, créez un fichier vide)

run-shell ~/clone/path/resurrect.tmux

J'ajoute également cette ligne à la fin du ~ / .tmux.conf pour que le plugin enregistre les sessions pour tous les programmes que j'exécute

set -g @resurrect-processes ':all:'

Rechargez ensuite l'environnement tmux.

tmux source-file ~/.tmux.conf

C'est ça! Vous avez terminé. Maintenant, lancez tmux comme d'habitude, redimensionnez vos volets, créez de nouveaux volets, créez de nouvelles sessions ... etc. Lorsque vous êtes satisfait de la configuration que vous avez atteinte (dans plusieurs fenêtres et plusieurs sessions), cliquez simplement sur ctrl + b puis sur ctrl + s pour enregistrer la session. Afin de tester les résultats, il suffit de tuer tous les tmux

killall tmux

Ensuite, exécutez à nouveau tmux

tmux

Ensuite, depuis tmux, cliquez sur ctrl + b puis sur ctrl + r (pour la restauration). Magiquement, toutes vos fenêtres, volets et sessions sont restaurés avec la même géométrie et la même disposition. J'espère que cela vous aidera.

user1757247
la source