¿Cómo enviar comandos al abrir una sesión tmux dentro de otra sesión tmux?

136

Una situación típica puede ser:

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

Abro una sesión de tmux, luego ingreso a un servidor y lo adjunto a una sesión de tmux existente. En este punto tengo una sesión tmux dentro de otra. ¿Cómo envío comandos a la sesión interna de tmux?

Nota: Ambas sesiones de tmux tienen las mismas asociaciones de teclas.

Kris
fuente
44
No es una pregunta de programación. Por favor, intente superuser.com . Buena suerte.
shellter
1
Me complace pedir que se mueva la pregunta, sin embargo, para el contexto, uso vim dentro de tmux para codificar y, por supuesto, a menudo tengo que ingresar a otros servidores, que es donde ocurre este problema.
Kris

Respuestas:

207

El send-prefixcomando se puede usar para enviar su pulsación de tecla de prefijo (el proceso que se ejecuta) al panel activo. De manera predeterminada, el prefijo es Cb y Cb está vinculado send-prefix(por lo que presionarlo dos veces envía un solo Cb al panel activo). Esto es justo lo que necesitamos para acceder a los enlaces de la instancia interna de tmux .

El primer Cb es capturado por la instancia tmux "externa" como su clave de prefijo. El segundo es capturado por la instancia tmux "externa" y desencadena su enlace Cb ( send-prefix). Esto envía un Cb al panel activo de la instancia externa. El proceso que se ejecuta en este panel es (en última instancia, a través de una instancia ssh ) la instancia tmux "interna" . Captura el Cb como su clave de prefijo. Ahora su siguiente pulsación de tecla pasará a través de la instancia externa de tmux y será capturada por la interna para activar un enlace.

Para activar el enlace c ( new-window) en una instancia de segundo nivel de tmux , debe escribir Cb Cb c . Para una instancia de tmux de tercer nivel , debe escribir Cb Cb Cb Cb c .

Esta duplicación para cada nivel puede ser molesta si comúnmente se trata de múltiples capas de tmux . Si puede ahorrar alguna otra clave, puede hacer un enlace sin prefijo para que las cosas (posiblemente) sean más fáciles de escribir:

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

Crear nueva ventana en tmux de segundo nivel : C- \ c
Crear nueva ventana en tmux de tercer nivel : C- ^ c (o C- \ C- \ c )


Si tiene un número limitado de comandos tmux que desea enviar (fácilmente) a las instancias tmux de nivel inferior , en su lugar, puede usar send-keyspara crear algunos enlaces específicos (posiblemente solo en su instancia tmux de nivel superior ):

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

Crear nueva ventana en tmux de segundo nivel : Cb Cc
Crear nueva ventana en tmux de tercer nivel : Cb C

Chris Johnsen
fuente
Además tuve que comente mi existente last-windowvinculante como se le llamaba cuando se hace C-a C-a, como por ejemplo: #bind-key C-a last-window. Tenga en cuenta que mi prefijo es a, no el predeterminado b.
Kris
1
bind-key -n C-\ send-prefixNo funciona. Mi tmux no reconoce el \. Cuando uso una carta, funciona.
darksky
@Darksky: ¿Qué versión de tmux estás usando? A mí me funciona con 1.7, 1.6 y 1.5. Definitivamente necesitará agregar un nivel adicional de comillas si está realizando el enlace desde un comando de shell (es decir tmux bind-key -n 'C-\' send-prefix); si tiene problemas para que funcione ~/.tmux.conf(o una :línea de comando de Prefijo ), entonces puede intentar una cita similar (es decir bind-key -n 'C-\' send-prefix).
Chris Johnsen
51

Para acceder al interior, mantén el control y presiona B dos veces.

thouliha
fuente
7

EDITAR:

Yo no recomiendo su uso C-qcomo una clave de enlace, ya que es un comando predeterminado de control de clave para

Descongela la pantalla y permite que la visualización continúe

Aquí ocurre una situación , y @Paschalis proporciona una solución:

si resulta ser dos veces desafortunado (una sesión remota de tmux con Cq como prefijo): escriba Cltr-q, luego :, e ingrese en tmux:send-keys C-q

Debajo está la respuesta:


Para hacerlo simple, agregue la línea siguiente en su ~/.tmux.conf

bind-key -n C-q send-prefix

Luego puede usar directamenteC-q como clave de enlace para su tmux remoto.

qun
fuente
si alguien ha cambiado la clave de carpeta predeterminada en el tmux externo, entonces tiene que usar la misma clave de carpeta predeterminada en el tmux interno, ¡para que el fragmento anterior funcione!
Paschalis
Estoy modificando el prefijo de mi tmux local (a Ctrl +] en mi caso) para que todos los tmux-es "internos" en los servidores tengan un enlace predeterminado para el prefijo
acción