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

Come posso riordinare le finestre di tmux?

In screen, posso semplicemente digitare C-a :number 0 per spostare una finestra in cima alla lista delle finestre e spingere tutte le altre finestre in basso di uno. Qual è la sequenza di comando equivalente per tmux? Ho guardato la pagina man, ma la trovo confusa su questo punto.

Risposte (19)

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

Il comando swap-window è il più vicino a quello che vuoi.

“Prefix :” (cioè Ctrl+B, : di default) ti porta al prompt di tmux-command. Lì si inserisce:

swap-window -s 3 -t 1

per far scambiare le posizioni della finestra numero 3 e della finestra numero 1.

Per scambiare la finestra corrente con la finestra superiore, fate:

swap-window -t 0

Nel caso improbabile di non avere nessuna finestra all'indice 0, fate:

move-window -t 0

(se l'indice di base è 0, come è di default).

Potete legare quel comando a un tasto (T per “top” per esempio) aggiungendo quanto segue al vostro ~/.tmux.conf:

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

Aggiungendo alla risposta di Gareth, si possono usare le seguenti combinazioni di tasti

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

Premendo Ctrl+Shift+Left (si sposta la finestra corrente a sinistra. Allo stesso modo a destra. Non c'è bisogno di usare il modificatore (C-b).

Per la versione 3.0 di tmux, dovresti usare le seguenti combinazioni di tasti

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

Il tmux equivalente a :number 42 è :move-window -t 42.

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

Rinumero le finestre in questo modo:

Ctrl+b, ., 222

renderebbe la finestra attuale tmux (tutti i riquadri) numero 222.


Correlato: Quando mischio le cose in giro tendo a voler fare

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

e da lì posso anche usare Ctrl+b, ., reading per spostare la finestra corrente (tutti i riquadri insieme) sulla sessione di lettura. Puoi navigare tra le sessioni con Ctrl+b, s come faresti all'interno della sessione usando Ctrl+b, w.

HTH

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

Puoi implementare un equivalente al comando screen usando uno script di shell esterno che scelga tra number e swap-window. Puoi legarlo a un tasto in questo modo:

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

Usare swap-window per spostarsi su qualsiasi id: [più vicino al :numero dello schermo]

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

[m per spostare –> premi il prefisso-m e inserisci diciamo 3 . .per rinumerare la finestra a 3]

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

Poiché la risposta di Ashish Ariga non funziona sulla versione 1.9a e inferiore. Io uso < e > per scambiare la finestra a sinistra e a destra, rispettivamente, aggiungendo la linea sotto a .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

La soluzione più semplice da man, è usare i binding di default:

{ 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

Per quelli di voi che usano byobu come wrapper per tmux, potete scambiare la finestra corrente con quella precedente o successiva con:

Ctrl-Shift-F3
Ctrl-Shift-F4

Il key binding definito da byobu per questi tasti può essere interessante:

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

puoi usare base-index per cambiare il numero iniziale delle tue finestre. se imposti base-index a 1, allora move-window -r rinumererà tutte le finestre a partire da 1, liberando così 0 per spostare una finestra nel suo slot:

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

quando hai finito, puoi resettare base-index a 0 se vuoi usare move-window -r in seguito senza spostare la tua finestra a 0

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

tmux-pain-control fornisce ctrl-b > e ctrl-b < per spostare la finestra focalizzata a destra e a sinistra, avvolgendola.

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

L'approccio che uso combina un po’ la risposta di Ashish con quella di piec; ho le frecce alt-sinistra e destra legate a un piccolo callout rapido della shell che sposta la finestra una a sinistra o a destra, a meno che non sia la prima o l'ultima finestra, rispettivamente. Ho fatto questo perché, quando si emette uno swap +1 all'ultima finestra (o swap -1 alla prima finestra), lo swap continua, invece di tornare indietro come ci si potrebbe aspettare:

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

diventa

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

invece di

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

Quindi, i comandi che uso smettono di funzionare quando la finestra ha raggiunto il bordo della lista:

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'

Questo può essere facilmente combinato con base-index e renumber-windows per avere una lista di finestre che inizia da un numero arbitrario e non ha mai spazi vuoti.

Se state usando base-index 1 come me e non pensate di andare mai oltre le 999 finestre, potete usare un piccolo trucco per farlo girare correttamente, anche se i comandi si gonfiano un po’:

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'

Questo funziona spostando temporaneamente l'ultima finestra nell'indice inutilizzato-0 e poi chiamando move-window -r per rinumerarle ripartendo da 1. Funziona in modo simile quando si sposta la prima finestra alla fine; scegliendo un numero enorme che non userai mai, assicura che quando move-window -r scatterà di nuovo tutto sarà numerato come ci si aspetta. Se vi state chiedendo di refresh-client -S , questo è necessario perché a volte, mentre il riordino di move-window funziona correttamente, la barra di stato non si aggiorna fino a quando non vengono fatte ulteriori modifiche. Forzando un aggiornamento della sola barra di stato (-S), si evita questo.

L'unico problema che posso trovare con questo approccio è che swap-window modificherà implicitamente l'ultima finestra usata in quella con cui avete scambiato. Così, se siete sulla finestra #1, passate alla finestra quattro e spostatela indietro di uno, scoprirete che la vostra ultima finestra usata è la nuova # 4 (precedentemente #3) invece della #1. Non sembra esserci un modo per aggirare questo problema.

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

Sia swap-window -s 5 che swap-window -t 5 scambiano la finestra corrente con la finestra 5, ma con una semantica diversa.

swap-window -s 5

  • programma finestra 5 in vigore con il numero di win corrente.
  • il numero di finestra recente rimane invariato.
  • ripetere lo stesso comando riporta allo stato precedente.

swap-window -t 5

  • programma corrente in vigore con numero 5.
  • recente annullamento al numero di finestra corrente.

lo number in swap-window -s number e -t number potrebbe essere sia assoluto, per esempio, 5, che relativo, per esempio, -1, +2.

P.S. qui sotto è un estratto della statusline di tmux che illustra l'effetto di swap-window -s 5

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

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

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

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

un altro 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

Dalla finestra tmux, provate a scambiare la finestra 0 con la 1 come segue:

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

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

Per prima cosa, aprite il comando tmux premendo e rilasciando:

Ctrl + b

E per cambiare la finestra attuale in quella di destra (in ordine circolare), basta fare:

}

Per cambiare la finestra attuale in quella di sinistra:

{
  • Non dimenticare di usare SHIFT quando premi } o {.
0
0
0
2017-09-14 10:58:56 +0000

Per quello che vale:

Ho creato questo script per essere in grado di ordinare tutte le finestre in un “TUI”. Elenca tutte le vostre finestre in un file temporaneo, lo apre con il vostro editor predefinito (presume che abbiate impostato $EDITOR). Dopo questo puoi riordinare le linee e dopo aver salvato e chiuso il file, le finestre sono riordinate di conseguenza. (Questo è simile all'ordinamento dei commit quando si fa 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

Si potrebbe probabilmente migliorare molto, in particolare:

NOTA : Potresti essere spostato in un'altra finestra dopo aver eseguito il comando. Una gif in azione (github)

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

Nessuna delle risposte qui mi ha soddisfatto, così ho scritto uno script che (più o meno) imita il comportamento di spostamento delle finestre per screen.

Rileva se il numero della finestra di destinazione è più piccolo del numero della finestra più piccola o più grande del numero della finestra più grande, e se è così, spinge tutte le altre finestre a destra o a sinistra (rispettivamente) e le rinumera da 1-N in modo incrementale. Questo viene fatto con il comando tmux.

Se il numero della finestra è in mezzo ai numeri più piccoli/grandi (cioè, presumibilmente, corrisponde a un numero di finestra esistente), li scambia semplicemente con il comando move-window.

Ecco lo 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

Poi, basta aggiungere questo semplice key-binding al vostro swap-window:

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

Nota : Per imitare perfettamente il comportamento dello scambio di finestre di .tmux.conf, credo che quando si sposta una finestra su un numero di finestra esistente, questa dovrebbe prendere il suo posto e tutte le altre finestre sono spostate a destra. Sarebbe abbastanza semplice modificare questo script per farlo.

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

Questo è il metodo che uso io. Non puoi ancora spostare una finestra in un indice occupato, ma puoi spostarne una in un indice più alto (non utilizzato) e riorganizzarla nello spazio dove si trovava l'indice precedente.

Diciamo che avete 3 finestre e volete aggiungerne una quarta ma nel posto dove prima c'era la 3.

Prima di aggiungere una nuova finestra: Il prefisso Tmux poi . aprirà il comando di spostamento. Digitate 4 e l'indice di 3 diventerà ora 4, poi aggiungete semplicemente un'altra finestra e sarà all'indice 3 e la vostra vecchia finestra sarà ancora all'indice 4.

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

Non c'è bisogno della riga di comando (che è Ctrl + b e poi :)

Spostate semplicemente le vostre finestre con

Ctrl + b + :

poi inserite il nuovo numero di finestra (libero) e premete Invio

Se ora c'è un numero di finestra libero, usate Ctrl + b + . per rinumerare una finestra.

(Suggerimento: dai un nome alle tue finestre con Ctrl + b + , se perdi il conto di quale è quale)