Ответ 1
Пробовали ли вы следовать в окне tmux с несколькими панелями
Ctrl-B :
setw synchronize-panes on
clear history
Мне нравится называть :clear-history
на панелях с огромным прокруткой. Тем не менее, я хочу, чтобы script способ отправить эту команду ко всем панелям в разных окнах.
Я знаю, как отправить команду ко всем окнам, любезно предоставленную этой question, но как мне отправить команду ко всем панелям окна также?
send-keys
и synchronize-panes
из справочной страницы tmux приходят на ум, но я не уверен, как выйти за них замуж. Но, возможно, есть более простой способ сделать это.
Думая об этом немного, tmux list-panes -a
, кажется, перечисляет все панели в текущем сеансе. Довольно полезно начинать с. Куда я иду отсюда?
Пробовали ли вы следовать в окне 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} "[email protected]"
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
Более обобщенный script, для команд tmux, отличных от 'clear-history', просто заменит этот элемент параметром, например. $1. Будьте осторожны, если вы намереваетесь написать script для обработки серии команд tmux, так как "-t ${_ pane}" нужно будет применять к каждому.
Обратите внимание, что параметр -a
для tmux list-panes
требуется для покрытия всех панелей во всех окнах во всех сеансах. Без этого будут затронуты только панели в текущем окне tmux. Если у вас открыто несколько сеансов tmux и требуется применить команду к панелям в текущем сеансе, замените -a
на -s
(все это на странице man tmux).
У меня нет модов, чтобы комментировать прямо на каждый из вышеперечисленных ответов, поэтому вот почему они не работали для меня:
Проблема, с которой я столкнулся с ответом @shailesh-garg, заключалась в том, что синхронизация затронула только команды, выпущенные в панелях, а не команды tmux, выпущенные с помощью Ctrl-B :
, которые находятся за пределами панелей.
Три проблемы, которые я имел с ответом @kshenoy, заключались в следующем:
tmux send-keys -t <session id> <command> C-m
Замените "идентификатор сессии" и "команду" соответственно.
Обновление июнь 2019
Краткая иллюстрация о том, как настроить собственную привязку для синхронизации панелей.
В мой tmux.conf
добавлено следующее (комментарии, безусловно, относятся к моей общей конфигурации):
# synchronize all panes in a window
# don't use control S, too easily confused
# with navigation key sequences in tmux (show sessions)
unbind C-S
bind C-Y set-window-option synchronize-panes
Теперь я могу переключать возможность синхронизации команд на нескольких панелях с помощью <Ca><Cy>
.
(Да, я переназначил клавишу привязки на Ctrl a).
Это моя служебная функция, которая выполняет это, только выполняя команду, когда на панели ничего не работает.
#!/bin/bash
_send_bash_command_to_session() {
if [[ $# -eq 0 || "$1" = "--help" ]] ; then
echo 'Usage: _send_bash_command_to_session $session_name what ever command you want: '
return
fi
input_session="$1"
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 $1
}
Пример, нацеленный на сеанс с именем dev, включающий python virtualenv на всех панелях в bash
или zsh
, избегая выполнения команды в панелях с vim или любым другим исполняемым файлом:
_send_bash_command_to_session dev workon myvirtualenv
или проще запомнить: чтобы сделать это в текущем сеансе:
tmux_set_venv myvirtualenv
Найдите мой файл конфигурации с этой функцией.