L'approccio che uso combina un po’ la risposta di Ashish con quella di piec; ho le frecce alt-sinistra e destra legate a un piccolo callout rapido della shell che sposta la finestra una a sinistra o a destra, a meno che non sia la prima o l'ultima finestra, rispettivamente. Ho fatto questo perché, quando si emette uno swap +1 all'ultima finestra (o swap -1 alla prima finestra), lo swap continua, invece di tornare indietro come ci si potrebbe aspettare:
0:one 1:two 2:three 3:zero*
diventa
0:zero* 1:two 2:three 3:one
invece di
0:zero* 1:one 2:two 3:three
Quindi, i comandi che uso smettono di funzionare quando la finestra ha raggiunto il bordo della 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'
Questo può essere facilmente combinato con base-index e renumber-windows per avere una lista di finestre che inizia da un numero arbitrario e non ha mai spazi vuoti.
Se state usando base-index 1 come me e non pensate di andare mai oltre le 999 finestre, potete usare un piccolo trucco per farlo girare correttamente, anche se i comandi si gonfiano un po’:
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'
Questo funziona spostando temporaneamente l'ultima finestra nell'indice inutilizzato-0 e poi chiamando move-window -r per rinumerarle ripartendo da 1. Funziona in modo simile quando si sposta la prima finestra alla fine; scegliendo un numero enorme che non userai mai, assicura che quando move-window -r scatterà di nuovo tutto sarà numerato come ci si aspetta. Se vi state chiedendo di refresh-client -S , questo è necessario perché a volte, mentre il riordino di move-window funziona correttamente, la barra di stato non si aggiorna fino a quando non vengono fatte ulteriori modifiche. Forzando un aggiornamento della sola barra di stato (-S), si evita questo.
L'unico problema che posso trovare con questo approccio è che swap-window modificherà implicitamente l'ultima finestra usata in quella con cui avete scambiato. Così, se siete sulla finestra #1, passate alla finestra quattro e spostatela indietro di uno, scoprirete che la vostra ultima finestra usata è la nuova # 4 (precedentemente #3) invece della #1. Non sembra esserci un modo per aggirare questo problema.