Подход, который я использую, сочетает в себе немного ответа Ашиша с пипсовкой; у меня есть левая и правая стрелки, привязанные к быстрому маленькому вызову оболочки, который перемещает окно одно влево или вправо, если только это не первое или последнее окно, при всем уважении. Я сделал это потому, что когда вы выпускаете swap +1 в последнем окне (или swap -1 в первом окне), он все равно будет swap, вместо того, чтобы снова перекручиваться назад, как вы могли ожидать:
0:one 1:two 2:three 3:zero*
Становится
0:zero* 1:two 2:three 3:one
Вместо
0:zero* 1:one 2:two 3:three
Таким образом, команды, которые я использую, перестают работать, когда окно достигает края списка:
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'
Это можно легко комбинировать с базовым индексом и номер-окнами, чтобы иметь список окон, которые начинаются с произвольного числа и никогда не имеют никаких пробелов.
Если вы используете base-index 1, как и я, и вы не думаете, что когда-нибудь выйдете за 999 окон, вы можете использовать небольшой трюк, чтобы заставить его катиться должным образом, хотя команды немного раздуваются:
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'
Это работает путем временного перемещения последнего окна в неиспользуемый индекс-0, а затем вызова move-window -r для перенумерации их, начиная с 1 снова. Это работает аналогично при перемещении первого окна в конец; выбирая огромное число, которое вы никогда не будете использовать, это гарантирует, что когда move-window -r снова выстрелит, все будет пронумеровано так, как вы ожидали. Если вам интересно refresh-client -S , это необходимо, потому что иногда, в то время как переупорядочивание из move-window будет работать правильно, строка состояния не будет обновляться до тех пор, пока не будут сделаны дальнейшие изменения. Заставляя обновлять только статусную строку (-S), вы избегаете этого.
Единственная проблема, которую я могу найти при таком подходе, заключается в том, что swap-window неявно изменит последнее использованное окно на то, с которым вы поменялись. Таким образом, если вы находитесь в окне #1, переключитесь на окно 4 и переместите его обратно на одно, вы обнаружите, что ваше последнее используемое окно - это новое #4 (ранее #3), а не #1. Похоже, что способа обойти это нет.