L'approche que j'utilise combine un peu de la réponse d'Ashish avec celle de Piec ; j'ai des flèches gauche et droite liées à un petit cri d'obus rapide qui déplace la fenêtre une vers la gauche ou la droite, à moins que ce ne soit la première ou la dernière fenêtre, respectueusement. J'ai fait cela parce que, lorsque vous lancez un swap +1 à la dernière fenêtre (ou un swap -1 à la première fenêtre), il va toujours swap, au lieu de faire une nouvelle boucle comme on pourrait s'y attendre :
0:one 1:two 2:three 3:zero*
Devient
0:zero* 1:two 2:three 3:one
Au lieu de
0:zero* 1:one 2:two 3:three
Donc, les commandes que j'utilise cessent de fonctionner lorsque la fenêtre a atteint le bord de la liste :
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'
Cela peut facilement être combiné avec base-index et renuméroter-fenêtres pour avoir une liste de fenêtres qui commencent à un nombre arbitraire et n'ont jamais de trous.
Si vous utilisez base-index 1 comme moi et que vous pensez ne jamais dépasser 999 fenêtres, vous pouvez utiliser une petite astuce pour le faire fonctionner correctement, bien que les commandes soient un peu gonflées :
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'
Cela fonctionne en déplaçant temporairement la dernière fenêtre vers l'index 0 non utilisé et en appelant ensuite move-window -r pour les renuméroter à partir de 1 à nouveau. Cela fonctionne de la même manière lorsque vous déplacez la première fenêtre vers la fin ; en choisissant un nombre énorme que vous n'utiliserez jamais, vous vous assurez que lorsque move-window -r tirera à nouveau, tout sera numéroté comme vous vous y attendez. Si vous vous posez des questions sur le refresh-client -S, c'est nécessaire car parfois, alors que la commande de move-window fonctionne correctement, la barre d'état ne se met pas à jour tant que d'autres changements ne sont pas effectués. En forçant un rafraîchissement de la seule barre d'état (-S), vous évitez cela.
Le seul problème que je peux trouver avec cette approche est que swap-window va implicitement modifier la dernière fenêtre utilisée par rapport à celle avec laquelle vous avez échangé. Ainsi, si vous êtes sur la fenêtre #1, que vous passez à la fenêtre 4 et que vous la déplacez vers l'arrière, vous constaterez que votre dernière fenêtre utilisée est la nouvelle # 4 (anciennement # 3) au lieu de la #1. Il ne semble pas y avoir de moyen de contourner ce problème.