Jak powiązać wiele poleceń Tmux z jednym naciśnięciem klawisza?

13

W szczególności próbuję przekazać powiadomienie po zakończeniu niektórych poleceń. Na przykład, jeśli ponownie załaduję mój plik konfiguracyjny, chciałbym mieć jakieś potwierdzenie, że zadziałało, co można zrobić w następujący sposób:

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

To jednak nie działa. Nie robiłem też żadnych innych rzeczy, które próbowałem napisać razem.

ikonoklasta
źródło
1
Działa dla mnie (tmux 1.3 na ściśnięciu Debiana) z \;jako separatorem.
Gilles „SO- przestań być zły”,
1
Ok, znalazłem że \; ma pracę, a to jest istotą odpowiedzi wybrałem poniżej. Jakoś testowałem \; zbyt szybko i stwierdził, że to nie działa. Ale zostawiam to pytanie tutaj, ponieważ wciąż służy ono do udzielenia odpowiedzi na pytanie, jak to zrobić.
iconoclast

Odpowiedzi:

12

Możesz użyć tej run-shellopcji , ale najważniejsze jest oddzielenie poleceń za pomocą\;

W tym przypadku coś takiego:

bind R source-file ~/.tmux.conf \; run-shell "echo 'Reload'"

run-shell shell-command
(alias: run)
Wykonaj polecenie shell w tle bez tworzenia okna. Po zakończeniu wszelkie dane wyjściowe na standardowe wyjście są wyświetlane w trybie kopiowania. Jeśli polecenie nie zwróci sukcesu, wyświetlany jest również status wyjścia.

jasonwryan
źródło
Hej, dzięki za odpowiedź. Nie przetestowałem tego specjalnie, ale nie sądzę, aby zadziałało, ponieważ przetestowałem kod w moim pytaniu za pomocą \; i po prostu uruchomił drugie polecenie, ale nie pierwsze. I nie wiem, dlaczego run-shell miałby działać, ale komunikat ekranowy nie.
iconoclast
1
OK, próbowałem przetestować twoje rozwiązanie i tmux ciągle się blokuje, najwyraźniej (choć nie z absolutną pewnością) od tego polecenia. Będę próbował, ale jestem prawie pewien, że to nie zadziała ...
iconoclast
Działa na tmux 1.4. Czy „blokowanie” oznacza „tryb kopiowania” - czyli zgodnie z projektem ...
jasonwryan
OK, mam to do pracy, bez blokowania Tmux. Pozostało mi pytanie, dlaczego moja pierwotna próba użycia \; nie działał:
iconoclast
1
Sercem twojej odpowiedzi jest użycie \; - część o run-shellu nie jest tak naprawdę ważna i myślę, że dla przykładu, który podałem display-display jest o wiele lepszy. Więc wybieram twoją odpowiedź zamiast mojej, ale czy mógłbyś edytować odpowiedź, aby nie wprowadzała w błąd ani nie myliła innych ludzi? Dzięki!
iconoclast
4

Zaraz po skomponowaniu pytania pomyślałem o czymś, co może zadziałać. Próbowałem i działa, po prostu musisz znosić wiele plików do konfiguracji tmux.

Oto rozwiązanie, szczególnie związane z ponownym ładowaniem konfiguracji. W pliku .tmux.conf umieść coś takiego:

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

W pliku ~ / .tmux / reload.tmux umieść coś takiego:

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

Działa idealnie.

ikonoklasta
źródło
1
Jest to właściwie jedyny sposób, w jaki działa. Wszystko inne tutaj po prostu nie działa.
lzap
Naprawdę? ... Minęło trochę czasu, odkąd przetestowałem inne podejście, ale byłbym zaskoczony, gdyby Tmux to zepsuł. Jeśli masz absolutną pewność, że to nie działa, przetestuję ponownie i prawdopodobnie zaakceptuję tę odpowiedź.
iconoclast
Tak przepraszam, powyższa odpowiedź naprawdę działa :-)
lzap
1

Zastosowanie metody run-shell umieszcza dane wyjściowe w buforze kopiowania, który wymaga ręcznego wyczyszczenia. Użycie pośredniego pliku konfiguracyjnego dodaje narzut związany z utrzymywaniem drugiego pliku konfiguracyjnego. Łączenie obu odpowiedzi działa lepiej w moim przypadku, ponieważ chciałem, aby komunikat zniknął po krótkim czasie, podobnie jak w wyskakującym oknie dialogowym w interfejsie GUI, ale zachowaj wszystko w jednym pliku.

bind R source-file ~/.tmux.conf \; display-message "Configuration reloaded"
Chris
źródło
0

Jest łatka pozwalająca na pełne skryptowanie w tmux, dołączając język tcl do jego wewnętrznych elementów.

http://ershov.github.io/tmux/

Pozwala także określić tyle akcji, ile chcesz dla naciśnięć klawiszy w trybie.

Korzystając z tego, twój kod wyglądałby następująco:

bind R tcl { source-file "$HOME/.tmux.conf" ; display-message "Configuration reloaded." }

lub nawet bardziej czytelny:

bind R tcl {
  source-file "$HOME/.tmux.conf"
  display-message "Configuration reloaded."
}
Jurij Erszow
źródło