A abordagem que utilizo combina um pouco da resposta de Ashish com a de partes; Eu tenho as setas alt-esquerda e direita ligadas a um pequeno texto explicativo rápido que move a janela uma para a esquerda ou 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 será trocada, em vez de retornar novamente como você pode esperar:
0:one 1:two 2:three 3:zero*
Torna-se
0:zero* 1:two 2:three 3:one
Ao invés de
0:zero* 1:one 2:two 3:three
Portanto, os comandos que eu 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 índice base e renumerar janelas para ter uma lista de janelas que começam com um número arbitrário e nunca apresentam lacunas.
Se você estiver usando o índice-base 1 como eu e nunca achar que ultrapassará 999 janelas, poderá usar um pequeno truque para fazê-lo funcionar corretamente, 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'
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. Funciona de maneira semelhante ao mover a primeira janela para o final; escolhendo um número enorme que você nunca usará, garante que, quando o movimento-janela -r for acionado novamente, tudo será numerado como você esperaria. Se você está se perguntando sobre o refresh-client -S , isso é necessário porque, às vezes, enquanto a reordenação da janela de movimentação funcionará corretamente, a barra de status não será atualizada até que novas alterações sejam 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 a janela de troca alterará implicitamente a última janela usada para a que você trocou. Portanto, se você estiver na janela nº 1, alterne para a janela quatro e mova-a para trás uma, você verá que sua última janela usada é o novo nº 4 (anteriormente nº 3) em vez de nº 1. Não parece haver uma maneira de contornar isso.
C-b
,.
permite renumerar uma janela.