El enfoque que utilizo combina un poco de la respuesta de Ashish con las piezas; Tengo flechas de flecha izquierda y derecha asociadas a una pequeña y rápida llamada de shell que mueve la ventana una hacia la izquierda o hacia la derecha, a menos que sea la primera o la última ventana, respetuosamente. Hice esto porque, cuando emites un swap +1 en la última ventana (o swap -1 en la primera ventana), aún se intercambiará, en lugar de volver a dar la vuelta como se puede esperar:
0:one 1:two 2:three 3:zero*
Se convierte
0:zero* 1:two 2:three 3:one
En lugar de
0:zero* 1:one 2:two 3:three
Por lo tanto, los comandos que utilizo dejan de funcionar cuando la ventana ha llegado al borde de la 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'
Esto se puede combinar fácilmente con índice base y renumerar ventanas tener una lista de ventanas que comiencen en un número arbitrario y nunca tengan espacios vacíos.
Si estas usando índice base 1 al igual que yo y no crees que vayas a superar las 999 ventanas, puedes usar un pequeño truco para hacer que ruede correctamente, aunque los comandos se hinchan un poco:
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'
Esto funciona moviendo temporalmente la última ventana al índice-0 no utilizado y luego llamando mover ventana -r para renumerarlos a partir de 1 nuevamente. Funciona de manera similar cuando se mueve la primera ventana al final; Al elegir un número enorme que nunca usará, garantiza que cuando mover ventana -r Dispara de nuevo todo estará numerado como cabría esperar. Si te estás preguntando acerca de refresh-client -S , eso es necesario porque a veces, mientras se reordena desde ventana de movimiento funcionará correctamente, la barra de estado no se actualizará hasta que se realicen más cambios. Al forzar una actualización de solo la barra de estado (-S), evita esto.
El único problema que puedo encontrar con este enfoque es que ventana de intercambio alterará implícitamente la última ventana utilizada a la que intercambió. Por lo tanto, si está en la ventana # 1, cambie a la ventana cuatro y muévala hacia atrás una, encontrará que la última ventana utilizada es la nueva # 4 (anteriormente # 3) en lugar de la # 1. No parece haber una manera de evitar esto.
C-b
,.
le permite renumerar una ventana.