Вопрос или проблема
tmux имеет команду “move-window”, с помощью которой вы можете переместить окно на указанный пустой индекс следующим образом:
move-window -t 3
Однако, если индекс 3 уже занят, вы не сможете переместить текущее окно на позицию 3.
Я ищу вариант, который позволит мне переместить (вставить) свое окно на позицию 3, даже если она уже занята, а затем увеличить номера окна для других последующих окон (например, то, что изначально было на 3, теперь будет 4, следующее будет 5 и т. д.).
Скрипт ниже позволит вам сделать то, что вы хотите. Вы можете запустить его из командной строки, или вы можете сделать:
:run "ins-move 2 5"
Этот пример перемещает окно два на позицию перед окном пять.
#!/bin/bash
for ((i=$1; i<$2-1; i++))
do
tmux swap-window -s :$i -t :$((i+1))
done
Попробуйте: new-window -a
Используя опцию -a при создании нового окна, можно вставить новое прямо на следующий индекс, в то время как индексы всех других последующих окон автоматически увеличатся.
По крайней мере в tmux 3.2a, вы можете просто выполнить команду OP с -a
:
move-window -a -t 3
У меня есть решение без необходимости во внешних скриптах. Поместите следующее в ваш .tmux.conf:
bind i command-prompt -p 'Вставить окно на:' 'run-shell "if tmux select-window -t %1; then tmux new-window -a; tmux swap-window -s %1 -t \$((%1+1)); else tmux new-window; tmux move-window -t %1; fi; tmux select-window -t #I; tmux select-window -t %1;"'
Нажмите [PREFIX]-i и укажите желаемую позицию вставки. Последние 2 команды select-window обеспечивают правильный переход к ‘предыдущему’ окну и вставленному окну.
ИЗМЕНЕНИЕ: хорошо, я заговорил слишком рано. Мне пришлось изменить #I
на #{window_id}
, потому что индекс окна меняется для некоторых окон при вставке. Новая функция (с добавленными переводами строк для читаемости):
bind i command-prompt -p 'Вставить окно на:' ' \
run-shell " \
if tmux select-window -t %1; then \
tmux new-window -a; \
tmux swap-window -s %1 -t \$((%1+1)); \
else \
tmux new-window; \
tmux move-window -t %1; \
fi; \
tmux select-window -t #{window_id}; \
tmux select-window -t %1; \
"'
Я начал использовать упрощенную версию, через следующие 2 команды в .tmux.conf:
bind i command-prompt -p 'Вставить окно на:' 'new-window -a -t %1; swap-window -t -1'
bind I command-prompt -p 'Новое окно на:' 'new-window -t %1'
Prefix-i вставляет новое окно на позицию x, когда окно x существует, и перемещает окна выше этого на одну позицию вверх. Prefix-I создает новое окно на позиции x, когда окно x не существует.
Флаг -a
, поддерживаемый различными оконными командами, уже был приведён в качестве ответа, но никто еще не упоминал -b
:
Флаг -b
работает аналогично -a
, но помещает окно перед оконной целью, перемещая существующие окна при необходимости. Это поведение ближе к тому, что спрашивалось в оригинальном вопросе, поскольку окно фактически получит целевой индекс, а не следующий:
$ tmux list-windows
0: первое
1: второе
2: третье (активное)
$ tmux move-window -b -t 0
$ tmux list-windows
0: третье (активное)
1: первое
2: второе
Он был введен относительно недавно с версией 3.2 (04/2021) (-a
существует с 2.1 (10/2015) для move-window
и 1.3 (07/2010) для new-window
).
Ответ или решение
Для управления окнами в tmux
и вставки окна на указанную позицию, даже если эта позиция уже занята, вы можете воспользоваться несколькими подходами. Ниже я приведу подробные инструкции о различных способах, включая использование встроенных команд без необходимости в дополнительных скриптах.
Вариант 1: Использование команды move-window
с флагом -b
Если вы хотите переместить текущее окно на указанную позицию, сдвинув другие окна, вы можете использовать команду move-window
с флагом -b
. Эта команда позволяет вставить окно перед указанным индексом, перемещая существующие окна. Например, если вы хотите переместить текущее окно перед окном с индексом 0:
tmux move-window -b -t 0
Вариант 2: Использование команды new-window
с флагом -a
При создании нового окна вы можете использовать флаг -a
, чтобы автоматически вставить новое окно на следующий доступный индекс. Если вам нужно вставить новое окно на определённый индекс, а не просто после последнего, выполните:
tmux new-window -a -t 3
Вариант 3: Использование пользовательского привязки с помощью command-prompt
Если вам нужно более гибкое решение, вы можете добавить следующую привязку к вашему файлу конфигурации .tmux.conf
:
bind i command-prompt -p 'Insert window at:' ' \
run-shell " \
if tmux select-window -t %1; then \
tmux new-window -a; \
tmux swap-window -s %1 -t \$((%1+1)); \
else \
tmux new-window; \
tmux move-window -t %1; \
fi; \
tmux select-window -t #{window_id}; \
tmux select-window -t %1; \
"'
Затем, используя комбинацию клавиш PREFIX-i
, вы сможете указать позицию для вставки окна. Если позиция занята, текущее окно будет перемещено, а новое окно будет вставлено на указанную позицию.
Вариант 4: Упрощенная привязка
Для упрощенного способа вставки нового окна на позицию ${index}
или создания нового окна, если указанный индекс занят, вы можете использовать:
bind i command-prompt -p 'Insert window at:' 'new-window -a -t %1; swap-window -t -1'
bind I command-prompt -p 'New window at:' 'new-window -t %1'
Команда PREFIX-i
вставляет новое окно на позицию x
, если окно x
существует, сдвигая окна выше на одну позицию. Команда PREFIX-I
создает новое окно на позиции x
, если окно x
не существует.
Заключение
Таким образом, вы можете манипулировать окнами в tmux
, используя встроенные команды и привязки, без необходимости в сторонних скриптах. Эти методы позволят вам легко управлять окнами и их индексами в вашей сессии tmux
.