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

Hoe kan ik de volgorde van tmux vensters veranderen?

In screen, kan ik gewoon C-a :number 0 typen om een venster naar de top van de vensterlijst te verplaatsen en alle andere vensters één naar beneden te duwen. Wat is de equivalente commando-sequentie voor tmux? Ik heb op de man page gekeken, maar ik vind het verwarrend op dit punt.

Antwoorden (19)

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

Het swap-window commando komt het dichtst bij wat je wilt.

“Prefix :” (dat is standaard Ctrl+B, :) brengt je naar de tmux-command prompt. Daar voer je in:

swap-window -s 3 -t 1

om venster nummer 3 en venster nummer 1 van positie te laten verwisselen.

Om het huidige venster te laten wisselen met het bovenste venster, doe je:

swap-window -t 0

In het onwaarschijnlijke geval dat er geen venster op index 0 is, doe je:

move-window -t 0

(als de basis-index 0 is, zoals standaard het geval is).

Je kunt dat commando binden aan een toets (T voor “top” bijvoorbeeld) door het volgende toe te voegen aan je ~/.tmux.conf:

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

In aanvulling op Gareth’s antwoord, kun je de volgende toetscombinaties gebruiken

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

Drukken op Ctrl+Shift+Left (verplaatst het huidige venster naar links. Op dezelfde manier naar rechts. Geen noodzaak om de modifier (C-b) te gebruiken.

Voor tmux 3.0 versie, moet u de volgende toetscombinaties gebruiken

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

Het tmux equivalent van :number 42 is :move-window -t 42.

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

Ik hernummer vensters als volgt:

Ctrl+b, ., 222

zou het huidige tmux venster (alle ruiten) nummer 222 maken.

  • *

Gerelateerd: Als ik met dingen aan het schuiven ben, heb ik de neiging om

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

te doen en van daaruit kan ik ook Ctrl+b, ., reading gebruiken om het huidige venster (alle vensters tegelijk) naar de leessessie te verplaatsen. Je kunt tussen sessies bladeren met Ctrl+b, s op dezelfde manier als je binnen een sessie zou bladeren met Ctrl+b, w.

HTH

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

Je kunt een equivalent van het screen commando implementeren door een extern shell script te gebruiken dat kiest tussen number en swap-window. Je kunt het op die manier aan een toets 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

Gebruik swap-window om naar een id te gaan: [het dichtst bij het :nummer van het scherm]

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

[m voor verplaatsen – druk op prefix-m en voer zeg 3 in . .om venster te hernummeren naar 3]

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

Omdat Ashish Ariga’s antwoord niet werkt op versie 1.9a en lager. Ik gebruik < en > om het venster naar links en rechts te wisselen, respectievelijk, door de onderstaande regel aan .tmux.conf toe te voegen.

# 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

De eenvoudigste oplossing vanaf man, is om de standaard bindingen te gebruiken:

{ 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

Voor degenen onder u die byobu gebruiken als uw wrapper voor tmux, kunt u het huidige venster verwisselen met het vorige of volgende venster met:

Ctrl-Shift-F3
Ctrl-Shift-F4

De door byobu gedefinieerde toetsenbinding voor deze toetsen kan van belang zijn:

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

je kunt base-index gebruiken om het startnummer voor je vensters te veranderen. als je base-index op 1 zet, dan zal move-window -r alle vensters hernummeren beginnend bij 1, waardoor 0 vrijkomt om een venster in zijn slot te zetten:

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

als je klaar bent, kun je base-index weer op 0 zetten als je later move-window -r wilt gebruiken zonder je venster op 0 te zetten

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

tmux-pain-control ](https://github.com/tmux-plugins/tmux-pain-control) biedt ctrl-b > en ctrl-b < om het gefocuste venster naar rechts en links te verplaatsen, rondwentelend.

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

De aanpak die ik gebruik combineert een beetje van Ashish’s antwoord met dat van Piec; ik heb alt-left en right arrow gebonden aan een snelle kleine shell callout die het venster één naar links of rechts verplaatst, tenzij het het eerste of het laatste venster is, respectievelijk. Ik deed dit omdat, wanneer je een swap +1 uitvoert op het laatste venster (of swap -1 op het eerste venster), het nog steeds zal swappen, in plaats van weer terug te lussen zoals je zou verwachten:

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

Wordt

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

In plaats van

Dus, de commando’s die ik gebruik stoppen met werken wanneer het venster de rand van de lijst heeft bereikt:

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

Dit kan gemakkelijk worden gecombineerd met base-index en renumber-windows om een lijst van vensters te hebben die begint bij een willekeurig nummer en nooit gaten vertoont.

Als je base-index 1 gebruikt zoals ik en je denkt niet dat je ooit boven de 999 vensters zult komen, kun je een trucje gebruiken om het goed te laten rollen, hoewel de commando’s een beetje opzwellen:

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'

Dit werkt door het laatste venster tijdelijk te verplaatsen naar de ongebruikte index-0 en dan move-window -r op te roepen om ze opnieuw te nummeren, beginnend bij 1. Hetzelfde geldt voor het verplaatsen van het eerste venster naar het einde; door een groot nummer te kiezen dat je nooit zult gebruiken, wordt ervoor gezorgd dat wanneer move-window -r opnieuw afvuurt, alles genummerd zal zijn zoals je zou verwachten. Als je je afvraagt hoe het zit met refresh-client -S, dat is nodig omdat soms, terwijl de herschikking van move-window goed werkt, de statusbalk niet wordt bijgewerkt totdat er verdere wijzigingen zijn gemaakt. Door een refresh van alleen de statusbalk te forceren (-S), voorkom je dit.

Het enige probleem dat ik kan vinden met deze aanpak is dat swap-window impliciet het laatst gebruikte venster zal veranderen in het venster waarmee je hebt geruild. Dus, als je in venster #1 bent, overschakelt naar venster vier en het één terugzet, zul je merken dat je laatst gebruikte venster het nieuwe # 4 (voorheen #3) is in plaats van #1. Er lijkt geen manier te zijn om dit te omzeilen.

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

Zowel swap-window -s 5 als swap-window -t 5 verwisselen het huidige window met window 5, maar met verschillende semantiek.

swap-window -s 5

  • window 5 programma in werking met huidig win nummer.
  • recent vensternummer blijft ongewijzigd.
  • herhaal zelfde commando rolt terug naar vorige status.

swap-window -t 5

  • huidige programma van kracht met nummer 5.
  • recent overschrijven naar huidig vensternummer.

de number in swap-window -s number en -t number kunnen zowel absoluut zijn, b.v. 5, als relatief, b.v. -1, +2.

P.S. hieronder staat een uittreksel van de tmux-statuslijn die het effect van swap-window -s 5 illustreert

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

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

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

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

nog een 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

Probeer in het tmux-venster het volgende om venster 0 met 1 te verwisselen:

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

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

Open eerst het tmux commando druk op en laat los:

Ctrl + b

En om het eigenlijke venster naar het rechter venster te veranderen (in cirkelvormige volgorde), doe je gewoon:

}

Om het eigenlijke venster naar links te veranderen:

{
  • Vergeet niet om SHIFT te gebruiken wanneer je op } of { drukt.
0
0
0
2017-09-14 10:58:56 +0000

Voor wat het waard is:

Ik heb dit script in elkaar gehackt om alle vensters in een “TUI” te kunnen ordenen. Het zet al je vensters op een rijtje in een tijdelijk bestand, opent het met je standaard editor (ervan uitgaande dat je $EDITOR hebt ingesteld). Hierna kun je de regels opnieuw ordenen en nadat je het bestand opslaat en sluit, worden de vensters opnieuw geordend. (Dit is vergelijkbaar met het ordenen van commits als je git rebase -i doet)

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

Het kan waarschijnlijk nog een stuk beter, in het bijzonder:

NOOT : Het is mogelijk dat je naar een ander venster wordt verplaatst nadat je het commando hebt uitgevoerd. Een gifje in actie (github)

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

Geen van de antwoorden hier stelde me tevreden, dus schreef ik een script dat (min of meer) het screen venster-verplaats-gedrag nabootst voor tmux.

Het detecteert of het nummer van het bestemmingsvenster kleiner is dan het kleinste vensternummer of groter dan het grootste vensternummer, en als dat zo is, duwt het alle andere vensters naar rechts of naar links (respectievelijk) en hernummert ze van 1-N incrementeel. Dit wordt gedaan met het commando move-window.

Als het vensternummer tussen de kleinste/grootste nummers ligt (d.w.z., vermoedelijk, overeenkomt met een bestaand vensternummer), worden ze gewoon verwisseld met het swap-window commando.

Hier is het script:

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

Voeg dan gewoon deze eenvoudige toets-binding toe aan je .tmux.conf:

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

Note : Om het verwisselen van vensters met screen perfect na te bootsen, geloof ik dat wanneer je een venster verplaatst naar een bestaand vensternummer, het dat venster’s plaats inneemt en alle andere vensters naar rechts worden verplaatst. Het zou vrij eenvoudig zijn om dit script aan te passen om dit te doen.

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

Dit is de methode die ik gebruik. Je kunt nog steeds geen venster verplaatsen naar een bezette index, maar je kunt er wel een verplaatsen naar een hogere (ongebruikte index) en herschikken in het gat waar de vorige index was.

Stel dat je 3 vensters hebt en een vierde wilt toevoegen, maar dan op de plaats waar voorheen 3 stond.

Voordat je een nieuw venster toevoegt: Tmux prefix dan . opent het commando verplaatsen. Typ 4 in en de index van 3 wordt nu 4, voeg dan gewoon een ander window toe en het zal op index 3 staan en je oude window zal nog steeds op index 4 staan.

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

Geen behoefte aan de commandline (die is Ctrl + b en dan :)

Verplaats gewoon je vensters met

Ctrl + b + :

voer dan het nieuwe (vrije) vensternummer in en druk op Enter

Als er nu een vrij vensternummer is, gebruik dan Ctrl + b + . om een venster te hernummeren.

(Tip: geef uw vensters een naam met Ctrl + b + , als u niet meer weet welk venster welk is)