- Вопрос или проблема
- Привязка клавиш
- Детали
- Ответ или решение
- Перемещение панели tmux в другое окно
- Введение
- Основная команда: join-pane
- Примечание по параметрам:
- Примеры использования команды
- Перемещение панели в текущее окно
- Перемещение панели в другое окно
- Оптимизация работы с панелями
- Настройки в .tmux.conf
- Перерывание панели
- Дополнительные функции и настройки
- Использование fzf для выбора окон
- Заключение
Вопрос или проблема
Как мне переместить существующую панель в другое окно в tmux, когда у меня несколько окон, и наоборот?
Я пришёл из screen, где я могу переключаться на панель, а затем переключать окна, пока не дойду до нужного; tmux не позволяет делать это.
Команда для этого – join-pane
в tmux 1.4.
join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] (alias: joinp) Как split-window, но вместо разделения dst-pane и создания новой панели, разделяет её и перемещает src-pane в освободившееся место. Это можно использовать для обратного действия break-pane.
Чтобы упростить это, у меня есть следующие привязки в .tmux.conf
:
# перемещение панелей
bind-key j command-prompt -p "присоединить панель из:" "join-pane -s '%%'"
bind-key s command-prompt -p "отправить панель в:" "join-pane -t '%%'"
Первая получает панель из целевого окна и присоединяет её к текущей, вторая делает наоборот.
Вы можете перезагрузить свою сессию tmux, запустив следующее изнутри сессии:
$ tmux source-file ~/.tmux.conf
Допустим, вы находитесь в панели (в окне 1
), которую хотите s
отправить в окно 0
. Чтобы выполнить команду, вы можете сделать
PREFIX s
И когда появится подсказка “отправить панель в:
, введите :0<Enter>
(обратите внимание на двоеточие).
join-pane – это ответ. У меня также были проблемы с моими попытками использовать это на основе документации tmux. Я обнаружил, что переключатели -t
и -s
, похоже, принимают [session]:window
, а не [session:]window
. То есть, указание сессии является необязательным, но включение :
обязательно. (Я использую tmux 1.5)
Поэтому, чтобы добавить панель в текущее окно и поместить окно 1 в панель, команда будет следующей (Ctrl+B или какая бы ни была ваша привязка, затем)…
:join-pane -s :1
Вы затем можете разъединить их с помощью break-pane, который по умолчанию это: Ctrl+B !. Если вы хотите привязать это к сочетанию клавиш, я предлагаю не переопределять стандартную привязку как s, потому что позже вы будете искать в интернете ответ, который включает choose-session, и он не будет работать на вашей системе. Заметьте, что break-pane привязан к !, а @ находится рядом и по умолчанию не привязан ни к чему. По этой причине я предлагаю следующую привязку…
bind-key @ command-prompt -p "создать панель из:" "join-pane -s ':%%'"
В качестве альтернативы, чтобы иметь интерактивный выбор…
bind-key @ choose-window 'join-pane -h -s "%%"'
bind-key C-@ choose-window 'join-pane -s "%%"'
В качестве альтернативы, чтобы всегда присоединять к недавно посещенному окну…
bind-key @ join-pane -h -s !
ПРИМЕЧАНИЕ: -h
заставляет панели располагаться горизонтально (с вертикальным разделением) в отличие от поведения по умолчанию, которое является обратным.
Самое важное, что вам нужно ЗНАТЬ то, что вы выберете в качестве сочетания клавиш. Потому что если вы просто установите это и забудете, вы будете в затруднении, если окажетесь на чужом сервере. И давайте смотреть правде в глаза, самое важное, что предоставляет вам мультиплексор терминала — это надежные сессии на удаленных серверах.
Это завершает мою миграцию с GNU Screen на Tmux. Я никогда не оглянусь назад.
Наслаждайтесь!
Я думаю, мне больше нравится то, что я использую для перемещения панелей в свое собственное окно. Я использую
break-pane -t :
Я разобрался в этом через эксперименты, но это, похоже, работает очень хорошо. Вы можете легко привязать или создать псевдонимы, никаких скриптов не требуется.
Привязка клавиш
По умолчанию, Ctrl+b, ! разделит активную панель на новое окно и переключится на него.
Где Ctrl + b – это стандартный префикс для tmux.
Детали
Команда tmux
, которую выполняет эта клавиша, это break-pane
(псевдоним: breakp
), реализованная в cmd-break-pane.c
и привязанная по умолчанию в key-bindings.c как можно увидеть в list-keys
(псевдоним: lsk
) вывод команды:
bind-key -T prefix ! break-pane
После просмотра других ответов и изучения страницы руководства tmux я остановился на следующих привязках на данный момент:
bind-key S choose-window 'join-pane -v -s "%%"'
bind-key V choose-window 'join-pane -h -s "%%"'
Это позволит вам интерактивно выбрать окно для присоединения и отражает мои маленькие привязки s
/v
для создания новых вертикальных/горизонтальных разделений. Если кто-то знает, как выбрать отдельные панели вместо окон, дайте мне знать.
Если вы не хотите вводить идентификатор панели в подсказку, вы также можете использовать
bind-key j "join-pane -s !"
которая присоединит последнюю активную панель/окно к текущему окну.
Вам не нужно изменять свои привязки клавиш.
Пока панель, которую вы хотите переместить, имеет фокус, введите Prefix, затем :join-pane -t :1
, где 1
– это номер окна назначения в той же сессии. Вы можете переместить ее в другую сессию, добавив ее имя, например, project:3
. Для меня join-pane
автозавершает табуляцией от j
.
Добавьте -h
или -v
в команду, чтобы установить ориентацию нового раздела, созданного в destino, или просто перейдите к нему и Prefix + space, чтобы rearrange.
вот принести панель из
как функция fzf-tmux
.
просто поместите это в какой-то файл:
function bring_pane() {
windows=$(
tmux list-windows -F "#{window_active} #{window_index} #{window_name}" | sort -r | awk '{print $2 " : " $3}' \
| fzf-tmux -p --border-label="Принести панель" | awk '{print $1}' | sort -r
)
if [ -n "$windows" ]; then
echo $windows | xargs -n1 -I {i} tmux join-pane -s {i}
fi
}
Затем в вашем конфигурационном файле tmux подключите это:
bind-key i run-shell "source ~/.tmux/functions.sh && bring_pane"
Ответ или решение
Перемещение панели tmux в другое окно
Введение
tmux — это мощный терминальный мультиплексор, который позволяет пользователям управлять несколькими сессиями терминала в одном окне. Одной из частых задач, с которой сталкиваются пользователи, является перемещение существующей панели в другое окно и наоборот. В данной статье мы подробно рассмотрим, как это сделать, а также предложим несколько удобных настроек.
Основная команда: join-pane
Для перемещения панели в другое окно в tmux используется команда join-pane
. Это команда, начиная с версии tmux 1.4, позволяет перенести панель из одного окна в другое без необходимости создавать новую панель. Команда выглядит следующим образом:
join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane]
Примечание по параметрам:
-s src-pane
: Указывает панель-источник, которую необходимо переместить.-t dst-pane
: Определяет целевую панель, к которой будет присоединена панель-источник.- Параметр
-h
создаёт горизонтальное разделение, в то время как-v
создаёт вертикальное.
Примеры использования команды
Перемещение панели в текущее окно
Предположим, вы находитесь в панели окна 1 и хотите переместить панель из окна 0 в текущее окно. В этом случае выполните комбинацию:
PREFIX + :join-pane -s :0
Перемещение панели в другое окно
Чтобы отправить текущую панель в другое окно, например, в окно 1, выполните следующее:
PREFIX + :join-pane -t :1
При этом будьте внимательны к синтаксису. Указывая целевое окно, обязательно применяйте двоеточие перед номером окна.
Оптимизация работы с панелями
Настройки в .tmux.conf
Для упрощения работы с панелями можно добавить несколько ключевых комбинаций в ваш файл конфигурации ~/.tmux.conf
. Вот пример, как это может выглядеть:
# Панель перемещения
bind-key j command-prompt -p "join pane from:" "join-pane -s '%%'"
bind-key s command-prompt -p "send pane to:" "join-pane -t '%%'"
С этими комбинациями вы сможете, используя PREFIX + j
, выбрать панель для перемещения в текущее окно, а PREFIX + s
— отправить текущую панель в другое окно.
Перерывание панели
Для того чтобы переместить активную панель в новое окно, можно использовать команду break-pane
. Это делается по умолчанию с помощью клавиатурного сочетания:
PREFIX + !
После выполнения этой команды панель будет преобразована в новое окно, и вам автоматически переключат на него.
Дополнительные функции и настройки
Использование fzf для выбора окон
Вы можете интегрировать fzf
, чтобы сделать выбор окон интуитивно понятным:
function bring_pane() {
windows=$(
tmux list-windows -F "#{window_active} #{window_index} #{window_name}" | sort -r | awk '{print $2 " : " $3}' \
| fzf-tmux -p --border-label="Bring pane" | awk '{print $1}' | sort -r
)
if [ -n "$windows" ]; then
echo $windows | xargs -n1 -I {i} tmux join-pane -s {i}
fi
}
Эта функция позволит вам удобно выбирать окно, куда вы хотите переместить панель.
Заключение
Перемещение панелей в tmux становится гораздо проще с использованием команды join-pane
и настраиваемых привязок. Независимо от того, перемещаете ли вы панели между окнами или создаете новые, такие настройки ускорят ваш рабочий процесс и сделают его более удобным. Внедрите предложенные рекомендации в свою повседневную практику работы с tmux и наслаждайтесь повышенной продуктивностью.