Como eu reorganizo as janelas tmux?

374

Em screen , posso digitar C-a :number 0 para mover uma janela para o topo da lista de janelas e empurrar todas as outras janelas para baixo. Qual é a sequência de comando equivalente para tmux ? Eu olhei para a página do manual, mas estou achando confuso neste ponto.

    
por dan 02.02.2011 / 20:53

19 respostas

417

O comando swap-window está mais próximo do que você deseja.

"Prefixo:" (isto é, "Ctrl-B:" por padrão) leva você ao prompt do comando tmux. Lá você entra:

swap-window -s 3 -t 1

para permitir que a janela número 3 e a janela número 1 troquem suas posições.

Para trocar a janela atual com a janela superior, faça:

swap-window -t 0

No caso improvável de não ter nenhuma janela no índice 0, faça:

move-window -t 0

(se o índice-base for 0, como é por padrão).

Você pode vincular esse comando a uma chave (T para "top", por exemplo) adicionando o seguinte ao seu ~/.tmux.conf :

bind-key T swap-window -t 0
    
por 01.03.2011 / 10:39
224

Somando-se à resposta de Gareth, você pode usar os seguintes atalhos de teclado

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

Pressionando Ctrl + Shift + Esquerda (moverá a janela atual para a esquerda. Similarmente, não há necessidade de usar o modificador (C-b).

    
por 15.02.2013 / 12:18
60

O equivalente do tmux a :number 42 é :move-window -t 42 .

    
por 06.04.2011 / 00:12
12

Você pode implementar um equivalente ao comando screen ' number usando um script de shell externo que escolhe entre swap-window e move-window . Você pode vinculá-lo a uma chave dessa maneira:

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
    
por 16.04.2012 / 17:42
10

Eu renumino janelas assim:

Ctrl + b , . , 222

tornaria a atual janela tmux (todos os painéis) número 222.

Relacionado: quando estou embaralhando as coisas, tenho a tendência de querer fazer

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

e a partir daí eu também posso usar Ctrl + b , . , reading para mover a janela atual (todos os painéis de uma só vez) para a leitura sessão. Você pode navegar entre as sessões com Ctrl + b , s a maneira de navegar dentro da sessão usando Ctrl + b , w .

HTH

    
por 10.07.2013 / 00:16
8

Usando a janela de troca para mover para qualquer ID: [mais próximo da tela: número]

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

[m para movimento - > pressione o prefixo-m e digite digamos 3. .para renumerar a janela para 3]

    
por 12.12.2011 / 04:13
5

Desde que a resposta de Ashish Ariga não funciona na versão 1.9a e abaixo. Eu uso < e > para trocar a janela para esquerda e direita, respectivamente, adicionando a linha abaixo para .tmux.conf .

# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1
    
por 18.03.2016 / 18:08
3

Para aqueles de vocês que usam byobu como seu wrapper para o tmux, você pode trocar a janela atual com a janela anterior ou seguinte com:

Ctrl-Shift-F3
Ctrl-Shift-F4

A ligação de chave definida por byobu para essas chaves pode ser de interesse:

bind-key -n    C-S-F3 swap-window -t :-1
bind-key -n    C-S-F4 swap-window -t :+1
    
por 26.01.2016 / 01:48
2

A abordagem que eu uso combina um pouco da resposta de Ashish com piec; Eu tenho a seta para a esquerda e para a direita ligada a um pequeno texto explicativo que move a janela uma para a esquerda ou para a direita, a menos que seja a primeira ou a última janela, respeitosamente. Eu fiz isso porque, quando você emite uma troca +1 na última janela (ou troca -1 na primeira janela), ela ainda irá trocar, em vez de voltar ao normal novamente como você poderia esperar:

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

Torna-se

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

Em vez de

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

Assim, os comandos que uso param de funcionar quando a janela atinge a borda da 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'

Isso pode ser facilmente combinado com base-index e renumber-windows para ter uma lista de janelas que iniciam em um número arbitrário e nunca tem lacunas.

Se você está usando o base-index 1 como eu e você não acha que vai ficar acima de 999 janelas, você pode usar um pequeno truque para fazê-lo rodar corretamente, embora os comandos inchaço um pouco:

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'

Isso funciona movendo temporariamente a última janela para o índice 0 não utilizado e, em seguida, chamando move-window -r para renumerá-los a partir de 1 novamente. Ele funciona de maneira semelhante ao mover a primeira janela até o fim; escolhendo um número enorme que você nunca usará, isso garante que quando move-window -r for acionado novamente, tudo será numerado como esperado. Se você está se perguntando sobre o refresh-client -S , isso é necessário porque, às vezes, enquanto a reordenação de janela de movimentação funcionará corretamente, a barra de status não será atualizada até mais alterações são feitas. Ao forçar uma atualização apenas da barra de status (-S), você evita isso.

O único problema que posso encontrar com essa abordagem é que swap-window irá implicitamente alterar a última janela usada para a que você trocou. Assim, se você estiver na janela # 1, mude para a janela quatro e mova-a de volta, você verá que sua última janela usada é a nova # 4 (anteriormente # 3) em vez de # 1. Não parece haver uma maneira de contornar isso.

    
por 24.06.2013 / 22:29
2

A solução mais simples de man é usar as ligações padrão:

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.
    
por 09.02.2015 / 13:34
1

você pode usar base-index para alterar o número inicial de suas janelas. se você definir base-index para 1 , então move-window -r renumerará todas as janelas a partir de 1 , liberando 0 para mover uma janela para seu slot:

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

quando terminar, você poderá redefinir base-index a 0 se quiser usar move-window -r mais tarde sem mover sua janela para 0

    
por 13.12.2016 / 07:50
1

Ambos swap-window -s 5 e swap-window -t 5 trocam a janela atual com a janela 5, mas com semânticas diferentes.

swap-window -s 5

  • programa da janela 5 em vigor com o número atual de vitórias.
  • O
  • número da janela recente permanece inalterado.
  • repita o mesmo comando para voltar ao estado anterior.

swap-window -t 5

  • programa atual em vigor com o número 5.
  • substituição recente para o número da janela atual.

os number em swap-window -s number e -t number podem ser absolutos , por exemplo, 5 e relativos , por exemplo, -1, +2.

P.S. abaixo é um trecho da linha de status do tmux ilustrando o efeito de swap-window -s 5

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

agora, depois de last-window :% [0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

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

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

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

    
por 07.10.2017 / 10:44
1

tmux-pain-control fornece ctrl-b > e ctrl-b < para mover a janela focada para a direita e à esquerda, enrolando.

    
por 29.12.2016 / 19:30
1

Na janela do tmux, tente o seguinte para trocar a janela 0 por 1:

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

    
por 05.07.2018 / 00:36
0

Acho que você deseja vincular uma nova combinação de teclas ao comando 'choose-window'.

Eu sei que você disse que já leu a página man, mas você deve se referir a ela. você precisa modificar seu arquivo ~ / .tmux.conf para adicionar um comando de chave de ligação.

Especificamente, veja a página 4 dos seguintes itens.

página do manual do tmux

    
por 02.02.2011 / 21:11
0

Este é o método que eu uso. Você ainda não pode mover uma janela para um índice ocupado, mas pode mover um para um índice mais alto (sem uso) e reorganizar o espaço onde o índice anterior estava.

Digamos que você tenha 3 janelas e queira adicionar uma quarta, mas no lugar onde 3 estava anteriormente.

Antes de adicionar uma nova janela: Prefixo Tmux então. irá abrir o comando de movimento. Digite 4 e o índice de 3 agora se tornará 4, depois simplesmente adicione outra janela e ela estará no índice 3 e sua janela antiga ainda estará no índice 4.

    
por 31.10.2014 / 16:53
0

Primeiro, abra o comando tmux pressione e solte:

Ctrl + b 

E para alterar a janela real para a janela direita (em ordem circular), basta fazer:

}

Para alterar a janela real para a esquerda:

{
  • Não se esqueça de usar SHIFT quando pressionar } ou { .
por 15.05.2016 / 16:31
0

Por que vale a pena:

Eu hackeei este script para poder pedir todas as janelas em um "TUI". Ele lista todas as suas janelas em um arquivo temporário, abre-o com seu editor padrão (assume que você definiu $ EDITOR). Depois disso, você pode reordenar as linhas e depois de salvar e fechar o arquivo, as janelas são reordenadas de acordo. (Isso é semelhante a fazer commits ao fazer 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

Provavelmente poderia ser melhorado muito, em particular:

NOTE : Você pode ser movido para outra janela depois de executar o comando.

Um gif dele em ação (github)

    
por 14.09.2017 / 12:58
0

Nenhuma das respostas aqui me satisfez, então escrevi um script que (tipo) imita o comportamento de movimentação de janelas screen para tmux .

Ele detecta se o número da janela de destino é menor que o menor número de janela ou maior do que o maior número de janela, e se sim, desloca todas as outras janelas para o direita ou esquerda (respectivamente) e renumerá-los para 1-N incrementalmente. Isso é feito com o comando move-window .

Se o número da janela for intermediário , os números menores / maiores (ou seja, corresponderão a um número de janela existente), apenas os alterna com o comando swap-window .

Aqui está o 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

Em seguida, basta adicionar essa simples associação de chave ao seu .tmux.conf :

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

Observação : para imitar perfeitamente o comportamento de troca de janela screen , acredito que quando você move uma janela para um número de janela existente , ele deve ocupar o lugar dessa janela todas as outras janelas são empurradas para o direito . Seria bastante simples modificar esse script para fazer isso.

    
por 22.05.2018 / 22:05

Tags