Como reordenar o tmux windows?

413

Em screen, posso apenas digitar C-a :number 0para mover uma janela para o topo da lista de janelas e empurrar todas as outras janelas para baixo uma. Para que serve a sequência de comandos equivalente tmux? Eu olhei para a página de manual, mas acho isso confuso neste ponto.

dan
fonte
95
C-b, .permite renumerar uma janela.
Isomorphismes
7
Lendo todas as muitas respostas, ainda não vejo uma solução fácil para a pergunta do OP: como mover uma determinada janela para a posição 0 e deslocar todo o resto para a direita. Eu realmente tenho que mudar manualmente cada um para fazer isso? Eu só quero desfazer uma jogada que fiz por engano (e não tenho certeza do que) que acho que moveu a janela 0 para a janela 8 e mudou todas as outras para a esquerda.
Ndmcb
1
@nealmcb, o mais fácil que eu consegui é definir o índice base como 1, renumerar e mover sua janela para o slot 0 vazio: superuser.com/a/1155999/674549
eMBee
Para diferença de swap-window -s numbere swap-window -t numberpara trocar a janela atual, veja minha resposta aqui .
qeatzy
Veja esta resposta para uma função bash para mudar o intervalo das janelas tmux, por exemplo, [2-5] das [0-6] janelas.
Qeatzy # 7/17

Respostas:

467

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

"Prefixo:" (ou seja , Ctrl+ B, :por padrão) leva você ao prompt de comando do 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 de posição.

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

swap-window -t 0

No caso improvável de não ter 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
Matlehmann
fonte
6
Obrigado pela sua edição, mas move-windowsó funciona se não houver outra janela no índice fornecido. Portanto, na maioria dos casos, move-window -t 0não funcionará, pois geralmente já haverá outra janela nessa posição.
matlehmann
É isso mesmo, eu vou melhorar.
zakkak
2
Você pode querer dar uma olhada movew.
Marcello Romani
3
Além disso, bind-key L swap-window -t -1para torná-lo a última janela.
Para diferença de swapw -s numbere swapw -t numberpara trocar a janela atual, veja minha resposta aqui .
qeatzy
257

Adicionando à resposta de Gareth, você pode usar as seguintes teclas de atalho

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

Pressionar Ctrl + Shift + Esquerda (moverá a janela atual para a esquerda. Igualmente à direita. Não há necessidade de usar o modificador (Cb).

Ashish Ariga
fonte
9
Essa sintaxe -1e +1ajuda a resolver o problema dos índices ocupados. O tmux mudará as outras janelas para você e o evento terminará automaticamente até o fim / começo. Esta é a melhor resposta.
Brianpeiris 10/10
1
Minha incapacidade de mover facilmente as janelas do tmux está me incomodando há algumas semanas. Isso torna muito mais fácil lidar com as janelas! Muito obrigado por este recente tmux convert.
calvinf
8
Ótima dica, prefiro bind-key S-Left swap-window -t -1, para que eu possa fazer <prefixo> shift + arrow, pois não gosto de bagunçar as teclas para programas.
recatada
4
Se estiver usando letras, você precisará usar uma letra maiúscula e não CS, assim:bind-key -n C-H swap-window -t -1
Matthew Mitchell
1
Eu tenho algum problema em 1.9a bem ao usar Ashish Ariga bind-key -n C-S-Left swap-window -t -1no entanto, funciona ok quando se utiliza o prefixo como sugerido por @MatthewMitchell
Rho Phi
63

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

Randal Schwartz
fonte
9
Isso está vinculado a Cb.
vedang
1
Obrigado! Isso é muito melhor do que a resposta aceita imo.
Ashe
5
@ArlenCuss Na verdade, ambas as respostas são boas e úteis. Você vê, usando o screen: number que você poderia trocar de janelas, usando o tmux's: move-window, você só pode realocar a janela se o índice de destino não estiver em uso. Então, imo, ambos: swap-window e: move-window são necessários para controlar o local das janelas :) #
Victor Farazdagi 20/12/12
1
+1 para obter uma resposta de um guru da programação (também por estar correto). Esta é a única maneira que eu poderia fazê-lo funcionar em uma janela ativa
engineerDave
4
O tmux não:move-window é equivalente ao da tela . troca se o destino existe, falha nesse caso. Você tem que escolher entre e:number:number:move-window:move-window:swap-window
piec
15

Renumero janelas como esta:

Ctrl+ b, .,222

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


Relacionado: Quando estou mexendo nas coisas, tenho tendência a querer fazer

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

e de lá eu também pode usar Ctrl+ b, ., readingpara mover a janela atual (todos os painéis de uma vez) até a sessão de leitura. Você pode navegar entre as sessões com Ctrl+ b, sa maneira que você navegue dentro de sessão usando Ctrl+ b, w.

HTH

isomorfismos
fonte
12

Você pode implementar um equivalente ao comando screens numberusando um script de shell externo que escolha entre swap-windowe 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
piec
fonte
2
Solução muito boa, funcionando muito bem! Acabei de fazer pequenas edições na limpeza e removi a -Fopção que não é aceita pela minha versão do tmux.
haridsv
8

Usando swap-window 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 mover -> pressione prefixo-m e digite digamos 3. .para renumerar a janela para 3]

Karthik Gurusamy
fonte
1
Isso já é bom, mas ainda melhor seria: faça swap-window e, se falhar, volte para move-window
nisc
5

Como 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 a .tmux.conf.

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

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.
jhvaras
fonte
6
As janelas e os painéis do tmux são diferentes.
Marcello Romani
4
Isso ainda me ajudou a conseguir o que eu queria
lkraav
Esta pergunta é sobre o Windows não Panes
mbigras
3

Para aqueles que usam byobucomo wrapper para tmux, você pode trocar a janela atual pela janela anterior ou seguinte por:

Ctrl-Shift-F3
Ctrl-Shift-F4

A ligação de chave definida por byobupara 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
Dave Kuhlman
fonte
Seria ótimo um atalho para mover divisões em uma determinada janela.
Pablo A
2

A abordagem que utilizo combina um pouco da resposta de Ashish com a de partes; Eu tenho as setas alt-esquerda e direita ligadas a um pequeno texto explicativo rápido que move a janela uma para a esquerda ou 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 será trocada, em vez de retornar novamente como você pode esperar:

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

Torna-se

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

Ao invés de

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

Portanto, os comandos que eu 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 índice base e renumerar janelas para ter uma lista de janelas que começam com um número arbitrário e nunca apresentam lacunas.

Se você estiver usando o índice-base 1 como eu e nunca achar que ultrapassará 999 janelas, poderá usar um pequeno truque para fazê-lo funcionar corretamente, embora os comandos inchem 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. Funciona de maneira semelhante ao mover a primeira janela para o final; escolhendo um número enorme que você nunca usará, garante que, quando o movimento-janela -r for acionado novamente, tudo será numerado como você esperaria. Se você está se perguntando sobre o refresh-client -S , isso é necessário porque, às vezes, enquanto a reordenação da janela de movimentação funcionará corretamente, a barra de status não será atualizada até que novas alterações sejam 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 a janela de troca alterará implicitamente a última janela usada para a que você trocou. Portanto, se você estiver na janela nº 1, alterne para a janela quatro e mova-a para trás uma, você verá que sua última janela usada é o novo nº 4 (anteriormente nº 3) em vez de nº 1. Não parece haver uma maneira de contornar isso.

Alasca
fonte
2

Você pode usar base-indexpara alterar o número inicial das janelas. se você definir base-indexcomo 1, move-window -rrenumerará todas as janelas a partir de 1, liberando assim 0uma janela para o slot:

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

Quando terminar, você poderá redefinir base-indexpara 0se quiser usar move-window -rmais tarde sem mover a janela em0

eMBee
fonte
2

O tmux-pain-control fornece ctrl-b >e ctrl-b <move a janela focada para a direita e esquerda, contornando.

pepper_chico
fonte
Não funciona para mim no tmux 2.5 #
Dmitry Frank
1
@DmitryFrank ops, certo, meu mal. Isso ocorreu devido ao github.com/tmux-plugins/tmux-pain-control
pepper_chico
Obrigado! Conseguiu configurar esses dois manualmente, mas o plugin também parece bom de outras maneiras.
Dmitry Frank
1

Ambos swap-window -s 5e swap-window -t 5trocam a janela atual pela 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 recente da janela permanece inalterado.
  • repita o mesmo comando reverterá para o 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.

o numberin swap-window -s numbere -t numberpoderia ser tanto absoluto , por exemplo, 5, e relativo , por exemplo, -1, +2.

O PS abaixo é um trecho da tmux statusline que ilustra o efeito deswap-window -s 5

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

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

depois de 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

qeatzy
fonte
Veja esta resposta para uma função bash para mudar o intervalo das janelas tmux, por exemplo, [2-5] das [0-6] janelas.
qeatzy
1

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

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

Hamdi Al-Haj
fonte
0

Eu acho que você deseja vincular uma nova combinação de teclas ao comando 'escolher janela'.

Sei que você disse que já leu a página de manual, mas deve voltar a ela. você precisa modificar o arquivo ~ / .tmux.conf para adicionar um comando bind-key.

Especificamente, veja a página 4 do seguinte.

página de manual do tmux


fonte
choose-windowparece não mover a janela atual para uma nova posição.
dan
Além disso, choose-windowjá está vinculado a C-B w.
Kynan
0

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

Digamos que você tenha 3 janelas e queira adicionar uma quarta, mas no local em que 3 estavam anteriormente.

Antes de adicionar uma nova janela: Prefixo do Tmux então. irá abrir o comando mover. Digite 4 e agora o índice 3 se tornará 4; em seguida, basta adicionar outra janela e ele estará no índice 3 e sua janela antiga ainda estará no índice 4.

mattLummus
fonte
Embora seja uma dica útil, isso não está respondendo à pergunta.
Jan Doggen
0

Primeiro, abra o comando tmux, pressione e libere:

Ctrl + b 

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

}

Para alterar a janela real para a esquerda:

{
  • Não se esqueça de usar SHIFTquando pressionar }ou {.
Jonatas Eduardo Salgado
fonte
2
Definitivamente útil em alguns cenários, mas isso reorganiza os painéis dentro de uma janela (em vez de reordenar as janelas).
barra final 17/10
0

Pelo que vale a pena:

Eu cortei esse script juntos para poder ordenar todas as janelas em uma "TUI". Ele lista todas as suas janelas em um arquivo temporário, abre-o com o editor padrão (assume que você configurou $ 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 solicitar confirmações 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:

NOTA : Você pode ser movido para outra janela após executar o comando.

Um gif dele em ação (github)

steinar
fonte
0

Nenhuma das respostas aqui me satisfez, então escrevi um script que (mais ou menos) imita o screencomportamento de mover a janela tmux.

Ele detecta se o número da janela de destino é menor que o menor ou maior que o maior e, nesse caso, desloca todas as outras janelas para a direita ou esquerda (respectivamente) e as renomeia para 1-N incrementalmente . Isso é feito com o move-windowcomando

Se o número da janela estiver entre os menores / os maiores números (ou seja, presumivelmente, corresponde a um número de janela existente), apenas os troque com o swap-windowcomando

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 esta ligação de chave simples ao seu .tmux.conf:

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

Nota : Para imitar perfeitamente o screencomportamento de troca de janelas, acredito que, quando você move uma janela para um número de janela existente , ele deve substituir a janela e todas as outras janelas são empurradas para a direita . Seria bastante simples modificar esse script para fazer isso.

Luke Davis
fonte
0

Não há necessidade da linha de comando (que é Ctrl+ be então :)

Basta mover suas janelas com

Ctrl+ b+:

digite o novo número da janela (gratuita) e pressione Enter

Se agora houver um número de janela livre, use Ctrl+ b+ .para renumerar uma janela.

(Dica: nomeie suas janelas com Ctrl+ b+ ,se você não souber qual é qual)

rubo77
fonte