Como enviar comandos ao abrir uma sessão tmux dentro de outra sessão tmux?

136

Uma situação típica pode ser:

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

Abro uma sessão tmux, ssh em um servidor e conecto a uma sessão tmux existente. Neste ponto, tenho uma sessão tmux dentro de outra. Como envio comandos para a sessão interna do tmux?

Nota: As duas sessões do tmux têm as mesmas ligações de teclas.

Kris
fonte
4
não é uma questão de programação. Por favor, tente superuser.com . Boa sorte.
shellter
1
Fico feliz em pedir que a pergunta seja movida, no entanto, para o contexto, uso o vim dentro do tmux para codificar e, é claro, muitas vezes tenho que transferir para outros servidores, onde é esse problema.
Kris

Respostas:

207

O send-prefixcomando pode ser usado para enviar o pressionamento de tecla do prefixo para (o processo em execução) no painel ativo. Por padrão, o prefixo é Cb e Cb está vinculado a send-prefix(para que pressioná-lo duas vezes envie um único Cb para o painel ativo). É exatamente isso que precisamos para acessar as ligações da instância interna do tmux .

O primeiro Cb é capturado pela instância tmux "externa" como sua chave de prefixo. O segundo é capturado pela instância tmux "externa" e dispara sua ligação Cb ( send-prefix). Isso envia um Cb para o painel ativo da instância externa. O processo em execução neste painel é (em última instância, através de uma instância ssh ) a instância tmux "interna" . Ele captura o Cb como sua chave de prefixo. Agora, seu próximo pressionamento de tecla será passado pela instância externa do tmux e capturado pela interna para acionar uma ligação.

Para acionar a ligação c ( new-window) em uma instância de segundo nível do tmux , digite Cb Cb c . Para uma instância de tmux de terceiro nível , digite Cb Cb Cb Cb c .

Essa duplicação para cada nível pode ser irritante se você estiver lidando com várias camadas do tmux . Se você puder poupar alguma outra chave, poderá criar uma ligação não prefixada para facilitar a digitação das coisas (possivelmente):

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

Criar nova janela no tmux de segundo nível : C- \ c
Criar nova janela no tmux de terceiro nível : C- ^ c (ou C- \ C- \ c )


Se você tiver um número limitado de comandos tmux que deseja enviar (facilmente) para as instâncias tmux de nível inferior , poderá usar send-keyspara criar algumas ligações específicas (possivelmente apenas na sua instância tmux de nível superior ):

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

Criar nova janela no tmux de segundo nível : Cb Cc
Criar nova janela no tmux de terceiro nível : Cb C

Chris Johnsen
fonte
Além disso eu tinha que comentar a minha existente last-windowde ligação, como era chamado quando fazer C-a C-a, como tal: #bind-key C-a last-window. Observe que meu prefixo anão é o padrão b.
Kris
1
bind-key -n C-\ send-prefixnão funciona. Meu tmux não está reconhecendo o \. Quando uso uma carta, ela funciona.
darksky
@ Darksky: Qual versão do tmux você está usando? Funciona para mim com 1.7, 1.6 e 1.5. Você definitivamente precisará adicionar um nível extra de citação se estiver fazendo a ligação a partir de um comando shell (ou seja tmux bind-key -n 'C-\' send-prefix); Se você está tendo problemas para fazê-lo funcionar ~/.tmux.conf(ou em uma :linha de comando Prefixo ), tente citações semelhantes (por exemplo bind-key -n 'C-\' send-prefix).
precisa
51

Para acessar o interior, mantenha o controle e pressione B duas vezes.

thouliha
fonte
7

EDITAR:

Eu não recomendo o uso C-qde uma chave-bind, como é um comando padrão de controle-chave para

descongela a tela e permite que a exibição continue

Uma situação acontece aqui e o @Paschalis fornece uma solução:

se acontecer de ser duas vezes azar (uma sessão tmux remoto com Cq como prefixo): Tipo Cltr-qe, em seguida :, e entrar em tmux:send-keys C-q

Abaixo está a resposta:


Para simplificar, adicione a linha abaixo no seu ~/.tmux.conf

bind-key -n C-q send-prefix

Então você pode usar diretamenteC-q como chave de ligação para o seu tmux remoto.

qun
fonte
se alguém tiver alterado a chave do fichário padrão no tmux externo, precisará usar a mesma chave do fichário padrão no tmux interno, para que o snippet acima funcione!
Paschalis 26/01
Estou modificando o prefixo do meu tmux local (para Ctrl +] no meu caso) para que todos os tmux-es "internos" nos servidores tenham ligação padrão para prefixo
ação