В 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 ":
- Отметьте панель, которую вы хотите переместить.
Разделите панель, которую вы хотите разделить:
- либо с
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.