Come inviare comandi quando si apre una sessione tmux all'interno di un'altra sessione tmux?


136

Una situazione tipica può essere:

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

Apro una sessione di tmux, quindi accedo a un server e mi collego a una sessione di tmux esistente. A questo punto ho una sessione tmux all'interno di un'altra. Come posso inviare comandi alla sessione tmux interna?

Nota: entrambe le sessioni di tmux hanno gli stessi collegamenti chiave.


4
non una domanda di programmazione. Prova superuser.com . In bocca al lupo.
shellter

1
Sono felice di chiedere che la domanda venga spostata, tuttavia per il contesto utilizzo vim all'interno di tmux per codificare e, naturalmente, spesso devo collegarmi ad altri server, dove si verifica questo problema.
Kris,

Risposte:


207

Il send-prefixcomando può essere utilizzato per inviare la sequenza di tasti del prefisso al (il processo in esecuzione) nel riquadro attivo. Per impostazione predefinita, il prefisso è Cb e Cb è associato a send-prefix(in modo che colpendolo due volte invii un singolo Cb al riquadro attivo). Questo è proprio ciò di cui abbiamo bisogno per accedere ai binding dell'istanza tmux interna .

Il primo Cb viene catturato dall'istanza tmux "esterna" come chiave prefisso. Il secondo viene catturato dall'istanza tmux "esterna" e attiva il suo legame Cb ( send-prefix). Questo invia un Cb al riquadro attivo dell'istanza esterna. Il processo in esecuzione in questo riquadro è (in definitiva, tramite un'istanza ssh ) l' istanza tmux "interna" . Cattura Cb come chiave prefisso. Ora il tuo prossimo tasto verrà passato attraverso l' istanza tmux esterna e catturato da quello interno per innescare un'associazione.

Per attivare l' associazione c ( new-window) in un'istanza di secondo livello di tmux , digitare Cb Cb c . Per un'istanza di terzo livello di tmux , digitare Cb Cb Cb Cb c .

Questo raddoppio per ogni livello può essere fastidioso se di solito hai a che fare con più livelli di TMux . Se puoi risparmiare qualche altra chiave, potresti creare un'associazione senza prefisso per rendere le cose (possibilmente) più facili da digitare:

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

Crea una nuova finestra in tmux di secondo livello : C- \ c
Crea una nuova finestra in tmux di terzo livello : C- ^ c (o C- \ C- \ c )


Se hai un numero limitato di comandi tmux che desideri (facilmente) inviare alle istanze tmux di livello inferiore , potresti invece utilizzare send-keysper creare alcuni collegamenti specifici (possibilmente solo nell'istanza tmux di livello superiore ):

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

Crea una nuova finestra in tmux di secondo livello : Cb Cc
Crea una nuova finestra in tmux di terzo livello : Cb C


Inoltre ho dovuto commentare il mio attuale last-windowvincolante come veniva chiamata quando si fa C-a C-a, come ad esempio: #bind-key C-a last-window. Nota che il mio prefisso è a, non quello predefinito b.
Kris,

1
bind-key -n C-\ send-prefixnon funziona. Il mio tmux non riconosce il \. Quando uso una lettera, funziona.
darksky,

@Darksky: quale versione di tmux stai usando? Funziona per me con 1.7, 1.6 e 1.5. Avrai sicuramente bisogno di aggiungere un ulteriore livello di quotazione se stai eseguendo il binding da un comando shell (cioè tmux bind-key -n 'C-\' send-prefix); se hai problemi a farlo funzionare da ~/.tmux.conf(o da una :riga di comando Prefisso ), allora potresti provare quotazioni simili (es bind-key -n 'C-\' send-prefix.).
Chris Johnsen,

51

Per accedere all'interno, mantieni il controllo e premi B due volte.


7

MODIFICARE:

Io non consiglio l'uso C-qcome-chiave bind, in quanto è un comando predefinito di controllo in mano per

sblocca lo schermo e lascia continuare la visualizzazione dello schermo

Una situazione accade qui , e @Paschalis fornisce una soluzione:

se succede due volte sfortunato (una sessione tmux remota con Cq come prefisso): digita Cltr-q, quindi :, e inserisci in tmux:send-keys C-q

Di seguito è la risposta:


Per semplificare, aggiungi la seguente riga nel tuo ~/.tmux.conf

bind-key -n C-q send-prefix

Poi si può direttamente utilizzare C-qcome bind-chiave per il vostro tmux remoto.


se qualcuno ha cambiato la chiave legante predefinita nel tmux esterno, allora deve usare la stessa chiave legante predefinita nel tmux interno, affinché lo snippet sopra funzioni!
Paschalis,

sto modificando il prefisso del mio tmux locale (a Ctrl +] nel mio caso) in modo che tutti i tmux "interni" sui server abbiano
un'associazione
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.