Прив’язування клавіші tmux до кількох команд


37

Я запускаю багатопанельне вікно tmux для моніторингу декількох параметрів сервера. За допомогою Ctrl-S я можу відкрити нове вікно за допомогою іншої команди монітора.

Тепер я хочу зв’язати Ctrl-Q, щоб відкрити ще одне багатопанельне вікно з кількома моніторами. Як зв'язати ключ до кількох команд? Я спробував прикувати їх до себе; і \; - нічого не допомагає. Підкажіть, будь ласка, що я повинен використовувати замість ... нижче.

Чи можливо, коли я відкриваю нове вікно, призупиняти перекриті ним фонові команди?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."

Відповіді:


37

Тод Фрід має рацію, "правильний" спосіб це зробити - це використовувати \;. Типу. Але є корч.

Розумієте, ви з'єднуєте послідовність команд tmux разом, надаючи tmux сполучник ;. Таким чином, ви можете сказати у файлі, створеному tmux

new-session "monitor1" ; split-window -v "monitor2"

якщо ви чомусь хотіли, щоб це все було в одному рядку. Тепер ви можете дати , що складовою оператор одного рядка до tmuxкоманді з оболонки також , але; повинні бути екрановані , так що оболонка інтерпретує його як ще один аргумент в користь tmux. Таким чином, еквівалент вищезазначеного з оболонки є

$ tmux new-session "monitor1" \; split-window -v "monitor2"

Аналогічно bind-keyкоманда tmux приймає ряд аргументів, які є командою tmux та аргументами, які потрібно запустити при натисканні клавіші. Якщо ви хочете прив’язати C-qдо вищезазначеної послідовності всередині файлу, створеного tmux, ви скажете

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

Тут ми уникнули ; від tmux , так що tmux не трактує це як кінець bind-keyкоманди, а як інший аргумент, який повинен bind-keyсказати йому сформувати складну команду як обмежене значення C-qключа.

Отже, що відбувається, коли ми хочемо змусити tmux робити це з оболонки? Ціла купа втечі.

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

По- перше, ми повинні рятуючись від \ і; кожен з оболонки , в результаті чого оболонка пройти два символу в \;якості аргументу tmux. Потім це виходить ;з tmux, внаслідок чого він присвоює весь складений оператор як зв'язування C-q.


Тепер, усе, що сказано, якщо ви використовуєте складну програму tmux, як це неодноразово, я б запропонував вам створити файл tmux, щоб зберегти його:

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

І потім:

$ tmux source split-windows.tmux  # (or even make an alias for this)

Це буде набагато простіше підтримувати такий спосіб.


3
Щоб зробити ключі до декількох команд з командного рядка менш жахливими для перегляду, ви також можете втекти рядок \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap

12

Тож справжня відповідь така: ви ланцюжок команд із зворотною косою рисою, а потім крапкою з комою.

bind-key C send-keys foo \; send-keys bar

Ви поставите це у свій tmux.conf або запустіть із підказки tmux ":"


це було чудово і працювало для використання вкладеного сеансу tmux та навігації через вкладені вікна tmux.
Пол

1
Це не працює з командного рядка оболонки. Тобто `tmux прив'язуючий ключ C відсилає ключі foo \; bar-send bar "має ефект прив'язки" foo "до" C ", але друкує" bar "негайно.
Lqueryvg

Так, ви б запустили це зсередини tmux. Оновлено для уточнення.
Тодд Фрід

Приємно! Це повністю працює ... muchas gracias!
Бред Паркс

Примітка: а; всередині однієї котировки не потрібно бігти
відміняйте

2

Ви можете це зробити за допомогою невеликого вирішення. Подібно до відповіді, що пропонує сценарій для запуску (який добре обробляє ваш випадок), це, як правило, можна зробити, використовуючи "run-shell" і викликаючи tmux як команду shell.

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

який надсилатиме ключі 'xyz', tmux команда 'clear-history', а потім викликає вбудований оболонку 'clear'.

Весь рядок - це лише декілька командних послідовностей оболонок.


1

Ви можете додати щось подібне до основних прив’язок до вашого .tmux.confфайлу:

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

А в tmux-new-session.shвас може бути:

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit

1

Все, що тут показано, не буде працювати, бо це

bind q send-keys "command1" \; send-keys "command2"

виконає команду2 негайно, і q буде прив’язаний лише до клавіш send "command1"

Ось рішення:

bind R source-file "$HOME/.tmux/reload.tmux"

У файл ~ / .tmux / reload.tmux помістіть кілька команд, таких як:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."

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