Tuer une session tmux et sélectionner une autre session tmux

11

J'essaie de me lier Xpour faire ce qui suit:

  • demander à l'utilisateur si la session doit être interrompue
  • si yest entré, tuez la session
  • après la fin de la session, sélectionnez une autre session (dernière, précédente ou suivante)

Quelques commandes similaires qui ne sont pas tout à fait correctes

  1. Tuez la session et fermez le terminal:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Invitez l'utilisateur à indiquer le nom de la session à supprimer et sélectionnez la session suivante après la suppression:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. Je n'ai pas pu trouver d'exemples de commandes similaires. Voici une solution quelque chose qui ne fonctionne pas:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    
Trey Hunner
la source

Réponses:

12

Je pense que cela est proche de ce que vous voulez:

bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"

Votre approche n ° 3 va dans le bon sens, mais le problème est qu'il confirm-beforene fait pas de status-leftsubstitutions de style (par exemple #S) dans sa chaîne de commande.

Une mise en garde pour la liaison ci-dessus est que, puisque tout est fait à partir de run-shell, les commandes sont exécutées en dehors du contexte d'un client ou d'une session particulière. Cela ne fonctionne vraiment que parce que le client «par défaut» (pour switch-client) et la session «par défaut» (pour #S) sont les plus récents. Cela fonctionne comme vous vous en doutez tant que vous n'avez qu'un seul client actif (par exemple, un seul utilisateur qui ne tape dans un autre client tmux qu'après l'exécution des commandes shell); il peut échouer de façon spectaculaire si (par exemple) vous déclenchez la liaison dans le client tmux A, mais une nouvelle entrée est reçue par le client tmux B avant que le shell démarré par run-shelln'ait eu la chance d'exécuter ses commandes.

Cette condition de concurrence particulière semble être une bonne motivation pour fournir des informations client / session / fenêtre / volet aux run-shellcommandes. Il y a une entrée TODO sur l'obtention if-shellet run-shellle support (facultatif?) status_replace()(C'est-à-dire les status-leftsubstitutions de style), bien que peut-être un meilleur choix serait format_expand(), qui est une sorte de super-ensemble plus récent de status_replace(offres #{client_tty}, etc.).

Chris Johnsen
la source
Cela semble faire exactement ce que je cherchais. J'avais essayé une méthode similaire après avoir trouvé l' tmux display-message -p "#S"astuce dans une autre réponse. Il semble que tout emballer dans run-shell était la clé. Merci!
Trey Hunner
Comment faites-vous cela sans confirm-before? J'ai du mal à réussir à m'échapper.
Miles
2
@Miles: Essayez celui-ci: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ se run-shelldéveloppe #Sdirectement, donc nous pouvons omettre le display-messageet ses citations supplémentaires)
Chris Johnsen
1

Juste au cas où quelqu'un tomberait sur cette question - tmux-sessionist fournit cette fonctionnalité avec beaucoup d'autres.

anni
la source
0

Il y a une autre question qui pose une question similaire mais elle est légèrement différente.

Si vous voulez le choose-sessioncomportement standard avec la fonctionnalité supplémentaire qui tue la session d'origine si aucun autre client n'y reste attaché, cette question peut également être intéressante.

étoilé
la source
0

Expansion de la réponse de Chris Johnsen (dans les commentaires) ci-dessus, sur la façon de le faire sans invite ou confirm-before:

bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'

S'il ne reste qu'une seule session (la session dans laquelle vous êtes actuellement) et que vous exécutez la commande, vous recevrez un message "d'erreur" et la session n'est pas interrompue. Normalement (si vous êtes comme moi), vous voulez que la commande continue de tuer la session même s'il n'y a aucune autre session vers laquelle elle peut basculer. Voici donc ce que je propose:

bind-key X if-shell '[ $(tmux list-sessions | wc -l) -ne 1 ]' \
                    "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'" \
                    "run-shell 'tmux kill-session -t \"#S\"'"
M Imam Pratama
la source