Привязка ключа tmux к нескольким командам

37

Я запускаю многоканальное окно tmux для наблюдения за несколькими параметрами сервера. С помощью Ctrl-S я могу открыть новое окно с помощью другой команды монитора.

Теперь я хочу , чтобы связать Ctrl-Q , чтобы открыть другой multipane окно с несколькими мониторами. Как связать ключ с несколькими командами? Я пытался приковать их цепью; а также \; - ничего не помогает. Посоветуйте, пожалуйста, что мне использовать вместо ... ниже.

Возможно ли при открытии нового окна приостановить перекрывающиеся им фоновые команды?

    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
источник

Ответы:

37

Тодд Фрид прав, «правильный» способ сделать это - использовать \;. Вроде. Но есть загвоздка.

Видите ли, вы соединяете последовательность команд tmux вместе, давая tmux соединение ;. Таким образом, в файле, полученном от tmux, вы можете сказать

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

если по какой-то причине вы хотели, чтобы все это было в одной строке. Теперь вы можете передать этот однострочный составной оператор tmuxкоманде также из оболочки, но его ;необходимо экранировать, чтобы оболочка интерпретировала его как еще один аргумент для tmux. Таким образом, эквивалент вышеупомянутого из оболочки

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

Точно так же команда tmux bind-keyпринимает серию аргументов, которые являются командой tmux и аргументами, запускаемыми при нажатии клавиши. Если вы хотите привязать C-qвышеуказанную последовательность из файла, созданного tmux, вы бы сказали

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

Здесь мы экранировали ; от tmux , так что tmux интерпретирует его не как конец bind-keyкоманды, а как еще один аргумент, чтобы bind-keyсказать ей сформировать составную команду как связанное значение C-qключа.

Так что же происходит, когда мы хотим, чтобы tmux делал это из оболочки? Много побега.

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

Во- первых, мы должны спасаясь от \ и; каждый из оболочки , в результате чего оболочка пройти два символа в \;качестве аргумента tmux. Затем он экранируется ;от tmux, заставляя его назначить весь составной оператор в качестве привязки C-q.


Теперь, все это говорит, что если вы будете использовать сложную настройку tmux, как это неоднократно, я бы предложил вам создать файл tmux, чтобы сохранить его:

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

А потом:

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

Так будет легче поддерживать.

Peeja
источник
3
Чтобы сделать привязку ключей к нескольким командам из командной строки менее ужасной для просмотра, вы также можете использовать строку escape \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap
12

Таким образом, настоящий ответ таков: вы объединяете команды с обратной косой чертой, за которой следует точка с запятой.

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

Вы должны поместить это в свой tmux.conf или запустить из командной строки tmux ":"

Тодд Фрид
источник
это было замечательно и работало для использования вложенного сеанса tmux и навигации по вложенным окнам tmux.
Пол
1
Это не работает из командной строки оболочки. Т.е. `tmux bind-key C send-keys foo \; «send-keys bar» имеет эффект привязки «foo» к «C», но немедленно печатает «bar».
Lqueryvg
Да, вы бы запустили это изнутри tmux. Обновлено, чтобы уточнить.
Тодд Фрид
Ницца! Это полностью работает ... много чего!
Брэд Паркс
Примечание: а; внутри одинарных кавычек не нужно убегать
elig
2

Вы можете сделать это с помощью небольшого обходного пути. Подобно ответу, предлагающему запустить скрипт (который хорошо обрабатывает ваш случай), в более общем случае это можно сделать, используя «run-shell» и вызывая сам tmux в качестве команды оболочки.

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

который отправит ключи 'xyz', команду tmux 'clear-history', а затем вызовет встроенную оболочку 'clear'.

Вся строка представляет собой последовательность команд из нескольких оболочек.

брод
источник
1

Вы можете добавить что-то вроде этого к привязкам клавиш в вашем .tmux.confфайле:

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

И у tmux-new-session.shвас может быть:

#! /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
источник
1

Все показанное здесь не будет работать, потому что это

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

выполнит команду command2 немедленно, а q будет привязан только к send-keys "command1"

Вот решение:

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

В файле ~ / .tmux / reload.tmux поместите несколько команд, например:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."
lzap
источник
1
Ой, подождите, используйте то, что сказал Пиджа (\\\;) :-)
lzap