Podejście, które stosuję łączy w sobie trochę odpowiedzi Ashisha z piecem; Mam lewą i prawą strzałkę związaną z krótkim objaśnieniem powłoki, która przesuwa okno jedno w lewo lub w prawo, chyba że jest to pierwsze lub ostatnie okno, z szacunkiem. Zrobiłem to, ponieważ kiedy wystawisz swap +1 w ostatnim oknie (lub swap -1 w pierwszym oknie), nadal będzie zamieniał, zamiast zapętlać się ponownie, jak możesz się spodziewać:
0:one 1:two 2:three 3:zero*
Staje się
0:zero* 1:two 2:three 3:one
Zamiast
0:zero* 1:one 2:two 3:three
Tak więc polecenia, których używam, przestają działać, gdy okno osiągnie krawędź listy:
bind-key -n M-Left run-shell 'tmux list-windows | head -n 1 | grep -q active || tmux swap-window -t -1'
bind-key -n M-Right run-shell 'tmux list-windows | tail -n 1 | grep -q active || tmux swap-window -t +1'
Można to łatwo połączyć z indeksem bazowym i numeracją okien w celu uzyskania listy okien, które zaczynają się od dowolnej liczby i nigdy nie mają żadnych przerw.
Jeśli używasz indeksu bazowego 1 takiego jak ja i nie sądzisz, że kiedykolwiek przekroczysz 999 okien, możesz zastosować małą sztuczkę, aby poprawnie się toczyć, choć polecenia nieco się rozluźniają:
set -g base-index 1
set -g renumber-windows on
bind-key -n M-Left run-shell 'if tmux list-windows | head -n 1 | grep -q active ; then tmux move-window -t 999 \; move-window -r \; refresh-client -S ; else tmux swap-window -t -1 ; fi'
bind-key -n M-Right run-shell 'if tmux list-windows | tail -n 1 | grep -q active ; then tmux move-window -t 0 \; move-window -r \; refresh-client -S ; else tmux swap-window -t +1 ; fi'
Działa to poprzez tymczasowe przeniesienie ostatniego okna do nieużywanego indeksu-0, a następnie wywołanie move-window -r w celu zmiany numeracji, zaczynając od 1. Działa podobnie podczas przesuwania pierwszego okna do końca; wybierając ogromną liczbę, której nigdy nie użyjesz, zapewnia to, że gdy ponownie przesunie się okno -r, wszystko będzie ponumerowane tak, jak można się spodziewać. Jeśli zastanawiasz się nad odświeżeniem klienta-S , jest to konieczne, ponieważ czasami, chociaż zmiana kolejności z okna przenoszenia będzie działać poprawnie, pasek stanu nie zostanie zaktualizowany, dopóki nie zostaną wprowadzone dalsze zmiany. Wymuszając odświeżenie tylko paska stanu (-S), unikniesz tego.
Jedynym problemem, jaki mogę znaleźć w tym podejściu, jest to, że okno zamiany domyślnie zmieni ostatnio używane okno na to, z którym zamieniłeś się. Tak więc, jeśli jesteś w oknie nr 1, przełącz się na okno czwarte i cofnij je o jedno, a zobaczysz, że ostatnio używane okno to nowe nr 4 (dawniej nr 3) zamiast nr 1. Wydaje się, że nie ma sposobu na obejście tego.
C-b
,.
pozwala przenumerować okno.