Pregunta ¿Cómo reordenar las ventanas de tmux?


En screen, Puedo simplemente escribir C-a :number 0 para mover una ventana a la parte superior de la lista de ventanas y empujar todas las otras ventanas hacia abajo una. ¿Cuál es la secuencia de comando equivalente para tmux? Miré la página del manual, pero me resulta confuso en este punto.


357


origen


C-b, . te permite renumerar una ventana. - isomorphismes
Al leer todas las respuestas, todavía no veo una solución fácil para la pregunta del OP: cómo mover una ventana dada a la posición 0 y desplazar todo el resto hacia 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é) que creo movió la ventana 0 a la ventana 8 y desplazó a todos los demás hacia la izquierda. - nealmcb
@nealmcb lo más fácil que se me ocurre es establecer el índice base en 1, renumerar y luego mover la ventana al vacío 0: superuser.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 aquí. - qeatzy
Ver esta respuesta para una función bash para cambiar el rango de ventanas de tmux, por ejemplo, [2-5] de [0-6] ventanas. - qeatzy


Respuestas:


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

"Prefijo:" (es decir, "Ctrl-B:" de manera predeterminada) lo lleva al indicador de comandos de tmux. Ahí ingresas:

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 lo siguiente:

swap-window -t 0

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

move-window -t 0

(si el índice base es 0, como es de manera predeterminada).

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

bind-key T swap-window -t 0

397



Gracias por su edición, pero move-window solo funciona, si no hay otra ventana en el índice dado. Entonces, en la mayoría de los casos, move-window -t 0 no funcionará, ya que normalmente habrá otra ventana en esa posición. - matlehmann
Así es, lo mejoraré. - zakkak
Es posible que desee echar un vistazo a movew. - Marcello Romani
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 aquí. - qeatzy


Añadiendo a la respuesta de Gareth, puede usar las siguientes combinaciones de teclas

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

Al presionar Ctrl + Shift + Left (moverá la ventana actual a la izquierda. Del mismo modo, a la derecha. No es necesario usar el modificador (C-b).


210



Esta -1 y +1 la sintaxis ayuda a resolver el problema de los índices ocupados. tmux cambiará las otras ventanas por usted y se ajustará al final / comenzando automáticamente. Esta es la mejor respuesta. - brianpeiris
Esto es piadoso! Gracias. - Bruno Buccolo
Mi incapacidad para mover fácilmente las ventanas de tmux me ha estado molestando por unas semanas. ¡Esto hace que sea mucho más fácil lidiar con las ventanas! Muchas gracias de esta reciente conversión de tmux. - calvinf
Gran pista, prefiere bind-key S-Left swap-window -t -1, así que puedo hacer <prefix> shift + arrow, ya que no me gusta estropear enlaces clave para programas. - demure
Si usa letras, debe usar una letra mayúscula y no C-S, como esta: bind-key -n C-H swap-window -t -1 - Matthew Mitchell


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


60



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


Puede implementar un equivalente a screenes number comando utilizando un script de shell externo que elige entre swap-window y move-window. Puede vincularlo 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

12



Muy buena solución, ¡funciona genial! Solo hice ediciones menores para la limpieza y eliminé -F opción que no es aceptada por mi versión de tmux. - haridsv


Vuelvo a numerar ventanas como esta:

Ctrl+segundo, ., 222

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


Relacionado: Cuando estoy barajando las 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. Puede navegar entre sesiones con Ctrl+segundo, s la forma en que navegaría dentro de la sesión usando Ctrl+segundo, w.

HTH


10





Usando 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 -> presionar prefijo-m e ingresar decir 3. .para renumerar la ventana a 3]


8



Esto ya es bueno, pero aún mejor sería: haga swap-window y, si falla, vuelva a mover-ventana - nisc


Dado que la respuesta de Ashish Ariga no funciona en la versión 1.9ay siguientes. yo suelo < y > para intercambiar 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

5





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

Ctrl-Shift-F3
Ctrl-Shift-F4

El enlace de clave definido 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

3



Sería un excelente atajo para moverse por las divisiones en una cierta ventana. - Pablo Bianchi


El enfoque que uso combina un poco de la respuesta de Ashish con la de Piec; Tengo las flechas alt-left y right atadas a un pequeño rótulo que mueve la ventana hacia la izquierda o hacia la derecha, a menos que sea la primera o la última ventana, respetuosamente. Hice esto porque, cuando se emite un intercambio +1 en la última ventana (o se intercambia -1 en la primera ventana), se seguirá intercambiando, en lugar de volver a funcionar como cabría 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

Entonces, los comandos que uso 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 comienzan en un número arbitrario y nunca tienen vacíos.

Si estás usando índice base 1 como yo, y no creo que vayas a superar las 999 ventanas, puedes usar un pequeño truco para hacerlo rodar correctamente, aunque los comandos se ablandan 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 sin usar y luego llamando mover-ventana -r para renumerarlos comenzando desde 1 nuevamente. Funciona de manera similar cuando se mueve la primera ventana hasta el final; al elegir un número enorme que nunca usarás, se asegura de que cuando mover-ventana -r dispara de nuevo, todo estará numerado como esperarías. Si te estás preguntando sobre cliente de actualización -S, eso es necesario porque a veces, mientras el reordenamiento de mover-ventana 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 usada a la que intercambió. Por lo tanto, si se encuentra en la ventana n. ° 1, cambie a la ventana cuatro y vuelva a colocarla, encontrará que la última ventana utilizada es la nueva n. ° 4 (antes n. ° 3) en lugar de n. ° 1. No parece haber una forma de evitar esto.


2





La solución más simple de man, es usar los enlaces predeterminados:

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

1



Las ventanas y los paneles de tmux son diferentes. - Marcello Romani
Esto todavía me ayudó a obtener lo que quería - lkraav
Esta pregunta es sobre ventanas no cristales - mbigras