Привязка ключа tmux к нескольким командам
Я запускаю многоканальное окно tmux для наблюдения за несколькими параметрами сервера. С помощью Ctrl-S я могу открыть новое окно с помощью другой команды монитора.
Теперь я хочу связать Ctrl-Q, чтобы открыть еще одно окно с несколькими мониторами. Как связать ключ с несколькими командами? Я пытался приковать их цепью; а также \; - ничего не помогает. Посоветуйте, пожалуйста, что мне использовать вместо ... ниже.
Возможно ли при открытии нового окна приостановить перекрывающиеся им фоновые команды?
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 "..."
5 ответов
Тодд Фрид прав, "правильный" способ сделать это использует \;
, Вроде, как бы, что-то вроде. Но есть загвоздка.
Видите ли, вы соединяете последовательность команд 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)
Так будет легче поддерживать.
Таким образом, настоящий ответ таков: вы объединяете команды с обратной косой чертой, за которой следует точка с запятой.
bind-key C send-keys foo \; send-keys bar
Вы должны поместить это в свой tmux.conf или запустить из командной строки tmux ":"
Вы можете сделать это с помощью небольшого обходного пути. Подобно ответу, предлагающему запустить скрипт (который хорошо обрабатывает ваш случай), в более общем смысле это можно сделать, используя "run-shell" и вызывая сам tmux в качестве команды оболочки.
bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear"
который отправит ключи 'xyz', команду tmux 'clear-history', а затем вызовет встроенную оболочку 'clear'.
Вся строка представляет собой последовательность команд из нескольких оболочек.
Все показанное здесь не будет работать, потому что это
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."
Вы можете добавить что-то подобное в привязки клавиш к вашему .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