Der Ansatz, den ich verwende, kombiniert ein wenig von Ashishs Antwort mit der von Piec; ich habe Alt-Links und Rechts-Pfeil an einen kleinen Shell-Aufruf gebunden, der das Fenster um eins nach links oder rechts verschiebt, es sei denn, es ist das erste bzw. letzte Fenster. Ich habe das gemacht, weil, wenn man einen Swap +1 am letzten Fenster (oder Swap -1 am ersten Fenster) ausgibt, es trotzdem swappt, anstatt wieder eine Schleife zu machen, wie man es vielleicht erwarten würde:
0:one 1:two 2:three 3:zero*
wird zu
0:zero* 1:two 2:three 3:one
statt
0:zero* 1:one 2:two 3:three
Die Befehle, die ich verwende, hören also auf zu funktionieren, wenn das Fenster den Rand der Liste erreicht hat:
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'
Dies kann leicht mit base-index und renumber-windows kombiniert werden, um eine Liste von Fenstern zu erhalten, die bei einer beliebigen Zahl beginnt und niemals Lücken aufweist.
Wenn Sie wie ich base-index 1 verwenden und Sie nicht glauben, dass Sie jemals über 999 Fenster hinausgehen werden, können Sie einen kleinen Trick anwenden, damit es richtig rollt, obwohl die Befehle ein wenig aufblähen:
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'
Das funktioniert, indem man das letzte Fenster vorübergehend auf den unbenutzten Index-0 verschiebt und dann move-window -r aufruft, um sie wieder ab 1 zu nummerieren. Ähnlich funktioniert es, wenn Sie das erste Fenster an das Ende verschieben; indem Sie eine große Zahl wählen, die Sie nie benutzen werden, stellen Sie sicher, dass beim erneuten Aufruf von move-window -r alles so nummeriert ist, wie Sie es erwarten würden. Wenn Sie sich über refresh-client -S wundern, das ist notwendig, weil manchmal, während die Neuanordnung von move-window richtig funktioniert, die Statusleiste nicht aktualisiert wird, bis weitere Änderungen vorgenommen werden. Indem Sie eine Aktualisierung nur der Statusleiste erzwingen (-S), vermeiden Sie dies.
Das einzige Problem, das ich bei diesem Ansatz finden kann, ist, dass swap-window implizit das zuletzt verwendete Fenster in dasjenige ändert, mit dem Sie gewechselt haben. Wenn Sie sich also in Fenster 1 befinden, zu Fenster 4 wechseln und es um eins zurückschieben, werden Sie feststellen, dass Ihr zuletzt verwendetes Fenster das neue Fenster 4 (ehemals 3) statt 1 ist. Es scheint keine Möglichkeit zu geben, dies zu umgehen.