Wie sende ich Befehle, wenn ich eine tmux-Sitzung in einer anderen tmux-Sitzung öffne?

136

Eine typische Situation kann sein:

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

Ich öffne eine tmux-Sitzung, ssh dann in einen Server und verbinde mich mit einer vorhandenen tmux-Sitzung. Zu diesem Zeitpunkt habe ich eine tmux-Sitzung in einer anderen. Wie sende ich Befehle an die innere tmux-Sitzung?

Hinweis: Beide tmux-Sitzungen haben die gleichen Tastenkombinationen.

Kris
quelle
4
keine Programmierfrage. Bitte versuchen Sie es mit superuser.com . Viel Glück.
Shellter
1
Ich bin froh, die Frage verschieben zu können, aber für den Kontext verwende ich vim in tmux zum Codieren und muss natürlich oft auf andere Server ssh, wo dieses Problem auftritt.
Kris

Antworten:

207

Mit dem send-prefixBefehl können Sie Ihren Präfix-Tastenanschlag an den aktiven Bereich (den darin ausgeführten Prozess) senden. Standardmäßig lautet das Präfix Cb und Cb ist gebunden send-prefix(so dass durch zweimaliges Schlagen ein einzelnes Cb an den aktiven Bereich gesendet wird). Dies ist genau das, was wir brauchen, um auf die Bindungen der inneren tmux- Instanz zuzugreifen .

Das erste Cb wird von der "äußeren" tmux- Instanz als Präfixschlüssel erfasst . Die zweite wird von der "äußeren" tmux- Instanz erfasst und löst ihre Cb- Bindung aus ( send-prefix). Dadurch wird ein Cb an den aktiven Bereich der äußeren Instanz gesendet. Der in diesem Bereich ausgeführte Prozess ist (letztendlich über eine ssh- Instanz) die „innere“ tmux- Instanz. Es erfasst das Cb als Präfixschlüssel. Jetzt wird Ihr nächster Tastendruck durch die äußere tmux- Instanz geleitet und von der inneren erfasst, um eine Bindung auszulösen.

Um die c- Bindung ( new-window) in einer Instanz der zweiten Ebene von tmux auszulösen , geben Sie Cb Cb c ein . Für eine Instanz der dritten Ebene von tmux würden Sie Cb Cb Cb Cb c eingeben .

Diese Verdoppelung für jedes Level kann ärgerlich sein, wenn Sie häufig mit mehreren Schichten von tmux arbeiten . Wenn Sie einen anderen Schlüssel sparen können, können Sie eine Bindung ohne Präfix erstellen, um die Eingabe (möglicherweise) zu vereinfachen:

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

Neues Fenster in tmux der zweiten Ebene erstellen : C- \ c
Neues Fenster in tmux der dritten Ebene erstellen : C- ^ c (oder C- \ C- \ c )


Wenn Sie eine begrenzte Anzahl von tmux- Befehlen haben, die Sie (einfach) an die untergeordneten tmux- Instanzen senden möchten , können Sie stattdessen send-keysbestimmte Bindungen erstellen (möglicherweise nur in Ihrer obersten tmux- Instanz):

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

Neues Fenster in tmux der zweiten Ebene erstellen : Cb Cc
Neues Fenster in tmux der dritten Ebene erstellen : Cb C.

Chris Johnsen
quelle
Zusätzlich musste ich meine bestehende last-windowBindung, wie sie dabei genannt wurde C-a C-a, als solche auskommentieren : #bind-key C-a last-window. Beachten Sie, dass mein Präfix anicht die Standardeinstellung ist b.
Kris
1
bind-key -n C-\ send-prefixfunktioniert nicht. Mein tmux erkennt das \ nicht. Wenn ich einen Brief benutze, funktioniert es.
Darksky
@ Darksky: Welche Version von tmux benutzt du? Es funktioniert bei mir mit 1.7, 1.6 und 1.5. Sie müssen auf jeden Fall eine zusätzliche Anführungszeichenstufe hinzufügen, wenn Sie die Bindung über einen Shell-Befehl (dh tmux bind-key -n 'C-\' send-prefix) vornehmen. Wenn Sie Probleme haben, es über ~/.tmux.conf(oder eine Präfix- :Befehlszeile) zum Laufen zu bringen, versuchen Sie möglicherweise ein ähnliches Anführungszeichen (dh bind-key -n 'C-\' send-prefix).
Chris Johnsen
51

Um auf das Innere zuzugreifen, halten Sie die Kontrolle gedrückt und drücken Sie zweimal B.

Thouliha
quelle
7

BEARBEITEN:

Ich empfehle NICHT , C-qals Bindeschlüssel zu verwenden, da dies ein Standardbefehl für die Steuerungstaste ist

Deaktiviert den Bildschirm und lässt die Bildschirmanzeige fortgesetzt werden

Eine Situation , geschieht hier , und @Paschalis bietet eine Lösung:

Wenn es zweimal Pech hat (eine entfernte tmux-Sitzung mit Cq als Präfix): Geben Sie Cltr-qdann ein :und geben Sie tmux ein:send-keys C-q

Darunter ist die Antwort:


Fügen Sie zur Vereinfachung die folgende Zeile in Ihr Feld ein ~/.tmux.conf

bind-key -n C-q send-prefix

Dann können Sie direkt verwenden C-qals bind-Schlüssel für Ihre Remote - tmux.

qun
quelle
Wenn jemand den Standard-Binder-Schlüssel im äußeren tmux geändert hat, muss er denselben Standard-Binder-Schlüssel im inneren tmux verwenden, damit das obige Snippet funktioniert!
Paschalis
Ich ändere das Präfix meines lokalen tmux (in meinem Fall auf Strg +]), so dass alle "inneren" tmux-es auf den Servern Standardbindung für Präfix haben
actionless