Изменить порядок окон Tmux


21

Как я могу эффективно изменить порядок окон в tmux? Например, имея этот набор окон:

0:zsh  1:elinks  2:mutt  3:irssi  4:emacs  5:rss  6:htop

Что мне нужно сделать, чтобы перейти rssмежду elinksи mutt, в конечном итоге:

0:zsh  1:elinks  2:rss  3:mutt  4:irssi  5:emacs  6:htop

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


1
В этом разделе вопросов и ответов показано, что вы просите: superuser.com/questions/343572/how-do-i-reorder-tmux-windows
slm

Ответы:


38

swap-window могу помочь тебе:

swap-window -t -1

Перемещает текущее окно влево на одну позицию.

От человека Tmux :

swap-window [-d] [-s src-window] [-t dst-window]
             (alias: swapw)
This is similar to link-window, except the source and destination windows are swapped. 
It is an error if no window exists at src-window.

Вы можете привязать его к ключу:

bind-key -n S-Left swap-window -t -1
bind-key -n S-Right swap-window -t +1

Затем вы можете использовать Shift+Leftи Shift+Rightдля изменения текущей позиции окна.


Но мне все равно придется выполнить ряд swap-windowкоманд (три для примера) - правильно?
Игорь

@igor: да. Другим способом вы можете сделать swap-window -s 2 -t 5. Это поменяйте местами окно № 2 с окном № 5.
cuonglm

Правильно - но я хочу сохранить порядок всех остальных окон без изменений, поэтому «простая» замена окон № 2 и № 5 не делает этого для меня. Я уже знал о swap-windowкоманде, но не знал о префиксах -/, +предназначенных для предыдущего / следующего окна.
Игорь

см. unix.stackexchange.com/a/525770/12497, чтобы узнать об измененном поведении swap-windowв более новых версиях tmux
Стивен Лу

2

Принятый и высоко оцененный ответ является правильным, хотя поведение в последних версиях tmux видит, что команда swap-window не удерживает вас в одном и том же окне. Так что это работает довольно неинтуитивно, ваше активное окно будет меняться в этом направлении, но вы останетесь в том же слоте!

Чтобы исправить эту проблему, просто увеличьте привязку, чтобы следовать за ней. Например, из моего конфига tmux:

bind -n C-S-Left { swap-window -t -1; previous-window }
bind -n C-S-Right { swap-window -t +1; next-window }

1

Вот рабочее решение, заключенное в функцию bash.

list=$(tmux lsw -F '#I');                           # for shift left, could be moved inside function
list=$(tmux lsw -F '#I'); list=$(echo $list|rev);   # for shift right, list reversed
shift_tmux_window_range() {  # depend on `list`
    local started=0 beg=$1 end=$2
    for i in $list; do
        if (($i == $beg)); then
            started=1; h=$beg; tmux linkw -s $beg && tmux unlinkw -t $beg;
        elif (($i == $end)); then
            tmux movew -d -s $i -t $h; tmux movew -d -t $end; break;
        elif [ $started = 1 ]; then
            tmux movew -d -s $i -t $h; h=$i;
        fi;
    done
}

shift_tmux_window_range 5 2

Бонус: оставайтесь в том же окне, если текущее активное окно не затронуто.


Brilliant! Спасибо.
Александр Берд

-1

Если tmuxэто версия 1.7 или выше

move-window -r

или

set-option -g renumber-windows on

в .tmux.confтечение автоматически делать в будущем.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.