Загрузить терминал из другого окна в текущую разделенную панель в tmux

Загрузить терминал из другого окна в текущую разделенную панель в tmux

В GNU Screen я могу переключиться на любой номер окна в пределах заданного разделения. Например:

  • Нажмите Enter screen, чтобы запустить его.
  • Нажмите Ctrl+ a c, чтобы создать новое окно. Теперь есть два окна: окно 0 и окно 1. Текущее окно теперь — окно 1.
  • Нажмите Ctrl+ a Shift+, sчтобы создать новое разделение.
  • Нажмите Ctrl+, a Tabчтобы перейти к новому разделению.
  • Нажмите Ctrl+ 0, чтобы загрузить окно 0 в этом новом разделе.

Как можно сделать что-то подобное в Tmux? Вот что у меня получилось:

  • Нажмите Enter tmux, чтобы запустить его.
  • Нажмите Ctrl+ b c, чтобы создать новое окно. Теперь есть два окна: окно 0 и окно 1. Текущее окно — окно 1.
  • Нажмите Ctrl+, b "чтобы создать новую разделенную панель. Текущая панель теперь является новой разделенной панелью.
  • Как теперь загрузить оболочку в окне 0 в эту новую разделенную панель?

Есть ли способ смоделировать такое поведение экрана в tmux?

решение1

Tmux не поддерживает отображение одной и той же панели в двух разных окнах, а также не поддерживает отображение одной и той же панели дважды в одном окне. Вы можете привязать целое окно к сеансу, не отсоединяя его от исходного сеанса. Или вы можете поместить панель в другое окно, но это удалит панель из исходного окна.

В вашем примере вы уже создали панель, которая содержит место для желаемой панели. В этом случае вы можете поменять две панели с помощью swap-paneкоманды tmux. Из man 1 tmux:

swap-pane [-dDU] [-s src-pane] [-t dst-pane]
(псевдоним: swapp)

Поменять местами две панели. […] -dуказывает tmux не менять активную панель.

Если -sпараметр опущен и присутствует отмеченная панель (см. select-pane -m), то вместо текущей панели используется отмеченная панель.

Это даже лучше: если -sи -tоба пропущены и присутствует отмеченная панель, отмеченная панель и текущая панель меняются местами. В любой момент времени может быть максимум одна отмеченная панель в пределах всего сервера tmux.

Как теперь загрузить оболочку в окне 0 в эту новую разделенную панель?

Перейдите в окно 0 и отметьте панель , которую вы хотите переместить (в вашем примере это единственная панель). Вы делаете это с помощью ПКМ (если поддерживается мышь) или prefix m(где по умолчанию prefix+ ). Перейдите обратно в новую панель и вызовите:Ctrlb

tmux swapp

Оболочка, которую вы вызываете, tmux swappне уничтожается автоматически, теперь она находится в окне 0, где раньше была отмеченная панель. В вашем примере, похоже, вам не нужна сама эта оболочка, вам нужна только новая панель; если так, рассмотрите tmux swapp && exitвместо этого. Имейте в виду, что если отмеченной панели нет (или если текущая отмечена), то tmux swappфактически ничего не будет делать. В таком случае tmux swapp && exitпросто выйдет из оболочки.

В качестве альтернативы,вместосоздания новой разделенной панели вы можете переместить нужную панель в текущее окно за один шаг.

join-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane]
(псевдоним: joinp)

Как split-window, но вместо того, чтобы разделить dst-paneи создать новую панель, разделите ее и переместите src-paneв пространство. […]

Если -sпараметр опущен и присутствует отмеченная панель (см. select-pane -m), то вместо текущей панели используется отмеченная панель.

Поэтому вместо prefix ":

  1. Отметьте панель, которую вы хотите переместить.
  2. Разделите панель, которую вы хотите разделить:

    • либо с tmux joinp -vвызванным в оболочке там;
    • или с prefix : joinp -v Enter; в частности, это полезно, когда в панели, которую вы хотите разделить, нет неактивной оболочки (но не забудьте сначала сделать панель текущей).

Метод with prefix :можно использовать для вызова swappлюбой другой команды tmux.

Ниже приведены несколько заметок о манипулировании панелями извне tmux. Примеры используют , tmux swappно вы можете вызывать их tmux joinpаналогично.


swap-paneпозволяет вам обмениватьсялюбойдве панели в сервере tmux. Вы можете запустить tmux swappдаже изснаружиtmux, без ручной разметки и изменения панелей, если вы знаете, как обращаться к двум панелям, которые вы хотите поменять местами. Это может быть:

tmux swapp -s 0:1.1 -t 0:0.0

Формат session:window.pane, см. руководство, где это объясняется target-pane. Обратите внимание, что эти голые числа являются "относительными" (по крайней мере :window.pane, часть, я не уверен насчет sessionчисла). Самая первая панель 0:0.0после замены на 0:1.1становится 0:1.1. С другой стороны, сеансы tmux, окна и панели имеют своиуникальныйидентификаторы (с префиксом $, @и %соответственно). В вашем случае команда может быть такой:

tmux swapp -s %2 -t %0

Но обратите внимание, если старая панель действительно была %0в 0:0.0, а новая была %2в , 0:1.1то теперь они находятся %0в 0:1.1и %2в 0:0.0соответственно. Уникальный идентификатор каждой панели «прикреплен» к содержимому (процессу) панели и «путешествует» вместе с ним. Идентификаторы панелей без префикса зависят от общего количества панелей и их размещения в окне.

Вы можете называть сеансы ( rename-session) и окна ( rename-window). Это упрощает идентификацию панелей session:window.pane.


Вы можете запустить более одного сервера tmux. Серверы идентифицируются по путям к сокетам ( -Lопция) или именам сокетов ( -S). Имя по умолчанию — default. Если вы вызовете tmuxбез этих опций из tmux, то он найдет нужный сервер (через TMUXпеременную окружения, я думаю). Если вы вызовете tmuxбез этих опций извне tmux, то он будет похож на tmux -S default. Вы можете захотеть поменять местами две панели, которые принадлежат нестандартному серверу tmux, например:

tmux -S other swapp -s 0:1.1 -t 0:0.0

Tmux не поддерживает обмен панелями между серверами. Весь смысл наличия двух серверов в том, что они разделены. Если вам когда-нибудь понадобится поменять панели между двумя полураздельными сущностями tmux, эти сущности должны быть сеансами в пределах одного сервера tmux. Вы можете поменять панели между различными сеансами.

Если вам действительно нужно «взять под контроль» процесс, запущенный на другом сервере tmux, используйтеreptyr. Инструмент полностью независим от tmux.

Связанный контент