Перемещение панели tmux в окно

228

Как переместить существующую панель в другое окно в tmux, когда у меня несколько окон, и наоборот?

Я иду с экрана , где я могу переключиться на панель, а затем переключать окна, пока не доберусь до нужного; Кажется, tmux этого не позволяет.

mrlanrat
источник

Ответы:

209

Команда для этого есть join-paneв tmux 1.4.

join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane]  
    (alias: joinp)
    Like split-window, but instead of splitting dst-pane and creating
    a new pane, split it and move src-pane into the space.  This can
    be used to reverse break-pane.

Чтобы упростить это, у меня .tmux.confдля этого есть следующие привязки :

# pane movement
bind-key j command-prompt -p "join pane from:"  "join-pane -s '%%'"
bind-key s command-prompt -p "send pane to:"  "join-pane -t '%%'"

Первый захватывает панель из целевого окна и присоединяет ее к текущей, второй делает обратное.

Затем вы можете перезагрузить сеанс tmux, выполнив следующее из этого сеанса:

$ tmux source-file ~/.tmux.conf
jasonwryan
источник
Я пытаюсь этот метод, но когда я помещаю ваш код в мой файл .tmux.conf и выполняю Ctrl-b, j, кажется, ничего не происходит.
Мрланрат
2
Вам нужно открыть как минимум 2 окна с несколькими панелями в каждом: затем нажмите Prefix+sи введите имя окна в
командной
Мне до сих пор не повезло, ничего не происходит. У меня такое ощущение, что tmux не читает файл .tmux.conf, потому что он совсем не реагирует на Ctrl-b, j или Ctrl-b, s. (это только две строки в конфигурационном файле)
mrlanrat
7
@mrlanrat Я считаю, что вы должны префикс номера окна с двоеточием. Смотрите мой ответ ниже.
Бруно Броноски
1
На что ссылается «%%»?
олигофрен
152

Панель соединения - это ответ. У меня тоже были проблемы с попытками использовать его, основываясь на документации tmux. Я обнаружил, что ключи -t и -s, похоже, принимают [session]: window, а не [session:] window. То есть указание сеанса является необязательным, но в том числе: является обязательным. (Я использую tmux 1.5)

Поэтому, чтобы добавить панель к текущему окну и поместить окно 1 в панель, команда должна быть (Ctrl-B или любой другой ключ привязки, а затем) ...

:join-pane -s :1

Затем вы можете разбить их, используя панель разбивки, которая по умолчанию: Ctrl-B! Если вы хотите привязать его к ярлыку, я НЕ предлагаю переопределять привязку по умолчанию, такую ​​как s, потому что в будущем вы будете искать в Интернете ответ, который включает выбор сеанса, и он не будет работать в вашей системе. Обратите внимание, что панель разбивки обязана! и @ находится рядом с ним и по умолчанию не привязан ни к чему. По этой причине я предлагаю этот обязательный ...

bind-key @ command-prompt -p "create pane from:"  "join-pane -s ':%%'"

Альтернативно, чтобы иметь интерактивный выбор ...

bind-key @ choose-window 'join-pane -h -s "%%"'

Альтернативно, чтобы всегда присоединяться к последнему посещенному окну ...

bind-key @ join-pane -h -s !

ПРИМЕЧАНИЕ. Это -hприводит к тому, что панели располагаются горизонтально (с вертикальным разделением), в отличие от поведения по умолчанию, которое является обратным.

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

На этом мое преобразование из GNU Screen в Tmux завершено. Я никогда не буду оглядываться назад.

Наслаждайтесь!

Бруно Броноски
источник
2
Я тоже скучал по ':' ... спасибо за это.
гулял
Я недавно получил 2 отрицательных голоса по этому вопросу без комментариев, объясняющих почему. Это просто грубая и анти-FOSS культура.
Бруно Броноски
1
документация вообще не говорит о двоеточии! Хороший
JonnyRaa
1
Использование точечного синтаксиса помогло мне, window.paneнапример, join-pane -s 1.0переместить панель 0 в окне 1 в текущее окно. Более подробная информация на maciej.lasyk.info/2014/Nov/19/tmux-join-pane
mbigras
Начиная с tmux 2.1, :очевидно, больше не требуется (например, просто делайте :join-pane -s 1). Возможно, это было ошибкой в ​​более ранних версиях
villapx
38

Я думаю, что мне нравится то, что я использовал для перемещения панелей в собственное окно. я использую

break-pane -t :

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

Джошуа К
источник
2
+1. Я склонен использовать это гораздо чаще, чем join-pane.
Крис Б.
14

Если вы не хотите вводить идентификатор панели в приглашение, вы также можете использовать

bind-key j "join-pane -s !"

который присоединит последнюю активную панель / окно к текущему окну.

Бернхард Т
источник
1
Какую версию вы используете? Я получаю unknown command: join-pane -s !с 1.6.
paradroid
Использование 2.0 здесь, но просто помещая строку в conf без кавычек, кажется, работает хорошо. bind-key j join-pane -s !
bkzland
13

Посмотрев другие ответы и просмотрев справочную страницу tmux, я остановился на следующих привязках:

bind-key S choose-window 'join-pane -v -s "%%"'
bind-key V choose-window 'join-pane -h -s "%%"'

Это позволит вам в интерактивном режиме выбрать окно для присоединения и отразить мои строчные s/ vпривязки для создания новых вертикальных / горизонтальных разбиений. Если кто-нибудь знает, как выбрать отдельные панели вместо окон, дайте мне знать.

toupeira
источник
Это очень полезно. Спасибо. К сожалению, -vи -hне создают вертикальные и горизонтальные "расщепления" соответственно. Они создают вертикальные и горизонтальные « сложенные панели » соответственно. (Это означает, что вертикально расположенные панели имеют горизонтальное разделение.) Таким образом, вы должны тренировать свой мозг таким образом. Кроме того, -vэто значение по умолчанию, поэтому я бы оставил это и оставил только -hтам, чтобы вы ~/.tmux.confдействовали как шпаргалка для просмотра.
Бруно Броноски
Мне нравится это лучше, чем другие ответы на "противоположность панели разрыва". Временно разбив панель на свое собственное окно, позже я хочу отправить ее обратно в одно из старых окон, и это изящно обрабатывается.
Конюшня
13

Связывание ключей

По умолчанию, Ctrl+ b, !будет нарушать активную панель в новое окно и переключиться на него.

Где Ctrl+ bэто префикс по умолчанию для .

подробности

Команда, которую tmuxвыполняет этот ключ, break-pane(alias:) breakpреализована cmd-break-pane.cв key-bindings.c и привязана к нему по умолчанию, как показано в выводе команды list-keys(alias lsk:):

bind-key    -T prefix       !                 break-pane
Мур
источник
4

Вам не нужно менять привязки клавиш.

В то время как область, которую вы хотите переместить, имеет фокус, введите Prefix, затем :join-pane -t :1где 1находится любой номер окна назначения в том же сеансе. Вы можете переместить его в другой сеанс, добавив его имя, например project:3. Для меня join-paneвкладка-автозаполнение от j.

Добавьте -hили -vпереключитесь в команду, чтобы установить ориентацию нового разбиения, созданного в месте назначения, или просто перейдите к нему и нажмите «Префиксspaceдля перегруппировки.

WALF
источник