web-dev-qa-db-fra.com

Comment faire en sorte que tmux ouvre un ensemble de volets sans entrer?

Je souhaite donc créer une session tmux spécifique au projet qui affiche certaines commandes dans certains volets de manière automatique. Après un tutoriel en ligne et la page de manuel tmux, 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. tmux dé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?

30

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

Commandes éphémères

Tout d’abord, les commandes que vous démarrez (les instances de ls ) s’exécutent très rapidement. Les fenêtres et les volets des commandes sont créés, mais ils disparaissent dès que chaque commande est fermée.

Si votre objectif est d’utiliser réellement de telles commandes "uniques" dans votre configuration éventuelle, vous devriez probablement utiliser l’option de fenêtre remain-on-exit (et éventuellement l’option de session set-remain-on-exit pour fournir une valeur par défaut à toutes les fenêtres créées dans la session). Lorsque remain-on-exit est défini pour une fenêtre, celle-ci ne disparaît pas à la fermeture de la commande. Vous voudrez probablement mapper le respawn-window à une clé (remarque: respawn-window réapparaîtra la commande d'origine; respawn-pane est é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 bien, si votre fenêtre initiale ne vous dérange pas du numéro 1 au lieu du numéro 0, nous pouvons éviter de modifier 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 ls comme commande d'espace réservé simplifié et que vous avez réellement l'intention de générer un type de commande interactive dans vos fenêtres/volets, vous devriez probablement simplement générer la commande que vous avez l'intention d'exécuter. Si votre commande prévue met trop de temps à démarrer pour pouvoir l’utiliser pendant les tests tmux , remplacez-la par un shell ou une autre commande interactive simple (par exemple, top, sqlite3, etc.). .).

new-session est la commande par défaut

Deuxièmement, exécuter tmux sans argument de commande (par exemple, tmux) équivaut à utiliser la commande new-session (c.-à-d. tmux est identique à tmux new-session). Votre .tmux.conf crée une session pour ses fenêtres/volets (new est un alias pour new-session) et une autre session est en cours de création pour la commande implicite new-session 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 "extra" (la session initiale créée dans le .tmux.conf est le numéro 0).

Si vous souhaitez éviter de créer la session supplémentaire, utilisez tmux attach au lieu de plain tmux. Les commandes de votre .tmux.conf seront exécutées lors de la création de la session 0, puis votre client s’attachera à cette session au lieu d’en créer une nouvelle.

36
Chris Johnsen

Je ne suis pas sûr de comprendre ce que vous entendez par "entrer manuellement", mais c'est comme cela que je le fais. J'ai écrit un script de "démarrage automatique" 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 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 la konsole.

9
John Schmitt

supposons que vous souhaitiez lancer 3 tâches de surveillance du serveur (ici, ping sur localhost), vous n'avez pas besoin de manipuler les fichiers de configuration et les sessions enregistrées. Tout 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
5
Jasen

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

Son écrit en Ruby donc vous avez 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 fractionnements.

5
Kris

**

  • Mieux vaut sauvegarder votre session!

** J'ai constaté que pour un administrateur paresseux comme moi, je préférerais sauvegarder la session de tmux plutôt que de passer des heures à essayer de la construire parfaitement. J'administre plus de 30 serveurs et mes sessions tmux sont dynamiques, la configuration changeant tout le temps. C’était douloureux, jusqu’à ce que j’ai récemment découvert tmux-resurrect , ce plugin est tout simplement génial. Essaie. Actuellement, les dépôts Ubuntu ont tmux 1.8, ce plugin a besoin de 1.9, vous aurez donc besoin de mettre à jour 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

Puis dd 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 fichier ~/.tmux.conf afin que le plug-in enregistre les sessions de tous les programmes que je lance.

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

Rechargez ensuite l'environnement tmux.

tmux source-file ~/.tmux.conf

C'est tout! Vous avez terminé. Maintenant, lancez tmux comme d'habitude, redimensionnez vos panneaux, créez-en de nouveaux, 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, relancez tmux

tmux

Ensuite, à partir de tmux, cliquez sur ctrl + b, puis sur Ctrl + r (pour restauration). Comme par magie, toutes vos fenêtres, volets et sessions sont restaurés avec la même géométrie et le même agencement. J'espère que cela aiderait.

4
user1757247

Une autre alternative similaire à teamcoil est tmuxinator , elle est en développement actif et fonctionne assez bien. Il est également recommandé (et en quelque sorte révisé) sur l’étonnant tmux: Développement productif sans souris de de The Pragmatic Bookshelf .