Как отправить команду на все панели в tmux?
мне нравится звонить :clear-history на панели с огромным прокрутки. Тем не менее, я хочу написать сценарий, чтобы отправить эту команду на все панели в различных окнах.
Я знаю, как отправить команду во все окна, любезно предоставив этот вопрос, но как я могу отправить команду во все окна этого окна?
send-keys и synchronize-panes из tmux manpage приходят на ум, но я не уверен, как поженить их вместе. Но, может быть, есть более простой способ сделать этот.
Дополнительные Замечания:
подумав об этом немного, tmux list-panes -a кажется, чтобы перечислить все панели в текущем сеансе. Довольно полезно для начала. Куда мне теперь идти?
5 ответов:
вы пробовали следовать в окне tmux с несколькими панелями
Ctrl-B : setw synchronize-panes on clear history
немного поздно на вечеринку, но я не хотел устанавливать и отключать синхронизацию-панели, чтобы отправить одну команду, поэтому я создал функцию-оболочку вокруг tmux и добавил пользовательскую функцию под названием
send-keys-all-panes._tmux_send_keys_all_panes_ () { for _pane in $(tmux list-panes -F '#P'); do tmux send-keys -t ${_pane} "$@" done }Я также создаю оболочку вокруг команды tmux, чтобы упростить вызов этой функции (для удобства). Обертка и приведенный выше код все здесь.
Это позволяет мне работать
tmux send-keys-all-panes <command>илиtmux skap <commandотправить<command>все панели.обратите внимание, что tmux имеет псевдоним для моей функции-оболочки tmux_pp.
ни один из приведенных выше ответов не работал для меня (tmux v2. 3), но это было сделано из командной строки bash:
for _pane in $(tmux list-panes -a -F '#{pane_id}'); do \ tmux clear-history -t ${_pane} ; doneболее обобщенный сценарий для команд tmux, отличных от "clear-history", просто заменит этот элемент параметром, например. $1. Будьте осторожны, если вы собираетесь написать сценарий для обработки серии команд tmux, так как "-t ${_pane}" нужно будет применить к каждому.
отметим, что до
tmux list-panesтребуется, чтобы покрыть все панели во всех окна во всех сеансах. Без этого будут затронуты только панели в вашем текущем окне tmux. Если у вас открыто несколько сеансов tmux и вы хотите применить команду только к панелям в текущем сеансе, замените-aС-s(это все в справочной странице tmux).у меня нет точек мод, чтобы комментировать непосредственно каждый из вышеперечисленных ответов, так вот почему они не работали для меня:
проблема, которая у меня была с ответом @shailesh-garg, заключалась в том, что синхронизация затронуты только команды, выпущенные в пределах панелей, а не команды tmux, выпущенные с использованием
Ctrl-B :, которые находятся за пределами области.три проблемы, которые у меня были с ответом @kshenoy, заключались в следующем:
- он отправляет нажатия клавиш в пределах панели, а не в операции tmux например, если у вас была оболочка bash, работающая в этой области панель и один использовали скрипт для отправки "clear-history", те будут нажатия клавиш, которые появятся в командной строке bash. Один обходной путь состоял бы в том, чтобы отправить "tmux clear-history" или pre-pend "tmux " до"$@", но я не редактировал ответ из-за моего другого проблемы с ответом;
- Я не мог понять, как отправить символ новой строки без буквального разрыва строки;
- даже когда я это сделал, отправка "tmux clear-history" не имела никакого эффекта.
tmux send-keys -t <session id> <command> C-mзамените "идентификатор сеанса" и "команда" соответственно.
Это моя служебная функция, чтобы сделать это, только выполнив команду, когда там ничего не работает на панели.
#!/bin/bash _send_bash_command_to_session() { if [[ $# -eq 0 || "" = "--help" ]] ; then echo 'Usage: _send_bash_command_to_session $session_name what ever command you want: ' return fi input_session="" input_command="${@:2}" for _pane in $(tmux list-panes -s -t ${input_session} -F '#{window_index}.#{pane_index}'); do # only apply the command in bash or zsh panes. _current_command=$(tmux display-message -p -t ${input_session}:${_pane} '#{pane_current_command}') if [ ${_current_command} = zsh ] || [ ${_current_command} = bash ] ; then tmux send-keys -t ${_pane} "${input_command}" Enter fi done } tmux_set_venv() { _current_session=$(tmux display-message -p '#{session_name}') _send_bash_command_to_session ${_current_session} workon }пример таргетинга на сеанс под названием dev, включение Python virtualenv во всех панелях, которые находятся в
bashилиzsh, избегая выполнения команды в панелях с vim или любым другим исполняемым файлом:_send_bash_command_to_session dev workon myvirtualenvили проще запомнить: сделать это в текущей сессии:
tmux_set_venv myvirtualenvпоиск конфигурационный файл с этой функцией.
Comments