Как отправить команду ко всем панелям в tmux?

Мне нравится называть :clear-history на панелях с огромным прокруткой. Тем не менее, я хочу, чтобы script способ отправить эту команду ко всем панелям в разных окнах.

Я знаю, как отправить команду ко всем окнам, любезно предоставленную этой question, но как мне отправить команду ко всем панелям окна также?

send-keys и synchronize-panes из справочной страницы tmux приходят на ум, но я не уверен, как выйти за них замуж. Но, возможно, есть более простой способ сделать это.

Дополнительные наблюдения:

Думая об этом немного, tmux list-panes -a, кажется, перечисляет все панели в текущем сеансе. Довольно полезно начинать с. Куда я иду отсюда?

Ответ 1

Пробовали ли вы следовать в окне tmux с несколькими панелями

Ctrl-B :

setw synchronize-panes on

clear history

Ответ 2

Немного опоздал на вечеринку, но я не хотел устанавливать и снимать синхронизирующие панели только для того, чтобы отправить одну команду, поэтому я создал функцию-оболочку для 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.

Ответ 3

Ни один из вышеперечисленных ответов не работал у меня (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 этой панели, например, если у вас была оболочка bash, работающая в панели и один использовали script для отправки "clear-history", будут нажатия клавиш, которые появятся в командной строке bash. Обход должен был бы отправить "tmux clear-history" или предварительно отложить "tmux" до "$ @", но я не отредактировал ответ из-за моего другого проблемы с ответом;
  • Я не мог понять, как отправить new-line персонаж без буквального разрыва линии;
  • Даже когда я это сделал, отправка "tmux clear-history" не имела никакого эффекта.

Ответ 4

tmux send-keys -t <session id> <command> C-m  

Замените "идентификатор сессии" и "команду" соответственно.

Ответ 5

Обновление июнь 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).

Ответ 6

Это моя служебная функция, которая выполняет это, только выполняя команду, когда на панели ничего не работает.

#!/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

Найдите мой файл конфигурации с этой функцией.