Подход, который я использую, сочетает в себе немного ответа Ашиша и Пика; У меня есть стрелка alt-left и right, привязанная к быстрой маленькой выноске оболочки, которая перемещает окно влево или вправо, если только это не первое или последнее окно, соответственно. Я сделал это потому, что, когда вы запускаете своп +1 в последнем окне (или своп -1 в первом окне), он все равно будет меняться, вместо того, чтобы возвращаться снова, как вы могли ожидать:
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 и renumber-windows, чтобы получить список окон, которые начинаются с произвольного числа и никогда не имеют пробелов.
Если вы используете базовый индекс 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 , это необходимо, потому что иногда, хотя переупорядочение из окна перемещения будет работать правильно, строка состояния не будет обновляться до тех пор, пока не будут внесены дополнительные изменения. Принудительно обновляя только строку состояния (-S), вы избегаете этого.
Единственная проблема, которую я могу найти с этим подходом, заключается в том, что swap-window неявно изменит последнее использованное окно на то, с которым вы менялись. Таким образом, если вы находитесь в окне № 1, переключитесь на окно четвертое и переместите его обратно на одно, вы обнаружите, что вашим последним использованным окном является новый № 4 (ранее № 3) вместо № 1. Кажется, нет никакого способа обойти это.
C-b
,.
Позволяет пронумеровать окно.