Впорядкувати вікна 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
Цей SU Q & A показує, що ви просите: 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 не робить цього для мене. Я вже знав про 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

Бонус: залишайтеся в тому ж вікні, якщо поточне активне вікно не впливає.


Блискуче! Дякую.
Олександр Птах

-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.