tmux – Вставка окна в указанную позицию

Вопрос или проблема

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.

Оцените материал
Добавить комментарий

Капча загружается...