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\""
    

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.).


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.


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.


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\"'"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.