Comment envoyer des commandes lors de l'ouverture d'une session tmux dans une autre session tmux?

136

Une situation typique peut être:

$ tmux
  [0] $ ssh example.com
      $ tmux attach
        [0] $ 

J'ouvre une session tmux, puis ssh dans un serveur et j'attache à une session tmux existante. À ce stade, j'ai une session tmux dans une autre. Comment envoyer des commandes à la session tmux interne?

Remarque: les deux sessions tmux ont les mêmes raccourcis clavier.

Kris
la source
4
pas une question de programmation. Veuillez essayer superuser.com . Bonne chance.
shellter
1
Je suis heureux de demander que la question soit déplacée, mais pour le contexte, j'utilise vim à l'intérieur de tmux pour coder et bien sûr je dois souvent ssh vers d'autres serveurs, ce qui est là où ce problème se produit.
Kris

Réponses:

207

La send-prefixcommande peut être utilisée pour envoyer votre frappe de préfixe au (processus en cours d'exécution dans) le volet actif. Par défaut, le préfixe est Cb et Cb est lié à send-prefix(de sorte que le frapper deux fois envoie un seul Cb au volet actif). C'est exactement ce dont nous avons besoin pour accéder aux liaisons de l' instance tmux interne .

Le premier Cb est capturé par l' instance tmux «externe» comme sa clé de préfixe. Le second est capturé par l' instance tmux «externe» et déclenche sa liaison Cb ( send-prefix). Cela envoie un Cb au volet actif de l'instance externe. Le processus en cours d'exécution dans ce volet est (finalement, via une instance ssh ) l' instance tmux «interne» . Il capture le Cb comme sa clé de préfixe. Maintenant, votre prochaine frappe sera passée à travers l' instance tmux externe et capturée par l'instance interne pour déclencher une liaison.

Pour déclencher la liaison c ( new-window) dans une instance de deuxième niveau de tmux , vous devez taper Cb Cb c . Pour une instance de troisième niveau de tmux , tapez Cb Cb Cb Cb c .

Ce doublement pour chaque niveau peut être ennuyeux si vous avez souvent affaire à plusieurs couches de tmux . Si vous pouvez épargner une autre clé, vous pouvez créer une liaison non préfixée pour rendre les choses (éventuellement) plus faciles à taper:

bind-key -n C-\ send-prefix
bind-key -n C-^ send-prefix \; send-prefix

Créer une nouvelle fenêtre dans le tmux de deuxième niveau : C- \ c
Créer une nouvelle fenêtre dans le tmux de troisième niveau : C- ^ c (ou C- \ C- \ c )


Si vous avez un nombre limité de commandes tmux que vous souhaitez envoyer (facilement) aux instances tmux de niveau inférieur , vous pouvez plutôt utiliser send-keyspour créer des liaisons spécifiques (peut-être juste dans votre instance tmux de niveau supérieur ):

bind-key C-c  send-keys C-b c
bind-key C    send-keys C-b C-b c

Créer une nouvelle fenêtre dans tmux de deuxième niveau : Cb Cc
Créer une nouvelle fenêtre dans tmux de troisième niveau : Cb C

Chris Johnsen
la source
De plus , je devais commenter mon existant last-windowcomme il a été appelé contraignant lorsque vous faites C-a C-a, en tant que tel: #bind-key C-a last-window. Notez que mon préfixe n'est apas la valeur par défaut b.
Kris
1
bind-key -n C-\ send-prefixne marche pas. Mon tmux ne reconnaît pas le \. Quand j'utilise une lettre, ça marche.
darksky
@Darksky: Quelle version de tmux utilisez-vous? Cela fonctionne pour moi avec 1.7, 1.6 et 1.5. Vous devrez certainement ajouter un niveau supplémentaire de guillemets si vous effectuez la liaison à partir d'une commande shell (ie tmux bind-key -n 'C-\' send-prefix); si vous rencontrez des problèmes pour le faire fonctionner ~/.tmux.conf(ou une :ligne de commande Prefix ), alors vous pouvez essayer des citations similaires (ie bind-key -n 'C-\' send-prefix).
Chris Johnsen
51

Pour accéder à l'intérieur, maintenez le contrôle et appuyez deux fois sur B.

thouliha
la source
7

ÉDITER:

Je ne recommande PAS l' utilisation C-qcomme clé de liaison, car il s'agit d'une commande de touche de contrôle par défaut pour

dé-fige l'écran et laisse l'affichage de l'écran continuer

Une situation se produit ici , et @Paschalis fournit une solution:

s'il s'avère être deux fois malchanceux (une session tmux distante avec Cq comme préfixe): Tapez Cltr-q, puis :, et entrez dans tmux:send-keys C-q

Ci-dessous, la réponse:


Pour simplifier, ajoutez la ligne ci-dessous dans votre ~/.tmux.conf

bind-key -n C-q send-prefix

Ensuite, vous pouvez directement utiliser C-qcomme clé de liaison pour votre tmux distant.

qun
la source
si quelqu'un a changé la clé de classeur par défaut dans le tmux externe, alors doit utiliser la même clé de classeur par défaut dans le tmux interne, pour que l'extrait ci-dessus fonctionne!
Paschalis
Je modifie le préfixe de mon tmux local (à Ctrl +] dans mon cas) afin que tous les tmux-es "internes" sur les serveurs aient une liaison par défaut pour le préfixe
action