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

136

Типичная ситуация может быть:

$ tmux
  [0] $ ssh example.com
      $ tmux attach
        [0] $ 

Я открываю сеанс tmux, затем подключаюсь к серверу по ssh и присоединяюсь к существующему сеансу tmux. На данный момент у меня есть один сеанс tmux внутри другого. Как отправить команды во внутреннюю сессию tmux?

Примечание. Обе сессии tmux имеют одинаковые привязки клавиш.

Kris
источник
4
не вопрос программирования. Пожалуйста, попробуйте superuser.com . Удачи.
Оболочка
1
Я рад попросить перенести вопрос, однако для контекста я использую vim внутри tmux для кодирования и, конечно, часто приходится подключаться к ssh другим серверам, где и возникает эта проблема.
Крис

Ответы:

207

send-prefixКоманда может быть использована для отправки префикса нажатия клавиши (процесс обкатки) активная панели. По умолчанию префикс Cb и Cb обязан send-prefix(так , что удар его дважды посылает один Cb на активной панели). Это как раз то, что нам нужно для доступа к привязкам внутреннего экземпляра tmux .

Первый Cb фиксируется «внешним» экземпляром tmux в качестве его префиксного ключа. Второй захватывается «внешним» экземпляром tmux и запускает привязку Cb ( send-prefix). Это отправляет Cb на активную панель внешнего экземпляра. Процесс, запущенный на этой панели, является (в конечном счете, через экземпляр ssh ) «внутренним» экземпляром tmux . Он захватывает Cb в качестве префиксного ключа. Теперь ваше следующее нажатие клавиши будет пропущено через внешний экземпляр tmux и захвачено внутренним, чтобы вызвать привязку.

Чтобы вызвать привязку c ( new-window) в экземпляре tmux второго уровня , вы должны набрать Cb Cb c . Для экземпляра tmux третьего уровня вы должны набрать Cb Cb Cb Cb c .

Это удвоение для каждого уровня может раздражать, если вы обычно имеете дело с несколькими слоями tmux . Если вы можете сэкономить какой-то другой ключ, вы можете сделать привязку без префикса, чтобы упростить ввод (возможно):

bind-key -n C-\ send-prefix
bind-key -n C-^ send-prefix \; send-prefix

Создать новое окно в tmux второго уровня : C- \ c
Создать новое окно в tmux третьего уровня : C- ^ c (или C- \ C- \ c )


Если у вас есть ограниченное количество команд tmux, которые вы хотите (легко) отправить в экземпляры tmux более низкого уровня , вы можете вместо этого использовать их send-keysдля создания некоторых конкретных привязок (возможно, только в вашем экземпляре tmux верхнего уровня ):

bind-key C-c  send-keys C-b c
bind-key C    send-keys C-b C-b c

Создать новое окно в tmux второго уровня : Cb Cc
Создать новое окно в tmux третьего уровня : Cb C

Крис Джонсен
источник
Кроме того , я должен был закомментировать мою существующую last-windowсилу , как это называлось , когда делать C-a C-a, как таковой: #bind-key C-a last-window. Обратите внимание, мой префикс a, а не по умолчанию b.
Крис
1
bind-key -n C-\ send-prefixне работает. Мой tmux не распознает \. Когда я использую письмо, это работает.
Даркский
@Darksky: Какую версию tmux вы используете? У меня работает с 1.7, 1.6 и 1.5. Вам обязательно нужно будет добавить дополнительный уровень цитирования, если вы делаете привязку из команды оболочки (т.е. tmux bind-key -n 'C-\' send-prefix); если у вас возникли проблемы с его получением ~/.tmux.conf(или из :командной строки Prefix ), вы можете попробовать аналогичное цитирование (т.е. bind-key -n 'C-\' send-prefix).
Крис Джонсен
51

Чтобы получить доступ к внутреннему, удерживайте контроль и дважды нажмите B.

thouliha
источник
7

РЕДАКТИРОВАТЬ:

Я НЕ рекомендую использовать C-qв качестве связующего ключа, так как это стандартная команда управляющего ключа для

разблокирует экран и позволяет продолжить отображение

Ситуация происходит здесь , и @Paschalis предлагает решение:

если это происходит дважды (удаленный сеанс tmux с префиксом Cq): введите Cltr-q, затем :и введите tmux:send-keys C-q

Ниже это ответ:


Чтобы сделать это просто, добавьте следующую строку в ~/.tmux.conf

bind-key -n C-q send-prefix

Затем вы можете напрямую использовать в C-qкачестве связующего ключа для вашего удаленного Tmux.

Qun
источник
если кто-то изменил ключ связывания по умолчанию во внешнем tmux, он должен использовать тот же ключ связывания по умолчанию во внутреннем tmux, чтобы приведенный выше фрагмент работал!
Пасхалис
я изменяю префикс моего локального tmux (в моем случае это Ctrl +], чтобы все «внутренние» tmux-es на серверах имели привязку по умолчанию для префикса
бездействие