Reordenar janelas tmux


21

Como posso reordenar janelas com eficiência no tmux? Por exemplo, com este conjunto de janelas:

0:zsh  1:elinks  2:mutt  3:irssi  4:emacs  5:rss  6:htop

O que eu teria que fazer para passar rsspara elinkse muttterminando com:

0:zsh  1:elinks  2:rss  3:mutt  4:irssi  5:emacs  6:htop

Eu sei como usar move-windowpara mover uma janela para um índice ainda não utilizado, e eu poderia usar uma série delas para conseguir isso - mas, obviamente, isso é muito tedioso.


1
Estas perguntas e respostas sobre o SU mostram o que você está pedindo: superuser.com/questions/343572/how-do-i-reorder-tmux-windows
slm

Respostas:


38

swap-window pode ajudá-lo:

swap-window -t -1

Move a janela atual para a esquerda em uma posição.

Do man tmux :

swap-window [-d] [-s src-window] [-t dst-window]
             (alias: swapw)
This is similar to link-window, except the source and destination windows are swapped. 
It is an error if no window exists at src-window.

Você pode vinculá-lo a uma chave:

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

Então você pode usar Shift+Lefte Shift+Rightpara alterar a posição atual da janela.


Mas eu ainda teria que swap-windowexecutar uma série de comandos (três no caso de exemplo) - correto?
Igor

@igor: Sim. Outra maneira, você pode fazer swap-window -s 2 -t 5. Este número da janela de swap 2 com janela número 5.
cuonglm

Certo - mas quero manter intacta a ordem de todas as outras janelas, para que uma troca "simples" das janelas 2 e 5 não faça isso por mim. Eu já estava ciente do swap-windowcomando, mas não sabia sobre os prefixos -/ +para direcionar a janela anterior / seguinte.
Igor

consulte unix.stackexchange.com/a/525770/12497 para obter informações sobre o comportamento alterado das swap-windowversões mais recentes do tmux
Steven Lu

2

A resposta aceita e altamente votada está correta, embora o comportamento nas versões recentes do tmux veja o comando swap-window não mantê-lo na mesma janela. Por isso, funciona de maneira não intuitiva, sua janela ativa será trocada nessa direção, mas você permanecerá no mesmo slot!

Para corrigir esse problema, basta aumentar a ligação para segui-lo. Por exemplo, na minha configuração tmux:

bind -n C-S-Left { swap-window -t -1; previous-window }
bind -n C-S-Right { swap-window -t +1; next-window }

1

Aqui está uma solução de trabalho envolvida na função bash.

list=$(tmux lsw -F '#I');                           # for shift left, could be moved inside function
list=$(tmux lsw -F '#I'); list=$(echo $list|rev);   # for shift right, list reversed
shift_tmux_window_range() {  # depend on `list`
    local started=0 beg=$1 end=$2
    for i in $list; do
        if (($i == $beg)); then
            started=1; h=$beg; tmux linkw -s $beg && tmux unlinkw -t $beg;
        elif (($i == $end)); then
            tmux movew -d -s $i -t $h; tmux movew -d -t $end; break;
        elif [ $started = 1 ]; then
            tmux movew -d -s $i -t $h; h=$i;
        fi;
    done
}

shift_tmux_window_range 5 2

Bônus: permaneça na mesma janela se a janela ativa atual não for afetada.


Brilhante! Obrigado.
Alexander Bird

-1

Se tmuxfor a versão 1.7 ou superior

move-window -r

ou

set-option -g renumber-windows on

no .tmux.confpara fazer automaticamente, no futuro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.