A abordagem que utilizo combina um pouco da resposta de Ashish com a de piec; tenho a seta alt-esquerda e direita ligada a uma pequena e rápida chamada de concha que move a janela uma para a esquerda ou direita, a menos que seja a primeira ou última janela, respeitosamente. Fiz isto porque, quando se emite um swap +1 na última janela (ou swap -1 na primeira janela), ele continuará a trocar, em vez de voltar a girar como seria de esperar:
0:one 1:two 2:three 3:zero*
Torna-se
0:zero* 1:two 2:three 3:one
Em vez de
0:zero* 1:one 2:two 3:three
Assim, os comandos que utilizo param de funcionar quando a janela atinge o limite da lista:
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'
Isto pode ser facilmente combinado com base-index* e renumber-windows* para ter uma lista de janelas que começam com um número arbitrário e nunca tem quaisquer lacunas.
Se estiver a usar base-index 1 como eu e achar que nunca irá acima de 999 janelas, pode usar um pequeno truque para o fazer rolar correctamente, embora os comandos inchem um pouco:
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'
Isto funciona movendo temporariamente a última janela para o index-0 não utilizado e depois chamando move-window -r* para renumerá-los a partir de 1 novamente. Funciona de forma semelhante ao mover a primeira janela para o fim; ao escolher um número enorme que nunca usará, assegura que quando move-window -r dispara novamente, tudo será numerado como seria de esperar. Se estiver a pensar em refresh-client -S* , isso é necessário porque por vezes, enquanto a reordenação de move-window* funcionará correctamente, a barra de estado não será actualizada até que sejam feitas mais alterações. Ao forçar uma actualização apenas da barra de estado (-S), evita-se isto.
O único problema que posso encontrar com esta abordagem é que janela de troca* irá implicitamente alterar a última janela utilizada para aquela com a qual trocou. Assim, se estiver na janela #1, mudar para a janela quatro e movê-la para trás, verá que a sua última janela utilizada é a nova #4 (anteriormente #3) em vez da #1. Não parece haver uma forma de contornar isto.