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

¿Cómo puedo 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 demás ventanas hacia abajo una. ¿Cuál es la secuencia de comandos equivalente para tmux? He mirado la página del manual, pero me resulta confusa en este punto.

Respuestas (19)

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

El comando swap-window es el que más se acerca a lo que quieres.

“Prefijo :” (es decir, Ctrl+B, : por defecto) te lleva al prompt del comando tmux. Allí se introduce:

swap-window -s 3 -t 1

para 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 improbable caso de no tener ninguna ventana en el índice 0, haga:

move-window -t 0

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

Puede vincular ese comando a una tecla (T para “top”, por ejemplo) añadiendo lo siguiente a su ~/.tmux.conf:

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

Además de la respuesta de Gareth, puedes utilizar 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

Pulsar Ctrl+Mayús+Izquierda (moverá la ventana actual a la izquierda. Del mismo modo, a la derecha. No es necesario utilizar el modificador (C-b).

Para la versión tmux 3.0, debe utilizar las siguientes combinaciones de teclas

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

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

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

Yo renumero las ventanas así:

Ctrl+b, ., 222

haría que la ventana actual tmux (todos los paneles) tuviera el número 222.


En relación con esto: Cuando estoy barajando cosas tiendo a querer hacer

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

y desde ahí también puedo usar Ctrl+b, ., reading para mover la ventana actual (todos los paneles a la vez) a la sesión de lectura. Puedes navegar entre sesiones con Ctrl+b, s de la misma manera que lo harías dentro de una sesión usando Ctrl+b, w.

HTH

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

Puedes implementar un equivalente al comando screen de number utilizando un script de shell externo que elija entre swap-window y move-window. Puedes vincularlo a una tecla de esta 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
8
8
8
2011-12-12 03:13:19 +0000

Usando swap-window para mover a cualquier id: [lo más cercano al :número de la pantalla]

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

[m para mover –> pulsar prefijo-m e introducir digamos 3 . .para renumerar la ventana a 3]

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

Ya que la respuesta de Ashish Ariga no funciona en la versión 1.9a e inferior. Utilizo < y > para intercambiar la ventana a la izquierda y a la derecha, respectivamente, añadiendo la línea siguiente 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 solución más sencilla a partir de man, es utilizar los bindings por defecto:

{ 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

Para aquellos que usen byobu como su wrapper para tmux, pueden intercambiar la ventana actual con la anterior o la siguiente con:

Ctrl-Shift-F3
Ctrl-Shift-F4

La unión de teclas definida por byobu para estas teclas 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
2
2
2
2016-12-13 06:50:32 +0000

puedes usar base-index para cambiar el número de inicio de tus ventanas. si pones base-index en 1, entonces move-window -r renumerará todas las ventanas empezando en 1, liberando así 0 para mover una ventana a su ranura:

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

cuando termine, podría restablecer base-index a 0 si quiere usar move-window -r más tarde sin mover su ventana a 0

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

tmux-pain-control proporciona ctrl-b > y ctrl-b < para mover la ventana enfocada a la derecha y a la izquierda, envolviendo.

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

El enfoque que utilizo combina un poco la respuesta de Ashish con la de piec; tengo las flechas alt-izquierda y derecha vinculadas a una pequeña y rápida llamada de shell que mueve la ventana una a la izquierda o a la derecha, a menos que sea la primera o la última ventana, respectivamente. Hice esto porque, cuando emites un swap +1 en la última ventana (o swap -1 en la primera ventana), seguirá intercambiando, en lugar de volver a hacer un bucle como podrías esperar:

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

Se convierte en

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

En lugar de

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

Así, 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 base-index y renumber-windows para tener una lista de ventanas que empiece en un número arbitrario y que nunca tenga huecos.

Si estás usando base-index 1 como yo y no crees que vayas a pasar nunca de 999 ventanas, puedes usar un pequeño truco para 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 a move-window -r para volver a numerarlas empezando por el 1. Funciona de forma similar cuando se mueve la primera ventana al final; escogiendo un número enorme que nunca se usará, se asegura que cuando move-window -r se dispara de nuevo todo estará numerado como se espera. Si te preguntas por refresh-client -S , es necesario porque a veces, mientras la reordenación de move-window funciona correctamente, la barra de estado no se actualiza hasta que se hacen más cambios. Al forzar un refresco sólo de la barra de estado (-S), se evita esto.

El único problema que puedo encontrar con este enfoque es que swap-window alterará implícitamente la última ventana utilizada a la que se intercambió. Así, si estás en la ventana #1, cambias a la ventana cuatro y la mueves hacia atrás una, encontrarás que tu última ventana usada es la nueva #4 (antes #3) en lugar de la #1. No parece haber una forma de evitar esto.

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

Tanto swap-window -s 5 como swap-window -t 5 intercambian la ventana actual con la ventana 5, pero con diferente semántica.

swap-window -s 5

  • programa de ventana 5 en efecto con el número de ventana actual.
  • el número de ventana reciente permanece sin cambios.
  • repetir el mismo comando hará retroceder al estado anterior.

swap-window -t 5

  • programa actual en efecto con el número 5.
  • anulación reciente al número de ventana actual.

los number en swap-window -s number y -t number pueden ser tanto absolutos, por ejemplo, 5, como relativos, por ejemplo, -1, +2.

P.D. 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, después de last-window:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

después de 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

1
1
1
2018-07-04 22:36:52 +0000

Desde la ventana tmux, intente lo siguiente para intercambiar la ventana 0 con la 1:

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

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

Primero, abra el comando tmux pulse y suelte:

Ctrl + b

Y para cambiar la ventana actual a la ventana de la derecha (en orden circular), basta con hacer:

}

Para cambiar la ventana actual a la izquierda:

{
  • No olvides usar SHIFT cuando pulses } o {.
0
0
0
2017-09-14 10:58:56 +0000

Por si sirve de algo:

He hackeado este script para poder ordenar todas las ventanas en un “TUI”. Enumera todas tus ventanas en un archivo temporal, lo abre con tu editor por defecto (asume que has puesto $EDITOR). Después de esto puedes reordenar las líneas y después de guardar y cerrar el archivo, las ventanas se reordenan en consecuencia. (Esto es similar al ordenamiento de los commits 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 te cambien de ventana después de ejecutar el comando. Un gif de ello en acción (github)

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

Ninguna de las respuestas aquí me satisfizo, así que escribí un script que (más o menos) imita el comportamiento de movimiento de ventanas de screen.

Detecta si el número de la ventana de destino es más pequeño que el número de la ventana más pequeña o más grande que el número de la ventana más grande, y si es así, empuja todas las demás ventanas a la derecha o a la izquierda (respectivamente) y las renumera de 1 a N incrementalmente. Esto se hace con el comando tmux.

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

Aquí está el 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

Luego, sólo tienes que añadir esta simple unión de teclas a tu swap-window:

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

Nota : Para imitar perfectamente el comportamiento de intercambio de ventanas del .tmux.conf, creo que cuando mueves una ventana a un número de ventana existente, debería ocupar el lugar de esa ventana y todas las demás ventanas son empujadas a la derecha. Sería bastante sencillo modificar este script para hacerlo.

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

Este es el método que yo utilizo. Todavía no puedes mover una ventana a un índice ocupado, pero puedes mover una a un índice más alto (no utilizado) y reorganizar en el hueco donde estaba el índice anterior.

Digamos que tienes 3 ventanas y quieres añadir una cuarta pero en el lugar donde antes estaba la 3.

Antes de añadir una nueva ventana: El prefijo Tmux y luego . abrirá el comando mover. Escriba 4 y el índice de 3 se convertirá ahora en 4, entonces simplemente añada otra ventana y estará en el índice 3 y su antigua ventana seguirá estando en el índice 4.

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

No es necesario usar la línea de comandos (que es Ctrl + b y luego :)

Simplemente mueva sus ventanas con

Ctrl + b + :

luego introduzca el nuevo número de ventana (libre) y pulse Enter

Si ahora hay un número de ventana libre, use Ctrl + b + . para renumerar una ventana.

(Consejo: nombra tus ventanas con Ctrl + b + , si pierdes la noción de cuál es cuál)