2011-02-02 19:53:22 +0000 2011-02-02 19:53:22 +0000
436
436

Wie kann ich tmux-Fenster neu anordnen?

In screen kann ich einfach C-a :number 0 eingeben, um ein Fenster an den Anfang der Fensterliste zu verschieben und alle anderen Fenster um eins nach unten zu schieben. Wie lautet die entsprechende Befehlsfolge für tmux? Ich habe mir die Manpage angeschaut, aber ich finde sie in diesem Punkt verwirrend.

Antworten (19)

491
491
491
2011-03-01 09:39:45 +0000

Der Befehl swap-window kommt dem am nächsten, was Sie wollen.

“Präfix :” (das ist Strg+B, standardmäßig :) bringt Sie zum tmux-Befehlsprompt. Dort geben Sie ein:

swap-window -s 3 -t 1

, um Fenster Nummer 3 und Fenster Nummer 1 ihre Positionen tauschen zu lassen.

Um das aktuelle Fenster mit dem obersten Fenster zu tauschen, tun Sie:

swap-window -t 0

In dem unwahrscheinlichen Fall, dass sich kein Fenster bei Index 0 befindet, tun Sie Folgendes:

move-window -t 0

(wenn der Basisindex 0 ist, wie es standardmäßig der Fall ist).

Sie können diesen Befehl an eine Taste binden (z. B. T für “oben”), indem Sie das Folgende zu Ihrem ~/.tmux.conf hinzufügen:

bind-key T swap-window -t 0
279
279
279
2013-02-15 11:18:09 +0000

Ergänzend zu Gareths Antwort können Sie die folgenden Tastenkombinationen verwenden:

bind-key -n C-S-Left swap-window -t -1
bind-key -n C-S-Right swap-window -t +1

Drücken Sie Strg+Umschalt+Links (bewegt das aktuelle Fenster nach links. Ähnlich nach rechts. Die Verwendung des Modifikators (C-b) ist nicht erforderlich.

Für die Version tmux 3.0 sollten Sie folgende Tastenkombinationen verwenden

bind-key -n C-S-Left swap-window -t -1\; select-window -t -1
bind-key -n C-S-Right swap-window -t +1\; select-window -t +1
67
67
67
2011-04-05 22:12:22 +0000

Das tmux-Äquivalent zu :number 42 ist :move-window -t 42.

17
17
17
2013-07-09 22:16:07 +0000

Ich nummeriere Fenster folgendermaßen um:

Strg+b, ., 222

würde das aktuelle Fenster tmux (alle Fenster) zur Nummer 222 machen.


In diesem Zusammenhang: Wenn ich Dinge herumschiebe, neige ich dazu,

Strg+b :new-session -d -s "reading"

zu machen und von dort aus kann ich auch Strg+b, ., reading benutzen, um das aktuelle Fenster (alle Fenster auf einmal) in die Lesesitzung zu verschieben. Sie können zwischen den Sitzungen mit Strg+b, s genauso blättern, wie Sie innerhalb der Sitzung mit Strg+b, w blättern würden.

HTH

12
12
12
2012-04-16 15:42:48 +0000

Sie können ein Äquivalent zum Befehl screen implementieren, indem Sie ein externes Shell-Skript verwenden, das zwischen number und swap-window wählt. Sie können es auf diese Weise an eine Taste binden:

bind < command-prompt -p index "run-shell '~/.tmux.number.sh %%'"

move-window:

#!/bin/bash
if [$# -ne 1 -o -z "$1"]; then
    exit 1
fi
if tmux list-windows | grep -q "^$1:"; then
    tmux swap-window -t $1
else
    tmux move-window -t $1
fi
8
8
8
2011-12-12 03:13:19 +0000

Mit swap-window auf eine beliebige ID verschieben:

# window movement / renumbering like in screen's :number
bind-key m command-prompt -p "move window to:" "swap-window -t '%%'"

[m für move –> drücken Sie prefix-m und geben Sie z. B. 3 ein, um das Fenster auf 3 zu nummerieren]

5
5
5
2016-03-18 17:08:47 +0000

Da die Antwort von Ashish Ariga bei Version 1.9a und darunter nicht funktioniert. Ich verwende < und >, um das Fenster nach links bzw. rechts zu tauschen, indem ich die folgende Zeile zu .tmux.conf hinzufüge.

# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1
4
4
4
2015-02-09 12:34:24 +0000

Die einfachste Lösung ab man, ist die Verwendung der Standardbindungen:

{ Swap the current pane with the previous pane.
} Swap the current pane with the next pane.
3
3
3
2016-01-26 00:48:42 +0000

Für diejenigen von Ihnen, die byobu als Wrapper für tmux verwenden, können Sie das aktuelle Fenster mit dem vorherigen oder nächsten Fenster tauschen mit:

Ctrl-Shift-F3
Ctrl-Shift-F4

Die von byobu definierte Tastenbindung für diese Tasten könnte von Interesse sein:

bind-key -n C-S-F3 swap-window -t :-1
bind-key -n C-S-F4 swap-window -t :+1
2
2
2
2016-12-13 06:50:32 +0000

Sie können base-index verwenden, um die Startnummer für Ihre Fenster zu ändern. Wenn Sie base-index auf 1 setzen, wird move-window -r alle Fenster ab 1 neu nummerieren, wodurch 0 frei wird, um ein Fenster in seinen Platz zu verschieben:

set base-index 1
move-window -r
move-window -t 0

Wenn Sie damit fertig sind, können Sie base-index auf 0 zurücksetzen, wenn Sie später move-window -r verwenden möchten, ohne Ihr Fenster an 0 zu verschieben

2
2
2
2016-12-29 18:30:54 +0000

tmux-pain-control stellt ctrl-b > und ctrl-b < zur Verfügung, um das fokussierte Fenster nach rechts und links zu verschieben und zu umbrechen.

2
2
2
2013-06-24 20:29:13 +0000

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.

1
1
1
2017-10-07 08:44:19 +0000

Sowohl swap-window -s 5 als auch swap-window -t 5 tauschen das aktuelle Fenster mit Fenster 5, jedoch mit unterschiedlicher Semantik.

swap-window -s 5

  • aktuelles Fenster 5 mit aktueller Win-Nummer.
  • aktuelle Fensternummer bleibt unverändert.
  • Wiederholung des gleichen Befehls führt zum vorherigen Zustand zurück.

swap-window -t 5

  • aktuelles Programm in Kraft mit der Nummer 5.
  • aktuelles Überschreiben auf die aktuelle Fensternummer.

die number in swap-window -s number und -t number können sowohl absolut, z.B. 5, als auch relativ, z.B. -1, +2, sein.

P.S. unten ist ein Ausschnitt aus der tmux-Statuszeile, der die Wirkung von swap-window -s 5

recent zeigt: [0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc

jetzt, nach last-window:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

nach swapw -s 5:
[0] 0:mc* 1:mpl 2:py2- 3:numpy 4:plot 5:vim

ein anderes swapw -s 5:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

ein weiteres last-window:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc

1
1
1
2018-07-04 22:36:52 +0000

Versuchen Sie im tmux-Fenster Folgendes, um Fenster 0 mit 1 zu tauschen:

$ tmux swap-window -d -s 0 -t 1

0
0
0
2016-05-15 14:31:11 +0000

Zuerst öffnen Sie den tmux-Befehl drücken und loslassen:

Ctrl + b

Und um das aktuelle Fenster auf das rechte Fenster zu ändern (in kreisförmiger Reihenfolge), tun Sie einfach:

}

Um das aktuelle Fenster nach links zu ändern:

{
  • Vergessen Sie nicht, SHIFT zu verwenden, wenn Sie } oder { drücken.
0
0
0
2017-09-14 10:58:56 +0000

Für das, was es wert ist:

Ich habe dieses Skript zusammengehackt, um alle Fenster in einer “TUI” anordnen zu können. Es listet alle Ihre Fenster in einer temporären Datei auf, öffnet sie mit Ihrem Standard-Editor (geht davon aus, dass Sie $EDITOR gesetzt haben). Danach können Sie die Zeilen neu ordnen und nachdem Sie die Datei gespeichert und geschlossen haben, sind die Fenster entsprechend neu geordnet. (Das ist ähnlich wie das Ordnen von Commits, wenn Sie git rebase -i machen)

#!/bin/bash

# Usage: tmux-mv    
# Move your tmux windows around in an editor

tmpfile=$(mktemp)
tmux list-windows > $tmpfile
$EDITOR $tmpfile

# Move all windows to 50..x in the order you just specified
# Assumes you don't have 50 windows already(!)
cat $tmpfile | awk -F ":" '{ print " -s " $1 " -t 5" NR-1 }' |\
  xargs -I {} sh -c 'tmux move-window -d {}'

# Move them back down, retaining the order
tmux move-window -d -r
rm $tmpfile

Es könnte wahrscheinlich noch viel verbessert werden, insbesondere:

HINWEIS : Möglicherweise werden Sie nach dem Ausführen des Befehls in ein anderes Fenster verschoben. Ein gif davon in Aktion (github)

0
0
0
2018-05-22 20:05:43 +0000

Keine der Antworten hier hat mich zufriedengestellt, also habe ich ein Skript geschrieben, das das screen-Fensterverschiebeverhalten für tmux (irgendwie) nachahmt.

Es erkennt, ob die Nummer des Zielfensters kleiner als die Nummer des kleinsten Fensters oder größer als die Nummer des größten Fensters ist, und wenn dies der Fall ist, schiebt es alle anderen Fenster nach rechts oder links (bzw.) und nummeriert sie schrittweise von 1-N neu. Dies wird mit dem Befehl move-window gemacht.

Wenn die Fensternummer zwischen den kleinsten/größten Nummern liegt (d. h. vermutlich mit einer vorhandenen Fensternummer übereinstimmt), werden sie einfach mit dem Befehl swap-window vertauscht.

Hier ist das Skript:

#!/usr/bin/env bash
# Filename: ~/tmux-windowswap
# Function that provides improved window-swapping functionality for tmux
maxwin="$(tmux list-windows | cut -d: -f1 | sort -nr | head -n1)"
minwin="$(tmux list-windows | cut -d: -f1 | sort -n | head -n1)"
# Error checking
if [[-z $2]]; then
  echo "Error: No window specified."
elif [[! $2 =~ ^-?[0-9]+$ ]]; then
  echo "Error: Bad window number specified."
# Bigger than everything; slide it to the far right, then renumber
elif [[$2 -gt $maxwin]]; then
  i=0 # intialize
  tmux move-window -t:$(($maxwin+1))
  winlist="$(tmux list-windows | cut -d: -f1 | xargs)"
  for n in $winlist; do
    i=$(($i+1)) # increment
    tmux move-window -s:$n -t:$i
  done
# Smaller than everything; slide it to the far left, then renumber
elif [[$2 -lt $minwin]]; then
  tmux move-window -t:0
  winlist=($(tmux list-windows | cut -d: -f1 | xargs | rev))
  i=${#winlist[@]} # initialize; start at highest indexed window
  for n in ${winlist[@]}; do
    tmux move-window -s:$n -t:$i
    i=$(($i-1)) # decrement
  done
# In-between; just a simple swap
else
  tmux swap-window -t:$2
fi

Fügen Sie dann einfach diese einfache Tastenkombination zu Ihrem .tmux.conf hinzu:

bind m command -p "Send window to:" "run -b '~/tmux-windowswap #I %1'"

Hinweis : Um das Verhalten des screen-Fensterwechsels perfekt zu imitieren, glaube ich, dass, wenn Sie ein Fenster auf eine vorhandene Fensternummer verschieben, es den Platz dieses Fensters einnehmen sollte und alle anderen Fenster nach rechts geschoben werden. Es wäre ziemlich einfach, dieses Skript so zu ändern.

0
0
0
2014-10-31 15:53:04 +0000

Dies ist die Methode, die ich verwende. Sie können ein Fenster immer noch nicht auf einen belegten Index verschieben, aber Sie können eines auf einen höheren (unbenutzten) Index verschieben und in der Lücke neu anordnen, wo der vorherige Index war.

Angenommen, Sie haben 3 Fenster und wollen ein viertes hinzufügen, aber an der Stelle, wo vorher 3 war.

Bevor Sie ein neues Fenster hinzufügen: Tmux-Präfix dann . öffnet den Verschiebebefehl. Tippen Sie 4 ein und der Index von 3 wird nun zu 4. Fügen Sie dann einfach ein weiteres Fenster hinzu und es wird an Index 3 sein und Ihr altes Fenster wird immer noch an Index 4 sein.

0
0
0
2019-09-16 23:39:34 +0000

Sie brauchen die Kommandozeile nicht (das ist Strg + b und dann :)

Verschieben Sie einfach Ihre Fenster mit

Strg + b + :

geben Sie dann die neue (freie) Fensternummer ein und drücken Sie Enter

Wenn es jetzt eine freie Fensternummer gibt, verwenden Sie Strg + b + ., um ein Fenster neu zu nummerieren.

(Tipp: Benennen Sie Ihre Fenster mit Strg + b + , wenn Sie den Überblick verlieren, welches welches ist)