¿Cómo puedo reordenar tmux windows?

379

En screen, Solo puedo escribir C-a :number 0 para mover una ventana a la parte superior de la lista de ventanas y empujar todas las demás ventanas hacia abajo una. ¿Cuál es la secuencia de comandos equivalente para tmux? Miré la página de manual, pero me parece confuso en este punto.

dan
fuente
80
C-b, . le permite renumerar una ventana.
isomorphismes
6
Leyendo todas las respuestas, todavía no veo una solución fácil para la pregunta del OP: cómo mover una ventana determinada a la posición 0 y desplazar el resto a la derecha. ¿Realmente tengo que cambiar manualmente cada uno para hacer esto? Solo quiero deshacer un movimiento que hice por error (y no estoy seguro de qué) y creo que moví la ventana 0 a la ventana 8 y moví todas las demás hacia la izquierda.
nealmcb
1
@nealmcb, lo más fácil que se me ocurre es establecer el índice base en 1, volver a numerar y luego mover la ventana a la ranura 0 vacía: superusuario.com/a/1155999/674549
eMBee
Por diferencia de swap-window -s number y swap-window -t number para cambiar la ventana actual, ver mi respuesta aqui .
qeatzy
Ver esta respuesta para una función bash para cambiar el rango de las ventanas tmux, por ejemplo, [2-5] de [0-6] ventanas.
qeatzy

Respuestas:

425

los swap-window El comando es lo más cercano a lo que quieres.

"Prefijo:" (que es "Ctrl-B:" por defecto) lo lleva al indicador de comando tmux. Allí entras:

swap-window -s 3 -t 1

para permitir que la ventana número 3 y la ventana número 1 intercambien sus posiciones.

Para intercambiar la ventana actual con la ventana superior, haga:

swap-window -t 0

En el caso improbable de no tener ventana en el índice 0, haga:

move-window -t 0

(Si el índice base es 0, como es por defecto).

Puede enlazar ese comando a una tecla (T para "arriba" por ejemplo) agregando lo siguiente a su ~/.tmux.conf:

bind-key T swap-window -t 0
matlehmann
fuente
4
Gracias por tu edición, pero move-window solo funciona, si no hay otra ventana en el índice dado. Así que en la mayoría de los casos, move-window -t 0 no funcionará, ya que normalmente habrá otra ventana en esa posición ya.
matlehmann
Así es, lo mejoraré.
zakkak
2
Es posible que desee echar un vistazo a movew.
Marcello Romani
2
También, bind-key L swap-window -t -1 Para que sea la última ventana.
w17t
Por diferencia de swapw -s number y swapw -t number para cambiar la ventana actual, ver mi respuesta aqui .
qeatzy
233

Agregando a la respuesta de Gareth, puedes usar los siguientes enlaces de teclas

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

Presionando Ctrl + Shift + Izquierda (moverá la ventana actual a la izquierda. Similarmente a la derecha. No es necesario usar el modificador (C-b).

Ashish Ariga
fuente
5
Esta -1 y +1 La sintaxis ayuda a resolver el problema de los índices ocupados. tmux cambiará las otras ventanas por usted y el evento se ajustará al final / comienzo automáticamente. Esta es la mejor respuesta.
brianpeiris
1
Mi incapacidad para mover fácilmente las ventanas tmux me ha estado molestando durante algunas semanas. ¡Esto hace que sea mucho más fácil tratar con las ventanas! Muchas gracias de este reciente convertidor tmux.
calvinf
8
Gran pista, prefiero bind-key S-Left swap-window -t -1, así que puedo hacer & lt; prefijo & gt; Mayús + flecha, ya que no me gusta estropear los enlaces de teclas para los programas.
demure
4
Si usa letras, debe usar una letra mayúscula y no C-S, como esto: bind-key -n C-H swap-window -t -1
Matthew Mitchell
1
También tengo algún problema con la 1.9a al usar Ashish Ariga bind-key -n C-S-Left swap-window -t -1 sin embargo, funciona bien cuando se usa el prefijo como lo sugiere @MatthewMitchell
Rho Phi
61

El tmux equivalente a :number 42 es :move-window -t 42.

Randal Schwartz
fuente
9
Esto está ligado a C-b.
vedang
1
¡Gracias! Esto es mucho mejor que la respuesta aceptada imo.
Ashe
5
@ArlenCuss En realidad, ambas respuestas son buenas y útiles. Usted ve, usando la pantalla: número que puede cambiar ventanas, usando tmux: move-window, solo puede reubicar la ventana si el índice objetivo no está en uso. Entonces, imo, tanto: swap-window como: move-window son necesarios para tomar el control de las ubicaciones de las ventanas :)
Victor Farazdagi
1
+1 por obtener una respuesta de un gurú de la programación (también por ser correcto). Esta es la única forma en que puedo hacer que funcione en una ventana activa.
engineerDave
4
de tmux :move-window es no equivalente a la pantalla :number. :number swaps si el destino existe, :move-window falla en ese caso Tienes que elegir entre :move-window y :swap-window
piec
12

Puede implementar un equivalente a screen es number comando utilizando un script de shell externo que elige entre swap-window y move-window. Puedes enlazarlo a una clave de esa manera:

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
fuente
2
Muy buena solución, funciona muy bien! Acabo de hacer ediciones menores para limpiar y eliminar el -F Opción que no es aceptada por mi versión tmux.
haridsv
10

Renumero ventanas como esta:

Ctrl + segundo , ., 222

haría la corriente tmux Ventana (todos los paneles) número 222.


Relacionado: cuando estoy barajando cosas, tiendo a querer hacer

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

y desde allí también puedo usar Ctrl + segundo , ., reading para mover la ventana actual (todos los paneles a la vez) a la sesión de lectura. Puedes navegar entre sesiones con Ctrl + segundo , s la forma en que navegarías dentro de la sesión usando Ctrl + segundo , w.

HTH

isomorphismes
fuente
8

Uso de la ventana de intercambio para moverse a cualquier ID: [más cercano a la pantalla: número]

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

[m para mover - & gt; pulsa el prefijo -m y escribe dice 3. .para renumerar la ventana a 3]

Karthik Gurusamy
fuente
1
Esto ya es bueno, pero aún mejor sería: hacer swap-window y si falla, retrocede a move-window
nisc
5

Dado que la respuesta de Ashish Ariga no funciona en la versión 1.9a y en la siguiente. yo suelo < y > para cambiar la ventana a izquierda y derecha, respectivamente, agregando la línea de abajo a .tmux.conf.

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

La solución más simple de man, es utilizar los enlaces por defecto:

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.
jhvaras
fuente
6
Las ventanas y los paneles tmux son diferentes.
Marcello Romani
3
Esto todavía me ayudó a obtener lo que quería
lkraav
Esta pregunta es sobre ventanas, no paneles.
mbigras
3

Para aquellos de ustedes que usan byobu como su envoltorio para tmux, puede intercambiar la ventana actual con la ventana anterior o siguiente con:

Ctrl-Shift-F3
Ctrl-Shift-F4

La clave de enlace definida por byobu Para estas claves puede ser de interés:

bind-key -n    C-S-F3 swap-window -t :-1
bind-key -n    C-S-F4 swap-window -t :+1
Dave Kuhlman
fuente
Sería genial un atajo para moverse por splits. en Una ventana determinada.
Pablo Bianchi
2

El enfoque que utilizo combina un poco de la respuesta de Ashish con las piezas; Tengo flechas de flecha izquierda y derecha asociadas a una pequeña y rápida llamada de shell que mueve la ventana una hacia la izquierda o hacia la derecha, a menos que sea la primera o la última ventana, respetuosamente. Hice esto porque, cuando emites un swap +1 en la última ventana (o swap -1 en la primera ventana), aún se intercambiará, en lugar de volver a dar la vuelta como se puede esperar:

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

Se convierte

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

En lugar de

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

Por lo tanto, los comandos que utilizo dejan de funcionar cuando la ventana ha llegado al borde de la 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'

Esto se puede combinar fácilmente con índice base y renumerar ventanas tener una lista de ventanas que comiencen en un número arbitrario y nunca tengan espacios vacíos.

Si estas usando índice base 1 al igual que yo y no crees que vayas a superar las 999 ventanas, puedes usar un pequeño truco para hacer que ruede correctamente, aunque los comandos se hinchan un poco:

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'

Esto funciona moviendo temporalmente la última ventana al índice-0 no utilizado y luego llamando mover ventana -r para renumerarlos a partir de 1 nuevamente. Funciona de manera similar cuando se mueve la primera ventana al final; Al elegir un número enorme que nunca usará, garantiza que cuando mover ventana -r Dispara de nuevo todo estará numerado como cabría esperar. Si te estás preguntando acerca de refresh-client -S , eso es necesario porque a veces, mientras se reordena desde ventana de movimiento funcionará correctamente, la barra de estado no se actualizará hasta que se realicen más cambios. Al forzar una actualización de solo la barra de estado (-S), evita esto.

El único problema que puedo encontrar con este enfoque es que ventana de intercambio alterará implícitamente la última ventana utilizada a la que intercambió. Por lo tanto, si está en la ventana # 1, cambie a la ventana cuatro y muévala hacia atrás una, encontrará que la última ventana utilizada es la nueva # 4 (anteriormente # 3) en lugar de la # 1. No parece haber una manera de evitar esto.

Alaska
fuente
2

control de dolor tmux proporciona ctrl-b > y ctrl-b < para mover la ventana enfocada hacia la derecha y hacia la izquierda, envolviéndola.

pepper_chico
fuente
No me funciona en tmux 2.5
Dmitry Frank
1
@DmitryFrank ops, cierto, mi mal. Fue debido a github.com/tmux-plugins/tmux-pain-control
pepper_chico
¡Gracias! Se gestionó para configurar esos dos manualmente, pero el complemento también se ve bien en otras formas.
Dmitry Frank
1

puedes usar base-index para cambiar el número inicial de sus ventanas. si establece base-index a 1, entonces move-window -r volverá a numerar todas las ventanas a partir de 1, liberando así 0 para mover una ventana a su ranura:

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

cuando termines, puedes reiniciar base-index a 0 si quieres usar move-window -r despues sin mover tu ventana a 0

eMBee
fuente
1

Ambos swap-window -s 5 y swap-window -t 5 Cambiar ventana actual con ventana 5, pero con semántica diferente.

swap-window -s 5

  • Programa de la ventana 5 vigente con el número actual de victorias.
  • el número de ventana reciente permanece sin cambios.
  • Repita el mismo comando volverá al estado anterior.

swap-window -t 5

  • Programa actual vigente con el número 5.
  • anulación reciente al número de ventana actual.

la number en swap-window -s number y -t number podría ser ambos absoluto , por ejemplo, 5, y relativo , por ejemplo, -1, +2.

PD A continuación se muestra un extracto de la línea de estado de tmux que ilustra el efecto de swap-window -s 5

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

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

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

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

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

qeatzy
fuente
Ver esta respuesta para una función bash para cambiar el rango de las ventanas tmux, por ejemplo, [2-5] de [0-6] ventanas.
qeatzy
1

Desde la ventana de tmux, intente lo siguiente para cambiar la ventana 0 por 1:

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

Hamdi Al-Haj
fuente
0

Creo que desea vincular una nueva combinación de teclas al comando 'elegir ventana'.

Sé que dijiste que ya habías leído la página del manual, pero deberías consultarla. necesita modificar su archivo ~ / .tmux.conf para agregar un comando de vinculación.

Específicamente, mira la página 4 de lo siguiente.

página del manual de tmux


fuente
choose-window No parece mover la ventana actual a una nueva posición.
dan
También, choose-window ya está obligado a C-B w.
kynan
0

Este es el método que utilizo. Aún no puede mover una ventana a un índice ocupado, pero puede mover una a un mayor (índice no utilizado) y reorganizar en el espacio donde estaba el índice anterior.

Supongamos que tiene 3 ventanas y desea agregar una cuarta pero en el lugar donde anteriormente estaba 3.

Antes de agregar una nueva ventana: Tmux prefijo entonces. se abrirá el comando de movimiento. Escriba 4 y el índice de 3 ahora se convertirá en 4, luego simplemente agregue otra ventana y estará en el índice 3 y su ventana anterior seguirá en el índice 4.

mattLummus
fuente
Aunque es un consejo útil, esto no es responder a la pregunta.
Jan Doggen
0

Primero, abra el comando tmux presione y suelte:

Ctrl + b 

Y para cambiar la ventana real a la ventana derecha (en orden circular), simplemente haga lo siguiente:

}

Para cambiar la ventana real a la izquierda:

{
  • No te olvides de usar SHIFT cuando presione } o {.
Jonatas Eduardo Salgado
fuente
2
Definitivamente útil en algunos escenarios, pero esto reorganiza los paneles dentro de una ventana (en lugar de reordenar ventanas).
trailing slash
0

Por lo que vale:

Hacké este script juntos para poder ordenar todas las ventanas en un "TUI". Enumera todas sus ventanas en un archivo temporal, lo abre con su editor predeterminado (asume que ha establecido $ EDITOR). Después de esto, puede reordenar las líneas y después de guardar y cerrar el archivo, las ventanas se reordenarán de acuerdo con esto. (Esto es similar a ordenar compromisos cuando se hace 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

Probablemente se podría mejorar mucho, en particular:

NOTA : Es posible que se mueva a otra ventana después de ejecutar el comando.

Un gif de ella en acción (github)

steinar
fuente
0

Ninguna de las respuestas aquí me ha satisfecho, así que escribí un guión que (similar a) imita al screen comportamiento de movimiento de la ventana para tmux.

Detecta si el número de la ventana de destino es menor que el número de ventana más pequeño o más grande que el número de ventana más grande, y si es así, desplaza todas las demás ventanas a la derecha o izquierda (respectivamente) y las vuelve a numerar desde 1-N de manera incremental. Esto se hace con la move-window mando.

Si el número de la ventana es entre los números más pequeños / más grandes (es decir, presumiblemente, coinciden con un número de ventana existente), simplemente los intercambia con el swap-window mando.

Aquí está el guión:

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

Luego, simplemente agregue este enlace simple a su .tmux.conf:

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

Nota : Para imitar perfectamente screen comportamiento de cambio de ventana, creo que cuando mueves una ventana a una existente número de ventana, debe tomar el lugar de esa ventana y todas las demás ventanas se empujan hacia el Correcto . Sería bastante sencillo modificar este script para hacerlo.

Luke Davis
fuente