A abordagem que eu uso combina um pouco da resposta de Ashish com piec; Eu tenho a seta para a esquerda e para a direita ligada a um pequeno texto explicativo que move a janela uma para a esquerda ou para a direita, a menos que seja a primeira ou a última janela, respeitosamente. Eu fiz isso porque, quando você emite uma troca +1 na última janela (ou troca -1 na primeira janela), ela ainda irá trocar, em vez de voltar ao normal novamente como você poderia 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 uso param de funcionar quando a janela atinge a borda 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'
Isso pode ser facilmente combinado com base-index e renumber-windows para ter uma lista de janelas que iniciam em um número arbitrário e nunca tem lacunas.
Se você está usando o base-index 1 como eu e você não acha que vai ficar acima de 999 janelas, você pode usar um pequeno truque para fazê-lo rodar corretamente, embora os comandos inchaço 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'
Isso funciona movendo temporariamente a última janela para o índice 0 não utilizado e, em seguida, chamando move-window -r para renumerá-los a partir de 1 novamente. Ele funciona de maneira semelhante ao mover a primeira janela até o fim; escolhendo um número enorme que você nunca usará, isso garante que quando move-window -r for acionado novamente, tudo será numerado como esperado. Se você está se perguntando sobre o refresh-client -S , isso é necessário porque, às vezes, enquanto a reordenação de janela de movimentação funcionará corretamente, a barra de status não será atualizada até mais alterações são feitas. Ao forçar uma atualização apenas da barra de status (-S), você evita isso.
O único problema que posso encontrar com essa abordagem é que swap-window irá implicitamente alterar a última janela usada para a que você trocou. Assim, se você estiver na janela # 1, mude para a janela quatro e mova-a de volta, você verá que sua última janela usada é a nova # 4 (anteriormente # 3) em vez de # 1. Não parece haver uma maneira de contornar isso.