Zmień kolejność okien Tmux

21

Jak mogę efektywnie zmienić kolejność okien w Tmuxie? Na przykład mając ten zestaw okien:

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

Co musiałbym zrobić, aby przejść rssmiędzy elinksi mutt, kończąc na:

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

Wiem, jak użyć, move-windowaby przesunąć okno do jeszcze nieużywanego indeksu i do osiągnięcia tego mógłbym użyć ich szeregu - ale oczywiście jest to bardzo żmudne.

Igor
źródło
1
Ten SU ​​Q&A pokazuje, o co prosisz: superuser.com/questions/343572/how-do-i-reorder-tmux-windows
slm

Odpowiedzi:

38

swap-window może Ci pomóc:

swap-window -t -1

Przesuwa bieżące okno w lewo o jedną pozycję.

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

Możesz powiązać go z kluczem:

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

Następnie możesz użyć Shift+Lefti, Shift+Rightaby zmienić bieżącą pozycję okna.

Cuonglm
źródło
Ale nadal musiałbym wykonać serię swap-windowpoleceń (trzy w tym przypadku) - prawda?
igor
@igor: Tak. Możesz to zrobić w inny sposób swap-window -s 2 -t 5. To okno wymiany nr 2 z numerem okna 5.
cuonglm
Zgadza się - ale chcę zachować nienaruszoną kolejność wszystkich innych okien, więc „prosta” zamiana okien nr 2 i nr 5 nie robi tego dla mnie. Już wiedziałem o swap-windowpoleceniu, ale nie wiedziałem o prefiksach -/, +aby kierować na poprzednie / następne okno.
igor
zobacz unix.stackexchange.com/a/525770/12497, aby zapoznać się ze zmianami zachowania swap-windoww nowszych wersjach Tmux
Steven Lu
2

Akceptowana i wysoko oceniana odpowiedź jest poprawna, chociaż zachowanie w najnowszych wersjach tmux powoduje, że polecenie swap-window nie utrzymuje cię w tym samym oknie. Więc działa raczej nieintuicyjnie, twoje aktywne okno zostanie zamienione w tym kierunku, ale pozostaniesz w tym samym miejscu!

Aby rozwiązać ten problem, po prostu rozszerz powiązanie, aby go wykonać. Na przykład z mojej konfiguracji tmux:

bind -n C-S-Left { swap-window -t -1; previous-window }
bind -n C-S-Right { swap-window -t +1; next-window }
Steven Lu
źródło
1

Oto działające rozwiązanie opakowane w funkcję 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

Bonus: pozostań w tym samym oknie, jeśli nie wpłynie to na bieżące aktywne okno.

qeatzy
źródło
Znakomity! Dziękuję Ci.
Alexander Bird
-1

Jeśli tmuxjest wersja 1.7 lub wyższa

move-window -r

lub

set-option -g renumber-windows on

w .tmux.confcelu automatycznego robić w przyszłości.

gaurav
źródło