Jak wysyłać polecenia podczas otwierania sesji tmux w innej sesji tmux?

136

Typowa sytuacja to:

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

Otwieram sesję tmux, a następnie ssh na serwerze i przyłączam się do istniejącej sesji tmux. W tym momencie mam jedną sesję tmux w drugiej. Jak wysłać polecenia do wewnętrznej sesji tmux?

Uwaga: obie sesje tmux mają te same powiązania klawiszy.

Kris
źródło
4
nie jest kwestią programowania. Proszę spróbować superuser.com . Powodzenia.
łowca
1
Z przyjemnością poproszę o przeniesienie pytania, jednak ze względu na kontekst używam Vima wewnątrz tmux do kodowania i oczywiście często muszę łączyć się przez ssh na inne serwery, gdzie występuje ten problem.
Kris

Odpowiedzi:

207

send-prefixKomenda może być używany do wysyłania swój prefiks do klawiszy (proces rozruchu) aktywnego okienka. Domyślnie prefiks to Cb, a Cb jest powiązany z send-prefix(tak, że dwukrotne kliknięcie powoduje wysłanie pojedynczego Cb do aktywnego panelu). Właśnie tego potrzebujemy, aby uzyskać dostęp do powiązań wewnętrznej instancji tmux .

Pierwsza Cb jest przechwytywana przez „zewnętrzną” instancję tmux jako jej klucz prefiksu. Drugi jest przechwytywany przez „zewnętrzną” instancję tmux i wyzwala jego wiązanie Cb ( send-prefix). Spowoduje to wysłanie Cb do aktywnego okienka wystąpienia zewnętrznego. Proces działający w tym okienku jest (ostatecznie za pośrednictwem instancji ssh ) „wewnętrzną” instancją tmux . Przechwytuje Cb jako klucz prefiksu. Teraz twoje następne naciśnięcie klawisza zostanie przekazane przez zewnętrzną instancję tmux i przechwycone przez wewnętrzną, aby wywołać wiązanie.

Aby wyzwolić wiązanie c ( new-window) w wystąpieniu tmux drugiego poziomu , należy wpisać Cb Cb c . W przypadku wystąpienia tmux trzeciego poziomu wpisz Cb Cb Cb Cb c .

To podwojenie dla każdego poziomu może być denerwujące, jeśli często masz do czynienia z wieloma warstwami tmux . Jeśli możesz zaoszczędzić jakiś inny klucz, możesz utworzyć powiązanie bez prefiksu, aby ułatwić (prawdopodobnie) wpisywanie:

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

Utwórz nowe okno w tmux drugiego poziomu : C- \ c
Utwórz nowe okno w tmux trzeciego poziomu : C- ^ c (lub C- \ C- \ c )


Jeśli masz ograniczoną liczbę poleceń tmux , które chcesz (łatwo) wysłać do instancji tmux niższego poziomu , możesz zamiast tego użyć send-keysdo utworzenia określonych powiązań (prawdopodobnie tylko w instancji tmux najwyższego poziomu ):

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

Utwórz nowe okno w tmux drugiego poziomu : Cb Cc
Utwórz nowe okno w tmux trzeciego poziomu : Cb C

Chris Johnsen
źródło
Dodatkowo musiałem wypowiedzieć się moje istniejące last-windowwiązania jak go nazywano, gdy robi C-a C-a, takich jak: #bind-key C-a last-window. Zauważ, że mój prefiks to a, a nie domyślny b.
Kris
1
bind-key -n C-\ send-prefixnie działa. Mój tmux nie rozpoznaje \. Kiedy używam listu, to działa.
darksky
@Darksky: Jakiej wersji tmux używasz? U mnie działa z 1.7, 1.6 i 1.5. Na pewno będziesz musiał dodać dodatkowy poziom cytowania, jeśli tworzysz powiązanie za pomocą polecenia powłoki (tj. tmux bind-key -n 'C-\' send-prefix); jeśli masz problemy z ~/.tmux.confuruchomieniem go z (lub :wiersza poleceń Prefix ), możesz spróbować podobnego cytowania (tj bind-key -n 'C-\' send-prefix.).
Chris Johnsen
51

Aby uzyskać dostęp do wnętrza, przytrzymaj klawisz Control i dwukrotnie naciśnij B.

thouliha
źródło
7

EDYTOWAĆ:

Ja nie zaleca stosowania C-qjako bind-klucza, ponieważ jest to domyślny klawisz sterowania polecenie

odblokowuje ekran i umożliwia kontynuację wyświetlania

Sytuacja ma miejsce tutaj , a @Paschalis zapewnia rozwiązanie:

jeśli okaże się dwukrotnie pechowy (zdalna sesja tmux z prefiksem Cq): Wpisz Cltr-q, a następnie :wprowadź tmux:send-keys C-q

Poniżej odpowiedź:


Aby to ułatwić, dodaj poniższy wiersz do pliku ~/.tmux.conf

bind-key -n C-q send-prefix

Następnie możesz bezpośrednio użyć C-qjako klawisz powiązania dla zdalnego tmux.

qun
źródło
jeśli ktoś zmienił domyślny klucz segregatora w zewnętrznym tmux, musi użyć tego samego domyślnego klucza segregatora w wewnętrznym tmux, aby powyższy fragment działał!
Paschalis
modyfikuję prefiks mojego lokalnego tmux (do Ctrl +] w moim przypadku), więc wszystkie "wewnętrzne" tmux-y na serwerach mają domyślne powiązanie dla prefiksu
bez działania.