Wie kann ich tmux windows neu anordnen?


413

In screenkann ich einfach eingeben C-a :number 0, um ein Fenster an den Anfang der Fensterliste zu verschieben und alle anderen Fenster nach unten zu schieben. Wozu dient die entsprechende Befehlssequenz tmux? Ich habe mir die Manpage angesehen, finde sie aber in diesem Punkt verwirrend.


95
C-b, .können Sie ein Fenster neu nummerieren.
Isomorphismen

7
Wenn ich all die vielen Antworten lese, sehe ich immer noch keine einfache Lösung für die Frage des OP: Wie kann man ein bestimmtes Fenster auf Position 0 verschieben und den Rest nach rechts verschieben? Muss ich wirklich jedes manuell verschieben, um dies zu tun? Ich möchte nur eine Bewegung rückgängig machen, die ich versehentlich gemacht habe (und ich bin mir nicht sicher, was). Ich denke, sie hat Fenster 0 auf Fenster 8 verschoben und alle anderen nach links verschoben.
Nealmcb

1
@nealmcb am einfachsten könnte ich kommen mit ist Basis-Index auf 1 zu setzen, nummerieren, dann Fenster in den leeren Steckplatz 0 verschieben: superuser.com/a/1155999/674549
Embee

Zum Unterschied swap-window -s numberund swap-window -t numberzum Tauschen des aktuellen Fensters siehe meine Antwort hier .
Qeatzy

In dieser Antwort finden Sie eine Bash-Funktion zum Verschieben des Bereichs von tmux-Fenstern, z. B. [2-5] von [0-6] Fenstern.
Qeatzy

Antworten:


467

Der swap-windowBefehl ist dem am nächsten, was Sie wollen.

„Prefix“ (dh Ctrl+ B, in :der Standardeinstellung) bringt Dich zur tmux-Eingabeaufforderung. Dort geben Sie ein:

swap-window -s 3 -t 1

Fenster Nummer 3 und Fenster Nummer 1 tauschen ihre Positionen.

So tauschen Sie das aktuelle Fenster mit dem oberen Fenster aus:

swap-window -t 0

In dem unwahrscheinlichen Fall, dass bei Index 0 kein Fenster vorhanden ist, tun Sie Folgendes:

move-window -t 0

(Wenn der Basisindex standardmäßig 0 ist).

Sie können diesen Befehl an eine Taste binden (z. B. T für "top"), indem Sie Folgendes zu Ihrer hinzufügen ~/.tmux.conf:

bind-key T swap-window -t 0

6
Danke für deine Bearbeitung, move-windowfunktioniert aber nur, wenn sich kein weiteres Fenster am angegebenen Index befindet. Also in den meisten Fällen move-window -t 0nicht funktionieren, da in der Regel bereits ein anderes Fenster an dieser Position vorhanden ist.
Matlehmann

Das stimmt, ich werde es verbessern.
Zakkak

2
Vielleicht möchten Sie einen Blick darauf werfen movew.
Marcello Romani

3
Auch bind-key L swap-window -t -1um es zum letzten Fenster zu machen.

Zum Unterschied swapw -s numberund swapw -t numberzum Tauschen des aktuellen Fensters siehe meine Antwort hier .
Qeatzy

257

Zur Antwort von Gareth 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 + Nach links (verschiebt das aktuelle Fenster nach links. Ebenso nach rechts. Sie müssen den Modifikator (Cb) nicht verwenden.


9
Dies -1und die +1Syntax helfen, das Problem der belegten Indizes zu lösen. tmux verschiebt die anderen Fenster für Sie und führt den Ereignisumbruch automatisch zum Ende / Anfang. Das ist die beste Antwort.
Brianpeiris

1
Meine Unfähigkeit, tmux windows einfach zu bewegen, nervt mich seit ein paar Wochen. Dies macht es so viel einfacher, mit den Fenstern umzugehen! Vielen Dank von diesem neuen tmux konvertieren.
Calvinf

8
Toller Tipp, bevorzuge bind-key S-Left swap-window -t -1, also kann ich <Präfix> Umschalt + Pfeil ausführen, da ich es nicht mag, Tastenzuordnungen für Programme durcheinander zu bringen.
demure

4
Wenn Sie Buchstaben verwenden, müssen Sie einen Großbuchstaben und nicht CS verwenden, wie folgt:bind-key -n C-H swap-window -t -1
Matthew Mitchell

1
Ich habe auch ein Problem mit 1.9a, wenn ich Ashish Ariga verwende, bind-key -n C-S-Left swap-window -t -1aber es funktioniert einwandfrei, wenn ich das von @MatthewMitchell
Rho Phi

63

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


9
Dies ist an Cb gebunden.
Vedang

1
Vielen Dank! Das ist viel besser als die akzeptierte Antwort imo.
Ashe

5
@ArlenCuss Tatsächlich sind beide Antworten gut und nützlich. Sie sehen, mit screen: number können Sie Fenster tauschen, mit tmux: move-window können Sie Fenster nur verschieben, wenn der Zielindex nicht verwendet wird. Also, imo, beide: Swap-Fenster und: Move-Fenster sind notwendig, um die Kontrolle über Fensterpositionen zu erfassen :)
Victor Farazdagi

1
+1, um eine Antwort von einem Programmierguru zu erhalten (auch um korrekt zu sein). Dies ist die einzige Möglichkeit, es an einem aktiven Fenster zum
engineerDave

4
tmux's :move-windowist nicht gleichbedeutend mit screen's :number. :numberswaps, wenn das Ziel existiert, :move-windowschlägt in diesem Fall fehl. Sie müssen wählen zwischen :move-windowund:swap-window
piec

15

Ich nummeriere Fenster wie folgt neu:

Ctrl+ b, .,222

würde das aktuelle tmuxFenster (alle Fenster) mit der Nummer 222 versehen.


Verwandte: Wenn ich Dinge durcheinander bringe, tendiere ich dazu, dies zu tun

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

und von dort kann ich auch Ctrl+ b,, verwenden ., readingum das aktuelle Fenster (alle Fenster auf einmal) in die Lesesitzung zu verschieben. Sie können zwischen Sitzungen mit blättern Ctrl+ b, swie Sie innerhalb der Session mit blättern würden Ctrl+ b, w.

HTH


12

Sie können einen äquivalenten Befehl zu screen's numbermithilfe eines externen Shell-Skripts implementieren , das zwischen swap-windowund auswählt move-window. Sie können es auf diese Weise an einen Schlüssel binden:

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

~/.tmux.number.sh:

#!/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

2
Sehr schöne Lösung, funktioniert super! Ich habe nur kleinere Änderungen an der Bereinigung vorgenommen und die -FOption entfernt, die von meiner tmux-Version nicht akzeptiert wird.
Haridsv

8

Verwenden des Swap-Fensters, um zu einer ID zu gelangen: [am nächsten an screen's: number]

# 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ücke prefix-m und gib say 3 ein. .Um das Fenster zu 3 neu zu nummerieren]


1
Das ist schon nett, aber noch besser wäre: Swap-Fenster machen und wenn es fehlschlägt, auf Move-Fenster
zurückgreifen

5

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

# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1

4

Die einfachste Lösung manbesteht darin, die Standardbindungen zu verwenden:

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.

6
tmux-Fenster und -Panels sind unterschiedlich.
Marcello Romani

4
Diese noch half mir bekommen , was ich wollte
lkraav

Diese Frage ist über Fenster nicht Scheiben
mbigras

3

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

Ctrl-Shift-F3
Ctrl-Shift-F4

Die byobufür diese Schlüssel definierte Schlüsselbindung kann von Interesse sein:

bind-key -n    C-S-F3 swap-window -t :-1
bind-key -n    C-S-F4 swap-window -t :+1

Wäre eine gute Abkürzung, um sich in einem bestimmten Fenster um Splits zu bewegen .
Pablo A

2

Der Ansatz, den ich benutze, kombiniert ein bisschen Ashishs Antwort mit der von piec; Ich habe einen Alt-Links- und Rechtspfeil, der an einen kurzen kleinen Shell-Callout gebunden ist, der das Fenster um eins nach links oder rechts verschiebt, es sei denn, es ist das erste oder letzte Fenster, respektvoll. Ich habe dies getan, weil, wenn Sie im letzten Fenster einen Swap +1 ausgeben (oder im ersten Fenster einen Swap -1), der Swap immer noch ausgeführt wird, anstatt wie erwartet wieder zurück zu laufen:

0:one 1:two 2:three 3:zero*

Wird

0:zero* 1:two 2:three 3:one

Anstatt von

0:zero* 1:one 2:two 3:three

Die Befehle, die ich verwende, funktionieren also nicht mehr, 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 Basisindex- und Umnummerierungsfenstern kombiniert werden , um eine Liste von Fenstern zu erhalten, die bei einer beliebigen Zahl beginnen und keine Lücken aufweisen.

Wenn Sie wie ich den Basisindex 1 verwenden und nicht glauben, dass Sie jemals über 999 Fenster hinausgehen werden, können Sie einen kleinen Trick anwenden, um ihn richtig rollen zu lassen, 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'

Dies funktioniert, indem das letzte Fenster vorübergehend auf den nicht verwendeten Index-0 verschoben wird und anschließend move-window -r aufgerufen wird , um sie ab 1 erneut zu nummerieren. Ähnlich funktioniert es, wenn Sie das erste Fenster ans Ende verschieben. Durch die Auswahl einer riesigen Zahl, die Sie niemals verwenden werden, wird sichergestellt, dass beim erneuten Auslösen von move-window -r alles wie erwartet nummeriert wird. Wenn Sie sich über refresh-client -S wundern , ist dies erforderlich, da die Statusleiste manchmal erst aktualisiert wird, wenn weitere Änderungen vorgenommen wurden , während das Umordnen aus dem Verschiebefenster ordnungsgemäß funktioniert. Indem Sie nur die Statusleiste (-S) aktualisieren, vermeiden Sie dies.

Das einzige Problem, das ich bei diesem Ansatz feststellen kann, ist, dass das Swap-Fenster implizit das zuletzt verwendete Fenster in das Fenster ändert, mit dem Sie getauscht haben. Wenn Sie sich also in Fenster Nr. 1 befinden, zu Fenster Nr. 4 wechseln und es um eins zurückschieben, werden Sie feststellen, dass Ihr zuletzt verwendetes Fenster das neue Nr. 4 (früher Nr. 3) anstelle von Nr. 1 ist. Daran scheint es keinen Weg zu geben.


2

Mit können Sie base-indexdie Startnummer für Ihre Fenster ändern. wenn Sie setzen base-indexauf 1, dann move-window -rwird neu nummeriert alle Fenster zu starten 1, damit die Freisetzung , 0um ein Fenster in den entsprechenden Steckplatz zu verschieben:

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

Wenn Sie fertig sind, können Sie auf zurücksetzen base-index, 0wenn Sie später verwenden möchten, move-window -rohne Ihr Fenster um zu verschieben0



1

Beides swap-window -s 5und swap-window -t 5aktuelles Fenster mit Fenster 5 tauschen, jedoch mit unterschiedlicher Semantik.

swap-window -s 5

  • Das Programm von Fenster 5 wird mit der aktuellen Gewinnnummer ausgeführt.
  • Die aktuelle Fensternummer bleibt unverändert.
  • Wenn Sie denselben Befehl wiederholen, wird der vorherige Status wiederhergestellt.

swap-window -t 5

  • aktuelles Programm mit der Nummer 5.
  • Letzte Überschreibung der aktuellen Fensternummer.

das numberin swap-window -s numberund -t numberkönnte sowohl absolut , zB 5, als auch relativ , zB -1, +2 sein.

PS unten ist ein Auszug aus der TMUX-Statuszeile, die den Effekt von veranschaulichtswap-window -s 5

kürzlich:
[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

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

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

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


In dieser Antwort finden Sie eine Bash-Funktion zum Verschieben des Bereichs von tmux-Fenstern, z. B. [2-5] von [0-6] Fenstern.
Qeatzy

1

Versuchen Sie im tmux-Fenster Folgendes, um Fenster 0 gegen 1 auszutauschen:

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


0

Ich denke, Sie möchten eine neue Tastenkombination an den Befehl "Fenster auswählen" binden.

Ich weiß, Sie sagten, Sie hätten die Manpage bereits gelesen, aber Sie sollten darauf zurückgreifen. Sie müssen Ihre ~ / .tmux.conf-Datei ändern, um einen Bind-Key-Befehl hinzuzufügen.

Schauen Sie sich insbesondere Seite 4 des Folgenden an.

tmux man page


choose-windowscheint das aktuelle Fenster nicht an eine neue Position zu verschieben.
dan

Auch choose-windowist schon gebunden C-B w.
Kynan

0

Dies ist die Methode, die ich benutze. Sie können ein Fenster immer noch nicht in einen belegten Index verschieben, aber Sie können ein Fenster in einen höheren (nicht verwendeten) Index verschieben und in der Lücke neu anordnen, in der sich der vorherige Index befand.

Angenommen, Sie haben 3 Fenster und möchten ein viertes hinzufügen, aber an der Stelle, an der 3 zuvor war.

Bevor Sie ein neues Fenster hinzufügen: Tmux-Präfix dann. öffnet den Bewegungsbefehl. Geben Sie 4 ein und der Index von 3 wird nun zu 4, fügen Sie einfach ein weiteres Fenster hinzu und es befindet sich bei Index 3 und Ihr altes Fenster befindet sich weiterhin bei Index 4.


Obwohl dies ein hilfreicher Tipp ist, wird die Frage hiermit nicht beantwortet.
Jan Doggen

0

Öffnen Sie zuerst den Befehl tmux press and release:

Ctrl + b 

Und um das aktuelle Fenster in das rechte Fenster (in kreisförmiger Reihenfolge) zu ändern, gehen Sie wie folgt vor:

}

So ändern Sie das aktuelle Fenster nach links:

{
  • Vergessen Sie nicht, SHIFTwenn Sie }oder drücken {.

2
In einigen Szenarien definitiv hilfreich, aber dadurch werden die Fensterbereiche innerhalb eines Fensters neu angeordnet (anstatt Fenster neu anzuordnen).
Trailing Slash

0

Für was es wert ist:

Ich habe dieses Skript zusammen gehackt, um alle Fenster in einer "TUI" anordnen zu können. Es listet alle Ihre Fenster in einer temporären Datei auf und öffnet sie mit Ihrem Standardeditor (setzt voraus, dass Sie $ EDITOR eingestellt haben). Danach können Sie die Zeilen neu anordnen, und nachdem Sie die Datei gespeichert und geschlossen haben, werden die Fenster entsprechend neu angeordnet. (Dies ist ähnlich wie bei der Bestellung von Commits git rebase -i)

#!/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 eine Menge 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

Keine der Antworten hier hat mich befriedigt, deshalb habe ich ein Skript geschrieben, das das screenVerhalten beim Verschieben von Fenstern nachahmt tmux.

Es erkennt, ob die Zielfensternummer kleiner als die kleinste Fensternummer oder größer als die größte Fensternummer ist. Wenn dies der Fall ist, werden alle anderen Fenster nach rechts oder links verschoben und schrittweise von 1-N neu nummeriert . Dies geschieht mit dem move-windowBefehl.

Wenn die Fensternummer zwischen den kleinsten und größten Nummern liegt (dh vermutlich mit einer vorhandenen Fensternummer übereinstimmt), werden sie einfach mit dem swap-windowBefehl ausgetauscht .

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

Dann fügen Sie einfach diese einfache Schlüsselbindung zu Ihrem hinzu .tmux.conf:

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

Hinweis : Um das Tauschverhalten von screenFenstern perfekt nachzubilden, sollte ein Fenster, wenn Sie es auf eine vorhandene Fensternummer verschieben, den Platz dieses Fensters einnehmen und alle anderen Fenster werden nach rechts verschoben . Es wäre ziemlich einfach, dieses Skript zu ändern, um dies zu tun.


0

Keine Notwendigkeit für die Kommandozeile (das ist Ctrl+ bund dann :)

Bewegen Sie einfach Ihre Fenster mit

Ctrl+ b+:

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

Wenn jetzt eine freie Fensternummer vorhanden ist, verwenden Sie Ctrl+ b+ ., um ein Fenster neu zu nummerieren.

(Tipp: Benennen Sie Ihre Fenster mit Ctrl+ b+, ,wenn Sie den Überblick darüber verlieren, welches Fenster welches ist)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.