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


191

Мені подобається дзвонити :clear-history на панелі з величезною прокруткою. Однак я хочу прописати спосіб відправки цієї команди на всі області в різних вікнах.

Я знаю, як надіслати команду всім вікнам, люб’язно з цим питанням , але як я можу надсилати команду на всі області цього вікна?

send-keys і synchronize-panes з tmux manpage приходять на розум, але я не впевнений, як одружитися з ними разом. Але, можливо, є простіший спосіб зробити це.

Додаткові спостереження:

Трохи задумавшись над цим, tmux list-panes -aсхоже, перелічено всі області в поточному сеансі. Досить корисно для початку. Куди я їхати звідси?


Для тих , хто підходить до цього питання в надії знайти рішення , яке відноситься до кожної області, в кожному вікні, в кожній сесії: scripter.co/command-to-every-pane-window-session-in-tmux
БКІ

Відповіді:


355

Ви спробували слідкувати у вікні tmux з кількома панелями

Ctrl-B :

setw synchronize-panes on

clear history

53
Тільки задля повноти, щоб повернути, якщо ви цього не зробитеCtrl-b :setw synchronize-panes off
Мітч

19
і ви можете пов'язувати ярлики для цього ~/.tmux.conf, додавши: bind -n C-x setw synchronize-panes on і bind -n M-x setw synchronize-panes off
guneysus

4
можна встановити одну і ту ж комбінацію клавіш для перемикання?
Арнольд Роа

20
@ArnoldRoa так, опція буде перемикатися, якщо ви виходите on/off. Отжеbind -n C-x setw synchronize-panes
сенсація

1
Якщо я додаю, bind -n C-x setw synchronize-panesякий ярлик потрібно натиснути, щоб викликати його? Це префікс + C & x. Я спробував безліч варіантів
Білл Голдберг,

29

Трохи запізнювався на вечірку, але я не хотів встановлювати та скасовувати панелі синхронізації лише для того, щоб надіслати одну команду, щоб я створив функцію обгортки навколо 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, я маю на увазі, виконуючи цеprefix + :
Rho Phi

Я не знаю, як чи це можливо. Який сценарій використання, через який вам потрібно надіслати команду <prefix>:?
кшеной

Я б рекомендував зателефонувати до bash snippet ( : run "yourscript.sh yourargs..."); якщо ваша команда виводить, ваша активна або вказана панель відображатиме результати, поки ви не натиснете q, але в цьому випадку вона не повинна. Звичайно, ви можете псевдоніми / прив'язати це до душі. На відміну від внутрішніх процесів можуть трактуватися ваші натискання клавіш або їх наслідки по-різному, тому #{pane_current_cmd}може знадобитися білий список або чорний список . У мене ctrl + k зобов'язаний надсилати ctrl + l та clear-history; це добре працює для оболонок, але клобує буфер Віма. Мені знадобиться уточнення, перш ніж я можу транслювати свій ctrl + k.
Іван П

Це може бути більше проблемою XY; командний рядок Tmux корисний, але це здається, що ви його використовуєте, оскільки у вас немає відкритого іншого командного рядка. Ви можете встановити прив'язку клавіш - без префікса, якщо вам подобається - для перемикання та фокусування додаткової панелі з обраною вами оболонкою, замість того, щоб надсилати <prefix>:перед кожною командою, втрачаючи вихід після виходу з команди та всі підводні камені, які прийти з виконанням через Tmux. Наприклад, <prefix>:run "man cat"це не призводить до того, що людина з'являється в pidof manабо навіть ps auxf | grep man, ні як "менше", мій поточний пейджер для людини.
Іван П

Посилання мертве
Матеуш Піотровський

10

Оновлення червня 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

Тепер я можу переключити можливість синхронізації команд на декількох панелях <C-a><C-y> .

(Так, я перевстановив ключ прив’язки до Ctrl a).


4

Жоден із наведених відповідей не працював для мене (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 $ {_ панель}" потрібно буде застосувати до кожної.

Зауважте, що -aпараметр to tmux list-panesпотрібно для покриття всіх панелей у всіх вікнах протягом усіх сеансів. Без цього зачіпатимуть лише панелі у вашому поточному вікні tmux. Якщо у вас відкрито більше одного tmux сеансу і ви хочете застосувати команду до панелей у межах поточного сеансу, замініть -aна -s(Все на сторінці man tmux).

У мене немає модних точок, щоб коментувати кожен із вищезазначених відповідей, тож ось чому вони не працювали на мене:

Проблема, з якою у мене була відповідь @ shailesh-garg, полягала в тому, що синхронізація стосується лише команд, що видаються в межах панелей, а не команд tmux, виданих за допомогою Ctrl-B : яких знаходяться поза панелями.

Три проблеми, які у мене були з відповіддю @kshenoy, полягали в тому, що:

  1. він надсилає натискання клавіш всередині панелі, а не операції tmux на цій панелі, так, наприклад, якщо в панелі запущена оболонка bash, а один використовував скрипт для надсилання "ясної історії", це були б натискання клавіш, які з'явиться в командному рядку bash. Робота може полягати в тому, щоб надіслати "чітку історію tmux" або попередньо відкласти "tmux" до "$ @", але я не відредагував відповідь через інші мої проблеми з відповіддю;
  2. Я не міг зрозуміти, як надіслати персонаж нового рядка, не буквально перериваючи лінію;
  3. Навіть коли я це робив, надсилання "чіткої історії tmux" не мала ефекту.

3

моя версія tmux 1.9a, і це працює для мене, однієї клавіші вистачає і для включення, і для вимкнення

bind-key X set-window-option synchronize-panes\; display-message "synchronize-panes is now #{?pane_synchronized,on,off}"

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

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


хотів би сказати щось про цю чужу мову
Мухаммед Омер Аслам

Що? Англійська мова не важка. Але якщо вам є що сказати, то скажіть.
RJ

4
:Dчувак, вам потрібно додати якийсь опис до вашої відповіді, оскільки він має дуже мінімальний текст, і тому Stackoverflow розпізнає його як спам або низькоякісний пост, просто додайте до нього якусь деталь, щоб він не відображався під ним.
Мухаммед Омер Аслам

6
Це смішно, прийнята відповідь також не містить опису і лише код, але що б там не було.
RJ

0

Це моя функція утиліти, щоб виконувати це, виконуючи команду лише тоді, коли на панелі нічого не працює.

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

Знайдіть мій файл конфігурації з цією функцією.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.