Associare una chiave tmux a più comandi


37

Avvio multipane tmux window per monitorare diversi parametri del server. Con Ctrl-S posso aprire una nuova finestra con un altro comando monitor.

Ora voglio associare Ctrl-Q per aprire un'altra finestra multipane con diversi monitor. Come associare una chiave a più comandi? Ho provato a concatenarli; e \; - niente aiuta. Per favore, avvisa cosa dovrei usare invece di ... sotto.

È possibile quando apro una nuova finestra per sospendere i comandi in background sovrapposti da essa?

    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 "..."

Risposte:


37

Todd Freed ha ragione, il modo "corretto" per farlo è usare \;. Una specie di. Ma c'è un problema.

Vedete, unite una sequenza di comandi tmux insieme dando a tmux la congiunzione ;. Quindi, in un file proveniente da tmux, si potrebbe dire

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

se, per qualche motivo, lo volevi tutto su una riga. Ora, si può dare che un'istruzione composta di una sola riga al tmuxcomando da una shell anche , ma la ;deve essere sfuggito in modo che la shell interpreta come un altro argomento per tmux. Quindi l'equivalente di quanto sopra dalla shell è

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

Allo stesso modo, il bind-keycomando tmux accetta una serie di argomenti che sono il comando tmux e gli argomenti da eseguire quando si preme il tasto. Se volessi C-qlegarti alla sequenza sopra dall'interno di un file proveniente da tmux, diresti

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

Qui siamo sfuggiti a ; tmux , in modo che tmux non lo interpreti come la fine del bind-keycomando, ma come un altro argomento per bind-keydirgli di formare un comando composto come valore associato della C-qchiave.

Quindi cosa succede quando vogliamo che tmux lo faccia dalla shell? Un sacco di fuga.

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

Per prima cosa, dobbiamo scappare l'uno \ e l'altro ;dalla shell , facendo in modo che la shell passi i due caratteri \;come argomento tmux. Questo quindi sfugge a ;da tmux, inducendolo ad assegnare l'intera istruzione composta come associazione di C-q.


Detto questo, se usi ripetutamente una complessa configurazione di tmux come questa, ti suggerisco di creare un file tmux per tenerlo in:

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

E poi:

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

Sarà molto più facile da mantenere in questo modo.


3
Per rendere le chiavi vincolanti a più comandi dalla riga di comando meno orribili da guardare, puoi anche sfuggire alla stringa \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap

12

Quindi la vera risposta è: si concatenano i comandi con una barra rovesciata seguita da un punto e virgola.

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

Lo inseriresti nel tuo tmux.conf, o eseguiresti dal prompt ":" di tmux


questo è stato fantastico e ha funzionato per l'utilizzo della sessione tmux nidificata e per navigare attraverso le finestre tmux nidificate.
Paul,

1
Questo non funziona dalla riga di comando della shell. Vale a dire `tmux bind-key C send-keys foo \; send-keys bar "ha l'effetto di legare" foo "a" C "ma stampa immediatamente" bar ".
Lqueryvg,

Sì, lo faresti da tmux. Aggiornato per chiarire.
Todd Freed il

Bello! Funziona totalmente ... muchas gracias!
Brad Parks,

Nota: a; all'interno di virgolette singole non è necessario scappare
eleggiti il

2

Puoi farlo con una piccola soluzione. Simile alla risposta che suggerisce l'esecuzione di uno script (che gestisce bene il tuo caso), in genere può essere fatto usando "run-shell" e chiamando tmux stesso come comando shell.

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

che invierà le chiavi 'xyz', il comando tmux 'clear-history', e quindi chiamerà la shell 'clear' integrata.

L'intera stringa è solo una sequenza di comandi a più shell.


1

Puoi aggiungere qualcosa del genere ai collegamenti chiave al tuo .tmux.conffile:

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

E in tmux-new-session.shte puoi avere:

#! /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

1

Tutto ciò che viene mostrato qui non funzionerà, perché questo

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

eseguirà immediatamente il comando2 e q sarà associato solo ai tasti di invio "comando1"

Ecco la soluzione:

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

Nel file ~ / .tmux / reload.tmux inserisci più comandi come:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."

1
Oh aspetta, usa quello che ha detto Peeja (\\\;) :-)
lzap
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.