Jak zmienić kolejność okien Tmux?

413

W screen, mogę po prostu wpisać, C-a :number 0aby przenieść okno na górę listy okien i przesunąć wszystkie pozostałe okna w dół o jedno. Jaka jest równoważna sekwencja poleceń tmux? Spojrzałem na stronę podręcznika, ale w tej kwestii jest to mylące.

dan
źródło
95
C-b, .pozwala przenumerować okno.
izomorfizmy
7
Czytając wszystkie odpowiedzi, wciąż nie widzę łatwego rozwiązania pytania PO: jak przenieść dane okno do pozycji 0 i przesunąć całą resztę w prawo. Czy naprawdę muszę ręcznie przesuwać każdy z nich, aby to zrobić? Chcę tylko cofnąć ruch, który wykonałem przez pomyłkę (i nie jestem do końca pewien co), który moim zdaniem przeniósł okno 0 do okna 8 i przesunął wszystkie pozostałe w lewo.
nealmcb,
1
@ nealmcb najłatwiejszym pomysłem jest ustawienie indeksu podstawowego na 1, zmiana numeracji, a następnie przeniesienie okna do pustego miejsca 0: superuser.com/a/1155999/674549
eMBee
Aby zobaczyć różnicę swap-window -s numberi swap-window -t numberzamienić bieżące okno, zobacz moją odpowiedź tutaj .
qeatzy
Zobacz tę odpowiedź dla funkcji bash, aby przesunąć zakres okien tmux, np. [2-5] z [0-6] okien.
qeatzy

Odpowiedzi:

467

swap-windowKomenda jest najbliżej, co chcesz.

„Prefiks” (czyli Ctrl+ B, :domyślnie) powoduje przejście do wiersza tmux-komend. Tam wpisujesz:

swap-window -s 3 -t 1

aby okno nr 3 i okno nr 1 zamieniły się miejscami.

Aby zamienić bieżące okno z górnym oknem, wykonaj:

swap-window -t 0

W mało prawdopodobnym przypadku braku okna o indeksie 0 wykonaj:

move-window -t 0

(jeśli indeks podstawowy wynosi 0, tak jak jest domyślnie).

Możesz powiązać to polecenie z klawiszem (na przykład T dla „góry”), dodając następujące polecenie do ~/.tmux.conf:

bind-key T swap-window -t 0
matlehmann
źródło
6
Dzięki za edycję, ale move-windowdziała tylko, jeśli pod danym indeksem nie ma innego okna. Więc w większości przypadków move-window -t 0nie będzie działać, ponieważ zwykle w tej pozycji będzie już inne okno.
matlehmann
Zgadza się, poprawię to.
zakkak
2
Możesz rzucić okiem movew.
Marcello Romani
3
Ponadto, bind-key L swap-window -t -1aby było to ostatnie okno.
Aby zobaczyć różnicę swapw -s numberi swapw -t numberzamienić bieżące okno, zobacz moją odpowiedź tutaj .
qeatzy
257

Dodając do odpowiedzi Garetha, możesz użyć następujących powiązań klawiszy

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

Naciśnięcie Ctrl + Shift + Lewo (przesunie bieżące okno w lewo. Podobnie w prawo. Nie trzeba używać modyfikatora (Cb).

Ashish Ariga
źródło
9
Ta -1i +1składnia pomaga rozwiązać problem zajętych wskaźników. tmux przesunie za ciebie inne okna i automatycznie zawinie do końca / początku. To najlepsza odpowiedź.
brianpeiris,
1
Moja niezdolność do łatwego przenoszenia okien tmux dręczy mnie od kilku tygodni. To znacznie ułatwia obsługę okien! Ogromne podziękowania z tej ostatniej konwersji tmux.
calvinf
8
Świetna wskazówka, wolę bind-key S-Left swap-window -t -1, więc mogę zrobić <prefix> Shift + strzałka, ponieważ nie lubię popsuć powiązań klawiszy dla programów.
skromny
4
Jeśli używasz liter, musisz używać dużej litery, a nie CS, w ten sposób:bind-key -n C-H swap-window -t -1
Matthew Mitchell,
1
Mam również problem z wersją 1.9a, gdy korzystam z Ashish Ariga, bind-key -n C-S-Left swap-window -t -1ale działa dobrze, gdy używa się prefiksu sugerowanego przez @MatthewMitchell
Rho Phi
63

Odpowiednikiem tmux :number 42jest :move-window -t 42.

Randal Schwartz
źródło
9
Jest to związane z Cb.
Środa
1
Dzięki! Jest to znacznie lepsze niż przyjęta odpowiedź imo.
Ashe
5
@ArlenCuss W rzeczywistości obie odpowiedzi są dobre i przydatne. Widzisz, używając screen: liczba, którą możesz zamienić okna, używając tmux's: move-window możesz przenieść okno tylko wtedy, gdy indeks docelowy nie jest używany. Tak więc, imo, zarówno: zamień okno jak i: przesuń okno są niezbędne, aby przejąć kontrolę nad lokalizacjami okien :)
Victor Farazdagi,
1
+1 za uzyskanie odpowiedzi od guru programowania (również za poprawność). Jest to jedyny sposób, w jaki mogłem zmusić go do pracy w aktywnym oknie
inżynierDave
4
tmux's nie:move-window jest równoważne z screenem . zamienia, jeśli miejsce docelowe istnieje, w takim przypadku kończy się niepowodzeniem. Musisz wybrać pomiędzy i:number:number:move-window:move-window:swap-window
piec
15

Ponownie numeruję okna w następujący sposób:

Ctrl+ b, .,222

zmieniłoby bieżące tmuxokno (wszystkie panele) na numer 222.


Powiązane: Kiedy tasuję różne rzeczy, zwykle chcę to robić

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

a stamtąd można również użyć Ctrl+ b, ., readingaby przesunąć bieżące okno (wszystkie szyby na raz) nad sesją czytania. Można przeglądać wśród sesje z Ctrl+ b, stak byś przeglądania ciągu sesji za pomocą Ctrl+ b, w.

HTH

izomorfizmy
źródło
12

Można wdrożyć odpowiednik screen„s numberpolecenie za pomocą zewnętrznego skrypt, który wybiera pomiędzy swap-windowi move-window. W ten sposób możesz powiązać go z kluczem:

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
piec
źródło
2
Bardzo fajne rozwiązanie, świetnie działa! Właśnie dokonałem drobnych zmian w czyszczeniu i usunąłem -Fopcję, która nie jest akceptowana przez moją wersję tmux.
haridsv
8

Korzystanie z okna zamiany, aby przejść do dowolnego identyfikatora: [najbliższy screenowi: liczba]

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

[m dla ruchu -> naciśnij prefiks-m i wpisz powiedz 3. .do zmiany numeracji okna na 3]

Karthik Gurusamy
źródło
1
To już jest miłe, ale jeszcze lepiej byłoby: zamień okno, a jeśli zawiedzie, wróć do okna przeniesienia
nisc
5

Ponieważ odpowiedź Ashish Ariga nie działa w wersji 1.9a i niższych. Używam <i >do zamiany okna odpowiednio na lewą i prawą, dodając wiersz poniżej do .tmux.conf.

# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1
qun
źródło
4

Najprostszym rozwiązaniem manjest użycie domyślnych powiązań:

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.
jhvaras
źródło
6
Okna i panele tmux są różne.
Marcello Romani
4
To wciąż pomogło mi zdobyć to, czego chciałem
lkraav
To pytanie dotyczy okien, a nie okien
mbigras,
3

Dla tych, którzy używają byobujako opakowania dla tmux, możesz zamienić bieżące okno na poprzednie lub następne okno za pomocą:

Ctrl-Shift-F3
Ctrl-Shift-F4

Powiązanie klawiszy zdefiniowane byobudla tych kluczy może być interesujące:

bind-key -n    C-S-F3 swap-window -t :-1
bind-key -n    C-S-F4 swap-window -t :+1
Dave Kuhlman
źródło
Byłby świetnym skrótem do poruszania się po podziałach w określonym oknie.
Pablo A
2

Podejście, które stosuję łączy w sobie trochę odpowiedzi Ashisha z piecem; Mam lewą i prawą strzałkę związaną z krótkim objaśnieniem powłoki, która przesuwa okno jedno w lewo lub w prawo, chyba że jest to pierwsze lub ostatnie okno, z szacunkiem. Zrobiłem to, ponieważ kiedy wystawisz swap +1 w ostatnim oknie (lub swap -1 w pierwszym oknie), nadal będzie zamieniał, zamiast zapętlać się ponownie, jak możesz się spodziewać:

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

Staje się

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

Zamiast

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

Tak więc polecenia, których używam, przestają działać, gdy okno osiągnie krawędź listy:

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'

Można to łatwo połączyć z indeksem bazowym i numeracją okien w celu uzyskania listy okien, które zaczynają się od dowolnej liczby i nigdy nie mają żadnych przerw.

Jeśli używasz indeksu bazowego 1 takiego jak ja i nie sądzisz, że kiedykolwiek przekroczysz 999 okien, możesz zastosować małą sztuczkę, aby poprawnie się toczyć, choć polecenia nieco się rozluźniają:

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'

Działa to poprzez tymczasowe przeniesienie ostatniego okna do nieużywanego indeksu-0, a następnie wywołanie move-window -r w celu zmiany numeracji, zaczynając od 1. Działa podobnie podczas przesuwania pierwszego okna do końca; wybierając ogromną liczbę, której nigdy nie użyjesz, zapewnia to, że gdy ponownie przesunie się okno -r, wszystko będzie ponumerowane tak, jak można się spodziewać. Jeśli zastanawiasz się nad odświeżeniem klienta-S , jest to konieczne, ponieważ czasami, chociaż zmiana kolejności z okna przenoszenia będzie działać poprawnie, pasek stanu nie zostanie zaktualizowany, dopóki nie zostaną wprowadzone dalsze zmiany. Wymuszając odświeżenie tylko paska stanu (-S), unikniesz tego.

Jedynym problemem, jaki mogę znaleźć w tym podejściu, jest to, że okno zamiany domyślnie zmieni ostatnio używane okno na to, z którym zamieniłeś się. Tak więc, jeśli jesteś w oknie nr 1, przełącz się na okno czwarte i cofnij je o jedno, a zobaczysz, że ostatnio używane okno to nowe nr 4 (dawniej nr 3) zamiast nr 1. Wydaje się, że nie ma sposobu na obejście tego.

Alaska
źródło
2

możesz użyć, base-indexaby zmienić numer początkowy dla swoich okien. jeśli ustawisz base-indexna 1, wówczas move-window -rprzenumeruje wszystkie okna zaczynając od 1, zwalniając w ten sposób, 0aby przenieść okno do jego gniazda:

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

gdy skończysz, możesz zresetować base-indexdo, 0jeśli chcesz użyć move-window -rpóźniej bez przesuwania okna o0

eMBee
źródło
2

tmux-pain-control zapewnia ctrl-b >i ctrl-b <przesuwa skoncentrowane okno w prawo i lewo, owijając się wokół.

pepper_chico
źródło
Nie działa dla mnie w tmux 2.5
Dmitry Frank
1
@DmitryFrank ops, prawda, mój zły. Było to spowodowane przez github.com/tmux-plugins/tmux-pain-control
pepper_chico
Dzięki! Udało się skonfigurować te dwa ręcznie, ale wtyczka wygląda dobrze również na inne sposoby.
Dmitry Frank
1

Zarówno swap-window -s 5i swap-window -t 5zamień bieżące okno z oknem 5, ale z inną semantyką.

swap-window -s 5

  • program okna 5 obowiązujący z bieżącym numerem wygranej.
  • ostatni numer okna pozostaje niezmieniony.
  • powtórzenie tego samego polecenia przywróci poprzedni stan.

swap-window -t 5

  • aktualny program obowiązuje z numerem 5.
  • ostatnie zastąpienie bieżącego numeru okna.

numbersię swap-window -s numberi -t numbermoże być zarówno bezwzględne , na przykład, 5 i względem , na przykład, 1, +2.

PS poniżej to fragment linii statusu tmux ilustrujący działanieswap-window -s 5

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

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

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

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

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

qeatzy
źródło
Zobacz tę odpowiedź dla funkcji bash, aby przesunąć zakres okien tmux, np. [2-5] z [0-6] okien.
qeatzy
1

W oknie tmux spróbuj wykonać następujące czynności, aby zamienić okno 0 na 1:

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

Hamdi Al-Haj
źródło
0

Myślę, że chcesz powiązać nową kombinację klawiszy z poleceniem „wybierz okno”.

Wiem, że powiedziałeś, że już przeczytałeś stronę podręcznika, ale powinieneś powrócić do niej. musisz zmodyfikować plik ~ / .tmux.conf, aby dodać polecenie klucza powiązania.

W szczególności spójrz na stronę 4 poniżej.

strona man tmux


źródło
choose-windownie wydaje się przenosić bieżącego okna do nowej pozycji.
dan
Również choose-windowjest już związany z C-B w.
kynan
0

To jest metoda, której używam. Nadal nie możesz przenieść okna do zajętego indeksu, ale możesz przenieść je do wyższego (nieużywanego indeksu) i zmienić kolejność odstępu, w którym znajdował się poprzedni indeks.

Załóżmy, że masz 3 okna i chcesz dodać czwarte, ale w miejscu, gdzie wcześniej były 3.

Zanim dodasz nowe okno: Prefiks Tmux. otworzy polecenie ruchu. Wpisz 4, a indeks 3 zmieni się teraz na 4, a następnie po prostu dodaj kolejne okno i będzie on na indeksie 3, a twoje stare okno będzie nadal na indeksie 4.

mattLummus
źródło
Mimo że jest to przydatna wskazówka, nie jest to odpowiedź na pytanie.
Jan Doggen
0

Najpierw otwórz komendę tmux i zwolnij:

Ctrl + b 

Aby zmienić rzeczywiste okno na prawe okno (w okrągłej kolejności), po prostu wykonaj:

}

Aby zmienić rzeczywiste okno w lewo:

{
  • Nie zapomnij użyć SHIFTpo naciśnięciu }lub {.
Jonatas Eduardo Salgado
źródło
2
Zdecydowanie pomocny w niektórych scenariuszach, ale to zmienia układ okien w oknie (zamiast zmieniać kolejność okien).
końcowy slash
0

Tyle ile jest warte:

Zhakowałem ten skrypt razem, aby móc zamówić wszystkie okna w „TUI”. Wyświetla listę wszystkich okien w pliku tymczasowym, otwiera go w domyślnym edytorze (zakłada, że ​​ustawiłeś $ EDITOR). Następnie możesz zmienić kolejność linii, a po zapisaniu i zamknięciu pliku okna są odpowiednio porządkowane. (Jest to podobne do zamawiania zatwierdzeń podczas wykonywania 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

Prawdopodobnie można by go znacznie poprawić, w szczególności:

UWAGA : Po uruchomieniu polecenia możesz zostać przeniesiony do innego okna.

Prezent w akcji (github)

steinar
źródło
0

Żadna z odpowiedzi tutaj mnie nie zadowoliła, więc napisałem skrypt, który (w pewnym sensie) naśladuje zachowanie screenokna tmux.

Wykrywa, czy docelowy numer okna jest mniejszy niż najmniejszy numer okna czy większy niż największy numer okna, a jeśli tak, przesuwa wszystkie pozostałe okna odpowiednio (odpowiednio) w prawo lub w lewo i przenosi je z przyrostem 1-N . Odbywa się to za pomocą move-windowpolecenia.

Jeśli numer okna znajduje się pomiędzy najmniejszymi / największymi liczbami (tzn. Przypuszczalnie pasuje do istniejącego numeru okna), po prostu zamienia je swap-windowpoleceniem.

Oto skrypt:

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

Następnie po prostu dodaj to proste przypisanie klucza do .tmux.conf:

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

Uwaga : Aby idealnie naśladować screenzachowanie zamiany okien, uważam, że po przeniesieniu okna na istniejący numer okna powinno ono zająć miejsce tego okna, a wszystkie pozostałe okna są przesunięte w prawo . W tym celu zmodyfikowanie tego skryptu byłoby dość proste.

Luke Davis
źródło
0

Nie ma potrzeby wiersza polecenia (który jest Ctrl+, ba następnie :)

Po prostu przesuwaj okna za pomocą

Ctrl+ b+:

następnie wprowadź nowy (bezpłatny) numer okna i naciśnij Enter

Jeśli jest teraz wolny numer okna, użyj Ctrl+ b+, .aby ponownie numerować okno.

(Wskazówka: nazwij swoje okna za pomocą Ctrl+ b+, ,jeśli stracisz kontrolę nad tym, która jest która)

rubo77
źródło