Enlace de una clave tmux a múltiples comandos

37

Lanzo la ventana tmux multipane para monitorear varios parámetros del servidor. Con Ctrl-S puedo abrir una nueva ventana con otro comando de monitor.

Ahora quiero vincular Ctrl-Q para abrir otra ventana de múltiples paneles con varios monitores. ¿Cómo ato una clave a múltiples comandos? Traté de encadenarlos con; y \; - nada ayuda. Por favor, indique qué debo usar en lugar de ... a continuación.

¿Es posible cuando abro una nueva ventana para suspender los comandos de fondo que se superponen?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."
Jackhab
fuente

Respuestas:

37

Todd Freed tiene razón, la forma "correcta" de hacerlo es mediante el uso \;. Más o menos. Pero hay un inconveniente.

Verá, se une a una secuencia de comandos tmux dando tmux la conjunción ;. Por lo tanto, en un archivo de tmux, podría decir

new-session "monitor1" ; split-window -v "monitor2"

si, por alguna razón, quisieras eso en una sola línea. Ahora, se puede dar esa instrucción compuesta de una línea para el tmuxcomando desde un shell también , pero el ;debe ser escapado para que el shell lo interpreta como otro argumento a favor tmux. Por lo tanto, el equivalente de lo anterior de la carcasa es

$ tmux new-session "monitor1" \; split-window -v "monitor2"

De manera similar, el bind-keycomando tmux toma una serie de argumentos que son el comando tmux y los argumentos que se ejecutan cuando se presiona la tecla. Si quisieras enlazar C-qa la secuencia anterior desde dentro de un archivo originado por tmux, dirías

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

Aquí hemos escapado ; de tmux , para que tmux no lo interprete como el final del bind-keycomando, sino como otro argumento para bind-keydecirle que forme un comando compuesto como el valor enlazado de la C-qclave.

Entonces, ¿qué sucede cuando queremos que tmux haga eso desde el shell? Mucho escape.

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

Primero, tenemos que escapar del \ y del ;cada del shell , haciendo que el shell pase los dos caracteres \;como argumento a tmux. Esto luego escapa ;de tmux, lo que hace que asigne toda la declaración compuesta como el enlace de C-q.


Ahora, dicho todo esto, si usa una configuración compleja de tmux como esta repetidamente, le sugiero que cree un archivo tmux para mantenerlo en:

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

Y entonces:

$ tmux source split-windows.tmux  # (or even make an alias for this)

Será mucho más fácil mantenerlo así.

Peeja
fuente
3
Para hacer que las teclas vinculantes para múltiples comandos desde la línea de comandos sean menos horribles de ver, también puede escapar de la cadena \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap
12

Entonces, la verdadera respuesta es: encadenar comandos con una barra invertida seguida de un punto y coma.

bind-key C send-keys foo \; send-keys bar

Lo pondría en su tmux.conf, o lo ejecutaría desde el indicador tmux ":"

Todd liberado
fuente
Esto fue genial y funcionó para usar la sesión tmux anidada y navegar a través de las ventanas tmux anidadas.
Paul
1
Esto no funciona desde la línea de comandos de shell. Es decir, 'tmux bind-key C send-keys foo \; La barra de envío de teclas "tiene el efecto de vincular" foo "a" C "pero imprime" barra "inmediatamente.
Lqueryvg
Sí, lo ejecutarías desde tmux. Actualizado para aclarar.
Todd liberado el
¡Agradable! Esto funciona totalmente ... muchas gracias!
Brad Parks
No hay té ; dentro de comillas simples no necesita escapar
eleg
2

Puede hacer esto con una pequeña solución. Similar a la respuesta que sugiere un script para ejecutar (que maneja bien su caso), se puede hacer más generalmente usando "run-shell" y llamando a tmux como el comando de shell.

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

que enviará las teclas 'xyz', el comando tmux 'clear-history' y luego llamará al shell 'clear' incorporado.

La cadena completa es solo una secuencia de comandos de shell múltiple.

Vadear
fuente
1

Puede agregar algo como esto a las asociaciones de teclas a su .tmux.confarchivo:

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

Y en tmux-new-session.shti puedes tener:

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit
paradroid
fuente
1

Todo lo que se muestra aquí no funcionará, porque esto

bind q send-keys "command1" \; send-keys "command2"

ejecutará el comando2 inmediatamente y q estará vinculado solo a las teclas de envío "comando1"

Aquí está la solución:

bind R source-file "$HOME/.tmux/reload.tmux"

En el archivo ~ / .tmux / reload.tmux pon múltiples comandos como:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."
lzap
fuente
1
Oh, espera, usa lo que dijo Peeja (\\\;) :-)
lzap