Come riordinare tmux windows?


414

In screen, posso solo digitare C-a :number 0per spostare una finestra in cima all'elenco delle finestre e spingere tutte le altre finestre in basso di una. A cosa serve la sequenza di comandi equivalente tmux? Ho guardato la pagina man, ma la trovo confusa su questo punto.


95
C-b, .ti consente di rinumerare una finestra.
isomorfismi

7
Leggendo tutte le molte risposte, non vedo ancora una soluzione semplice alla domanda del PO: come spostare una determinata finestra in posizione 0 e spostare tutto il resto a destra. Devo davvero spostare manualmente ciascuno per farlo? Voglio solo annullare una mossa che ho fatto per errore (e non sono sicuro di cosa) che penso abbia spostato la finestra 0 nella finestra 8 e spostato tutte le altre a sinistra.
nealmcb,

1
@nealmcb il più semplice che potrei trovare è di impostare l'indice di base su 1, rinumerare, quindi spostare la finestra nello slot vuoto 0: superuser.com/a/1155999/674549
eMBee

Per differenza di swap-window -s numbere swap-window -t numberper scambiare la finestra corrente, vedere la mia risposta qui .
qeatzy,

Vedi questa risposta per una funzione bash per spostare l'intervallo di finestre tmux, ad esempio [2-5] di [0-6] finestre.
qeatzy,

Risposte:


467

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

"Prefisso:" (ovvero Ctrl+ B, :per impostazione predefinita) porta al prompt dei comandi tmux. Lì inserisci:

swap-window -s 3 -t 1

per consentire alla finestra numero 3 e alla finestra numero 1 di scambiare le loro posizioni.

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

swap-window -t 0

Nel caso improbabile di non avere una finestra all'indice 0, eseguire:

move-window -t 0

(se l'indice di base è 0, come per impostazione predefinita).

Puoi associare quel comando a una chiave (ad esempio T per "top") aggiungendo quanto segue a ~/.tmux.conf:

bind-key T swap-window -t 0

6
Grazie per la modifica, ma move-windowfunziona solo se non esiste un'altra finestra nell'indice indicato. Quindi, nella maggior parte dei casi, move-window -t 0non funzionerà, poiché di solito ci sarà già un'altra finestra in quella posizione.
matlehmann,

Esatto, lo migliorerò.
zakkak,

2
Potresti voler dare un'occhiata movew.
Marcello Romani,

3
Inoltre, bind-key L swap-window -t -1per renderlo l'ultima finestra.

Per differenza di swapw -s numbere swapw -t numberper scambiare la finestra corrente, vedere la mia risposta qui .
qeatzy,

257

Aggiungendo alla risposta di Gareth, è possibile utilizzare 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 + Maiusc + Sinistra (si sposta la finestra corrente a sinistra. Allo stesso modo a destra. Non è necessario utilizzare il modificatore (Cb).


9
Questo -1e la +1sintassi aiutano a risolvere il problema degli indici occupati. tmux sposterà le altre finestre per te e l'evento si avvolgerà automaticamente alla fine / inizio. Questa è la risposta migliore
brianpeiris,

1
La mia incapacità di spostare facilmente tmux windows mi ha infastidito per alcune settimane. Questo rende molto più facile gestire le finestre! Mille grazie da questo recente tmux convert.
Calvinf,

8
Ottimo suggerimento, preferisco bind-key S-Left swap-window -t -1, quindi posso fare <prefix> shift + arrow, dato che non mi piace confondere i tasti per i programmi.
pudica il

4
Se usi lettere devi usare una lettera maiuscola e non CS, in questo modo:bind-key -n C-H swap-window -t -1
Matthew Mitchell,

1
Ho qualche problema anche con 1.9a quando uso Ashish Ariga bind-key -n C-S-Left swap-window -t -1ma funziona bene quando si usa il prefisso come suggerito da @MatthewMitchell
Rho Phi

63

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


9
Questo è legato a Cb.
vedang

1
Grazie! Questo è molto meglio della risposta accettata imo.
Ashe,

5
@ArlenCuss In realtà entrambe le risposte sono buone e utili. Vedi, usando screen: number puoi scambiare windows, usando tmux's: move-window puoi spostare la finestra solo se l'indice target non è in uso. Quindi, imo, entrambi: swap-window e: move-window sono necessari per cogliere il controllo sulla posizione delle finestre :)
Victor Farazdagi,

1
+1 per ottenere una risposta da un guru della programmazione (anche per essere corretti). Questo è l'unico modo in cui sono riuscito a farlo funzionare su una finestra attiva
ingegnereDave

4
tmux non:move-window è equivalente a quello di schermo . scambia se la destinazione esiste, fallisce in quel caso. Devi scegliere tra e:number:number:move-window:move-window:swap-window
piec

15

Rinumero Windows in questo modo:

Ctrl+ b, .,222

renderebbe la tmuxfinestra corrente (tutti i riquadri) il numero 222.


Correlati: quando sto mescolando le cose in giro, tendo a voler fare

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

e da lì posso anche usare Ctrl+ b, ., readingper spostare la finestra corrente (tutti i riquadri in una sola volta) verso la sessione di lettura. È possibile navigare tra le sessioni con Ctrl+ b, sil modo in cui si navigare all'interno sessione utilizzando Ctrl+ b, w.

HTH


12

È possibile implementare un equivalente screendel numbercomando usando uno script shell esterno che sceglie tra swap-windowe move-window. Puoi associarlo a una chiave in questo modo:

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
Soluzione molto bella, funzionante alla grande! Ho appena apportato modifiche minori per ripulire e rimosso l' -Fopzione che non è accettata dalla mia versione di tmux.
Haridsv,

8

Utilizzo della finestra di scambio per passare a qualsiasi ID: [il più vicino allo schermo: numero]

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

[m per spostare -> premi prefisso-m e inserisci dire 3. .per rinumerare la finestra in 3]


1
Questo è già bello, ma sarebbe ancora meglio: fare la finestra di scambio e se fallisce, tornare alla finestra di spostamento
nisc

5

Poiché la risposta di Ashish Ariga non funziona sulla versione 1.9a e successive. Uso <e >scambio la finestra a sinistra e a destra, rispettivamente, aggiungendo la riga in basso a .tmux.conf.

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

4

La soluzione più semplice da man, è utilizzare i binding predefiniti:

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

6
le finestre e i riquadri di TMX sono diversi.
Marcello Romani,

4
Questo mi ha ancora aiutato a ottenere quello che volevo
lkraav

Questa domanda riguarda windows non riquadri
mbigras

3

Per quelli di voi che usano byobucome wrapper per tmux, è possibile scambiare la finestra corrente con la finestra precedente o successiva con:

Ctrl-Shift-F3
Ctrl-Shift-F4

L'associazione chiave definita da byobuper queste chiavi può essere interessante:

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

Sarebbe una scorciatoia per spostarsi all'interno di una determinata finestra.
Pablo A

2

L'approccio che uso combina un po 'della risposta di Ashish con quella di Piec; Ho la freccia alt-sinistra e destra legata a una rapida didascalia che sposta la finestra di una a sinistra o a destra, a meno che non sia la prima o l'ultima finestra, rispettosamente. L'ho fatto perché, quando si emette uno scambio +1 nell'ultima finestra (o si scambia -1 nella prima finestra), lo scambio continuerà comunque, invece di ricominciare da capo come ci si aspetterebbe:

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 dell'elenco:

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 un elenco di finestre che iniziano con un numero arbitrario e non hanno mai lacune.

Se stai usando l' indice di base 1 come me e non pensi di andare mai oltre le 999 finestre, puoi usare un piccolo trucco per farlo rotolare 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'

Funziona spostando temporaneamente l'ultima finestra sull'indice-0 non utilizzato e quindi chiamando move-window -r per rinumerarli a partire da 1 nuovamente. Funziona in modo simile quando si sposta la prima finestra alla fine; selezionando un numero enorme che non userai mai, si assicura che quando si sposta di nuovo la finestra di spostamento -r tutto verrà numerato come ti aspetteresti. Se ti stai chiedendo di refresh-client -S , è necessario perché a volte, mentre il riordino da move-window funzionerà correttamente, la barra di stato non si aggiornerà fino a quando non verranno apportate ulteriori modifiche. Forzando un aggiornamento della sola barra di stato (-S), si evita questo.

L'unico problema che posso trovare con questo approccio è che la finestra di scambio modificherà implicitamente l'ultima finestra utilizzata con quella con cui hai effettuato lo scambio. Quindi, se sei nella finestra # 1, passa alla finestra quattro e spostala indietro di una, scoprirai che la tua ultima finestra utilizzata è la nuova # 4 (precedentemente # 3) anziché # 1. Non sembra esserci un modo per aggirare questo.


2

puoi usare base-indexper cambiare il numero iniziale per le tue finestre. se si imposta base-indexsu 1, move-window -rrinumererà tutte le finestre a partire da 1, liberando così 0per spostare una finestra nel suo slot:

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

una volta fatto, è possibile ripristinare base-indexa 0se si desidera utilizzare move-window -rsuccessivamente senza muovere la finestra0



1

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

swap-window -s 5

  • programma della finestra 5 in vigore con il numero di vincita corrente.
  • il numero della finestra recente rimane invariato.
  • ripetere lo stesso comando tornerà allo stato precedente.

swap-window -t 5

  • programma attuale in vigore con il numero 5.
  • sostituzione recente al numero di finestra corrente.

l' numberin swap-window -s numbere -t numberpotrebbe essere sia assoluta , per esempio, 5, e relativi , ad esempio, -1, +2.

PS di seguito è un estratto del tmux statusline che illustra l'effetto diswap-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


Vedi questa risposta per una funzione bash per spostare l'intervallo di finestre tmux, ad esempio [2-5] di [0-6] finestre.
qeatzy,

1

Dalla finestra di tmux, provare quanto segue per scambiare la finestra 0 con 1:

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


0

Penso che tu voglia associare una nuova combinazione di tasti al comando 'scegli finestra'.

So che hai detto che hai già letto la pagina man, ma dovresti fare riferimento ad essa. è necessario modificare il file ~ / .tmux.conf per aggiungere un comando bind-key.

In particolare, guarda a pagina 4 di seguito.

pagina man di tmux


choose-windownon sembra spostare la finestra corrente in una nuova posizione.
dan

Inoltre, choose-windowè già vincolato a C-B w.
kynan,

0

Questo è il metodo che uso. Non è ancora possibile spostare una finestra in un indice occupato, ma è possibile spostarne una in un indice più alto (non utilizzato) e riorganizzare il gap in cui si trovava l'indice precedente.

Supponi di avere 3 finestre e desideri aggiungerne una quarta, ma nel punto in cui 3 era precedentemente.

Prima di aggiungere una nuova finestra: prefisso Tmux quindi. aprirà il comando di spostamento. Digita 4 e l'indice di 3 diventerà 4, quindi aggiungi semplicemente un'altra finestra e sarà all'indice 3 e la tua vecchia finestra rimarrà comunque all'indice 4.


Sebbene sia un suggerimento utile, questo non risponde alla domanda.
Jan Doggen,

0

Innanzitutto, apri il comando tmux premi e rilascia:

Ctrl + b 

E per cambiare la finestra reale nella finestra giusta (in ordine circolare), basta fare:

}

Per cambiare la finestra effettiva a sinistra:

{
  • Non dimenticare di usare SHIFTquando premi }o {.

2
Decisamente utile in alcuni scenari, ma questo riordina i riquadri all'interno di una finestra (anziché riordinare le finestre).
barra finale

0

Per quello che vale:

Ho hackerato questo script insieme per essere in grado di ordinare tutte le finestre in un "TUI". Elenca tutte le finestre in un file temporaneo, lo apre con l'editor predefinito (presuppone che tu abbia impostato $ EDITOR). Dopo questo è possibile riordinare le righe e dopo aver salvato e chiuso il file, le finestre vengono riordinate di conseguenza. (Questo è simile all'ordinamento di commit durante l'esecuzione 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

Probabilmente potrebbe essere migliorato molto, in particolare:

NOTA : potrebbe essere spostato in un'altra finestra dopo aver eseguito il comando.

Una gif in azione (github)


0

Nessuna delle risposte qui mi ha soddisfatto, quindi ho scritto una sceneggiatura che (in un certo senso) imita il screencomportamento di muovere la finestra tmux.

Rileva se il numero della finestra di destinazione è più piccolo del numero della finestra più piccolo o più grande del numero della finestra più grande e, in tal caso, sposta tutte le altre finestre a destra o a sinistra (rispettivamente) e le ricodifica da 1 a N in modo incrementale . Questo viene fatto con il move-windowcomando.

Se il numero di finestra si trova tra i numeri più piccoli / più grandi (cioè, presumibilmente, corrisponde a un numero di finestra esistente), li scambia semplicemente con il swap-windowcomando.

Ecco la sceneggiatura:

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

Quindi, aggiungi questa semplice associazione di tasti al tuo .tmux.conf:

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

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


0

Non è necessario per la riga di comando (che è Ctrl+ be quindi :)

Basta spostare le finestre con

Ctrl+ b+:

quindi inserisci il nuovo numero di finestra (gratuito) e premi Enter

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

(Suggerimento: assegna un nome alle finestre con Ctrl+ b+ ,se perdi traccia di quale sia quale)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.