Powiązanie klawisza Tmux z wieloma poleceniami

37

Uruchamiam wielopasmowe okno tmux, aby monitorować kilka parametrów serwera. Za pomocą Ctrl-S mogę otworzyć nowe okno za pomocą innego polecenia monitora.

Teraz chcę powiązać Ctrl-Q, aby otworzyć kolejne okno wielopłaszczyznowe z kilkoma monitorami. Jak powiązać klucz z wieloma poleceniami? Próbowałem połączyć je łańcuchem; i \; - nic nie pomaga. Proszę doradzić, czego powinienem użyć zamiast ... poniżej.

Czy jest możliwe, gdy otworzę nowe okno, aby zawiesić nakładające się na niego polecenia w tle?

    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
źródło

Odpowiedzi:

37

Todd Freed ma rację, „poprawnym” sposobem na zrobienie tego jest użycie \;. Raczej. Ale jest szkoda.

Widzisz, łączysz sekwencję poleceń tmux razem, nadając tmux koniunkcję ;. Zatem w pliku pochodzącym od tmux można powiedzieć

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

jeśli z jakiegoś powodu chcesz tego wszystkiego w jednym wierszu. Teraz możesz przekazać tmuxkomendę z wiersza również tę złożoną jednowierszową instrukcję złożoną, ale; należy ją zmienić, aby powłoka zinterpretowała ją jako kolejny argument tmux. Zatem odpowiednikiem powyższego z powłoki jest

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

Podobnie, bind-keykomenda tmux pobiera szereg argumentów, które są komendą tmux i argumentami uruchamianymi po naciśnięciu klawisza. Jeśli chcesz powiązać C-qpowyższą sekwencję z wnętrza pliku pochodzącego z tmux, powiedziałbyś

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

W tym miejscu uniknęliśmy ; tmux , aby tmux nie interpretował go jako końca bind-keypolecenia, ale jako kolejny argument bind-keynakazujący mu utworzenie polecenia złożonego jako związanej wartości C-qklucza.

Co się stanie, gdy chcemy, aby Tmux zrobił to z powłoki? Dużo ucieczki.

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

Po pierwsze, musimy uciec \ i; każdy z muszli , co powoduje, że powłoka przekazać dwóch znaków \;jako argument tmux. To następnie ucieka ;przed tmux, powodując przypisanie całej instrukcji złożonej jako wiązania C-q.


Teraz, wszystko to powiedziawszy, jeśli wielokrotnie używasz takiej złożonej konfiguracji tmux, sugerowałbym utworzenie pliku tmux, aby zachować go w:

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

I wtedy:

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

Tak będzie o wiele łatwiej.

Peeja
źródło
3
Aby sprawić, że wiązanie klawiszy z wieloma poleceniami z wiersza poleceń będzie mniej okropne, możesz również uciec przez ciąg znaków \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap,
12

Tak więc prawdziwa odpowiedź brzmi: łączysz polecenia z ukośnikiem odwrotnym, po którym następuje średnik.

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

Umieściłbyś to w swoim tmux.conf lub uruchomiłeś z monitu tmux „:”

Todd Freed
źródło
to było świetne i działało w przypadku używania zagnieżdżonej sesji tmux i poruszania się po zagnieżdżonych oknach tmux.
Paul,
1
To nie działa z linii poleceń powłoki. To znaczy `tmux Bind-key C klucze wysyłania foo \; pasek klawiszy wysyłania ”powoduje wiązanie„ foo ”z„ C ”, ale natychmiast drukuje„ pasek ”.
Lqueryvg
Tak, uruchomiłbyś to z poziomu tmux. Zaktualizowano w celu wyjaśnienia.
Todd Freed,
Miły! To całkowicie działa ... muchas gracias!
Brad Parks
Nie herbata ; wewnątrz pojedynczych cytatów nie trzeba uciekać
elig
2

Możesz to zrobić za pomocą małego obejścia. Podobnie do odpowiedzi sugerującej uruchomienie skryptu (który dobrze radzi sobie z twoimi sprawami), ogólnie można to zrobić, używając „run-shell” i wywołując sam tmux jako polecenie powłoki.

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

który wyśle ​​klucze „xyz”, polecenie tmux „wyczyść historię”, a następnie wywoła wbudowaną powłokę „wyczyść”.

Cały ciąg jest po prostu sekwencją poleceń wielokrotnej powłoki.

Przebrnąć
źródło
1

Możesz dodać coś takiego do kluczowych przypisań do swojego .tmux.confpliku:

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

I w tmux-new-session.shtobie możesz mieć:

#! /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
źródło
1

Wszystko pokazane tutaj nie będzie działać, ponieważ to

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

natychmiast wykona polecenie 2, a q będzie związany tylko z kluczami wysyłania „polecenie 1”

Oto rozwiązanie:

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

W pliku ~ / .tmux / reload.tmux umieść wiele poleceń, takich jak:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."
lzap
źródło
1
Och, czekaj, użyj tego, co powiedziała Peeja (\\\;) :-)
lzap