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

Jak mogę zmienić kolejność okien tmuxa?

W screen mogę po prostu wpisać C-a :number 0, aby przenieść okno na górę listy okien i zepchnąć wszystkie inne okna o jeden w dół. Jaka jest równoważna sekwencja poleceń dla tmux? Spojrzałem na stronę man, ale uważam ją za zagmatwaną w tej kwestii.

Odpowiedzi (19)

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

Komenda swap-window jest najbliższa temu, co chcesz osiągnąć.

“Prefiks :” (czyli Ctrl+B, : domyślnie) przenosi Cię do znaku zachęty tmux-command. Tam wpisujesz:

swap-window -s 3 -t 1

aby okno numer 3 i okno numer 1 zamieniły się pozycjami.

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

swap-window -t 0

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

move-window -t 0

(jeśli base-index jest 0, jak domyślnie).

Możesz przypisać to polecenie do klawisza (na przykład T dla “top”), dodając poniższe do ~/.tmux.conf:

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

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+Left (przesunie bieżące okno w lewo. Analogicznie w prawo. Nie ma potrzeby używania modyfikatora (C-b).

Dla wersji tmux 3.0 należy używać następujących przypisań klawiszy

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

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

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

Zmieniam numerację okien w ten sposób:

Ctrl+b, ., 222

spowodowałoby, że aktualne okno tmux (wszystkie szyby) miałoby numer 222.


W związku z tym: Kiedy tasuję rzeczy wokół siebie, zwykle chcę zrobić

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

i stamtąd mogę również użyć Ctrl+b, ., reading, aby przenieść bieżące okno (wszystkie szyby naraz) do sesji czytania. Możesz przeglądać między sesjami używając Ctrl+b, s tak jak przeglądałbyś w obrębie sesji używając Ctrl+b, w.

HTH

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

Możesz zaimplementować odpowiednik komendy screen, używając zewnętrznego skryptu powłoki, który wybiera między number a swap-window. Możesz go powiązać z kluczem w ten sposób:

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

Używając swap-window, aby przenieść się do dowolnego id: [najbliższy numerowi ekranu]

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

[m for move – uderz w prefix-m i wpisz powiedzmy 3 . .aby zmienić numer okna na 3].

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

Ponieważ odpowiedź Ashish Ariga nie działa na wersji 1.9a i niższych. Używam < i > do zamiany okna odpowiednio w lewo i w prawo, dodając poniższą linię do .tmux.conf.

# 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

Najprostszym rozwiązaniem z man, jest użycie domyślnych bindów:

{ 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

Dla tych z was, którzy używają byobu jako wrappera dla tmuxa, możecie zamienić bieżące okno z poprzednim lub następnym za pomocą:

Ctrl-Shift-F3
Ctrl-Shift-F4

Wiązanie klawiszy zdefiniowane przez byobu dla tych klawiszy 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
2
2
2
2016-12-13 06:50:32 +0000

Możesz użyć base-index do zmiany numeru początkowego okien. jeśli ustawisz base-index na 1, to move-window -r przenumeruje wszystkie okna zaczynając od 1, zwalniając w ten sposób 0 do przeniesienia okna w jego slot:

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

po zakończeniu możesz zresetować base-index na 0, jeśli chcesz użyć move-window -r później bez przenoszenia okna na 0.

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

tmux-pain-control ](https://github.com/tmux-plugins/tmux-pain-control) zapewnia ctrl-b > i ctrl-b < do przesuwania zogniskowanego okna w prawo i w lewo, zawijając je dookoła.

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

Podejście, którego używam, łączy trochę odpowiedzi Ashisha z piec’s; mam alt-left i right arrow związane z szybkim małym wywołaniem powłoki, które przesuwa okno o jeden w lewo lub w prawo, chyba że jest to pierwsze lub ostatnie okno, odpowiednio. Zrobiłem to dlatego, że gdy wydasz swap +1 na ostatnim oknie (lub swap -1 na pierwszym), to nadal będzie ono zamieniane, zamiast zapętlać się ponownie, jak można by 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, komendy 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 base-index i renumber-windows, aby mieć listę okien, która zaczyna się od dowolnego numeru i nigdy nie ma żadnych luk.

Jeśli używasz base-index 1 tak jak ja i nie sądzisz, że kiedykolwiek przekroczysz 999 okien, możesz użyć małej sztuczki, aby zrobić to poprawnie, choć komendy trochę się rozrastają:

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 na nieużywany indeks-0, a następnie wywołanie move-window -r, aby przenumerować je ponownie zaczynając od 1. Działa to podobnie, gdy przenosimy pierwsze okno na koniec; wybierając dużą liczbę, której nigdy nie użyjemy, zapewniamy, że gdy move-window -r ponownie się uruchomi, wszystko będzie ponumerowane tak, jak byśmy tego oczekiwali. Jeśli zastanawiasz się nad refresh-client -S , jest to konieczne, ponieważ czasami, podczas gdy zmiana kolejności z move-window będzie działać poprawnie, pasek stanu nie będzie się aktualizował, dopóki nie zostaną wprowadzone kolejne zmiany. Wymuszając odświeżenie tylko paska stanu (-S), unikasz tego.

Jedynym problemem, jaki mogę znaleźć z tym podejściem jest to, że swap-window niejawnie zmieni ostatnio używane okno na to, z którym się zamieniłeś. Tak więc, jeśli jesteś na oknie #1, przełączasz się na okno czwarte i przesuwasz je o jeden do tyłu, okaże się, że ostatnio używanym oknem jest nowe # 4 (wcześniej #3) zamiast #1. Nie wydaje się, aby istniał sposób na obejście tego problemu.

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

Zarówno swap-window -s 5 jak i swap-window -t 5 zamieniają bieżące okno z oknem 5, ale z różną semantyką.

swap-window -s 5

  • program okna 5 działa z bieżącym numerem okna.
  • ostatni numer okna pozostaje niezmieniony.
  • powtórzenie tej samej komendy spowoduje powrót do poprzedniego stanu.

swap-window -t 5

  • aktualny program z numerem 5.
  • ostatnie nadpisanie na aktualny numer okna.

the number in swap-window -s number and -t number can be both absolute , np. 5, and relative , np. -1, +2.

P.S. below is excerpt of tmux statusline illustrating effect of swap-window -s 5

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

now, after 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

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

kolejny 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

W oknie tmux spróbuj następująco zamienić okno 0 z 1:

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

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

Najpierw otwórz komendę tmux, naciśnij i puść:

Ctrl + b

I aby zmienić aktualne okno na prawe (w kolejności kołowej), wystarczy zrobić:

}

Aby zmienić aktualne okno na lewe:

{
  • Nie zapomnij użyć SHIFT, gdy wciśniesz } lub {.
0
0
0
2017-09-14 10:58:56 +0000

Dla tego, co jest warte:

Zhakowałem ten skrypt razem, aby móc uporządkować wszystkie okna w “TUI”. Wypisuje on wszystkie okna w pliku tymczasowym, otwiera go za pomocą domyślnego edytora (zakładając, że ustawiłeś $EDITOR). Po tym możesz zmienić kolejność linii, a po zapisaniu i zamknięciu pliku, okna zostaną odpowiednio uporządkowane. (Jest to podobne do zamawiania commitów 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 to znacznie poprawić, w szczególności:

UWAGA : Po uruchomieniu komendy możesz zostać przeniesiony do innego okna. A gif of it in action (github)

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

Żadna z odpowiedzi tutaj mnie nie usatysfakcjonowała, więc napisałem skrypt, który (jakby) naśladuje zachowanie przesuwania okien dla screen.

Wykrywa on, czy numer okna docelowego jest mniejszy od numeru najmniejszego okna lub większy od numeru największego okna, a jeśli tak, to przesuwa wszystkie pozostałe okna w prawo lub w lewo (odpowiednio) i zmienia ich numerację na od 1-N przyrostowo. Odbywa się to za pomocą polecenia tmux.

Jeśli numer okna znajduje się pomiędzy najmniejszymi/największymi numerami (tzn. przypuszczalnie pasuje do istniejącego numeru okna), to po prostu zamienia je komendą move-window.

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 wiązanie klawiszy do swojego swap-window:

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

Uwaga : Aby idealnie naśladować zachowanie zamiany okien w .tmux.conf, uważam, że kiedy przesuwasz okno na istniejący numer okna, powinno ono zająć jego miejsce, a wszystkie inne okna są przesuwane na prawą stronę. Byłoby dość prosto zmodyfikować ten skrypt, aby to zrobić.

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

To jest metoda, której używam. Nadal nie możesz przenieść okna do zajętego indeksu, ale możesz przenieść jedno do wyższego (nieużywanego indeksu) i ponownie ułożyć w luce, w której był poprzedni indeks.

Powiedzmy, że masz 3 okna i chcesz dodać czwarte, ale w miejscu, gdzie poprzednio było 3.

Zanim dodasz nowe okno: Prefiks Tmux następnie . otworzy się komenda move. Wpisz 4 i indeks 3 stanie się 4, następnie po prostu dodaj kolejne okno i będzie ono na indeksie 3, a twoje stare okno będzie nadal na indeksie 4.

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

Nie ma potrzeby korzystania z linii poleceń (która jest Ctrl + b, a następnie :)

Po prostu przesuń swoje okna za pomocą

Ctrl + b + :

następnie wprowadź nowy (wolny) numer okna i naciśnij Enter

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

(Wskazówka: nazwij swoje okna za pomocą Ctrl + b + , jeśli stracisz orientację, które jest które)