Podejście, którego używam, łączy trochę odpowiedzi Ashisha z piec’s; mam alt-left i right arrow związane z szybkim małym wywołaniem powłoki, które przesuwa okno o jeden w lewo lub w prawo, chyba że jest to pierwsze lub ostatnie okno, odpowiednio. Zrobiłem to dlatego, że gdy wydasz swap +1 na ostatnim oknie (lub swap -1 na pierwszym), to nadal będzie ono zamieniane, zamiast zapętlać się ponownie, jak można by 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, komendy 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 base-index i renumber-windows, aby mieć listę okien, która zaczyna się od dowolnego numeru i nigdy nie ma żadnych luk.
Jeśli używasz base-index 1 tak jak ja i nie sądzisz, że kiedykolwiek przekroczysz 999 okien, możesz użyć małej sztuczki, aby zrobić to poprawnie, choć komendy trochę się rozrastają:
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 na nieużywany indeks-0, a następnie wywołanie move-window -r, aby przenumerować je ponownie zaczynając od 1. Działa to podobnie, gdy przenosimy pierwsze okno na koniec; wybierając dużą liczbę, której nigdy nie użyjemy, zapewniamy, że gdy move-window -r ponownie się uruchomi, wszystko będzie ponumerowane tak, jak byśmy tego oczekiwali. Jeśli zastanawiasz się nad refresh-client -S , jest to konieczne, ponieważ czasami, podczas gdy zmiana kolejności z move-window będzie działać poprawnie, pasek stanu nie będzie się aktualizował, dopóki nie zostaną wprowadzone kolejne zmiany. Wymuszając odświeżenie tylko paska stanu (-S), unikasz tego.
Jedynym problemem, jaki mogę znaleźć z tym podejściem jest to, że swap-window niejawnie zmieni ostatnio używane okno na to, z którym się zamieniłeś. Tak więc, jeśli jesteś na oknie #1, przełączasz się na okno czwarte i przesuwasz je o jeden do tyłu, okaże się, że ostatnio używanym oknem jest nowe # 4 (wcześniej #3) zamiast #1. Nie wydaje się, aby istniał sposób na obejście tego problemu.