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



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



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



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



Дополнительные Замечания:



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

481   5  

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, заключались в следующем:

  1. он отправляет нажатия клавиш в пределах панели, а не в операции tmux например, если у вас была оболочка bash, работающая в этой области панель и один использовали скрипт для отправки "clear-history", те будут нажатия клавиш, которые появятся в командной строке bash. Один обходной путь состоял бы в том, чтобы отправить "tmux clear-history" или pre-pend "tmux " до"$@", но я не редактировал ответ из-за моего другого проблемы с ответом;
  2. Я не мог понять, как отправить символ новой строки без буквального разрыва строки;
  3. даже когда я это сделал, отправка "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

    Ничего не найдено.