Como faço para percorrer os painéis dentro de uma janela no tmux como na tela?

34

Pensei que mover o painel do tmux para a janela era a mesma pergunta, mas não parece ser.

Ao usar a tela GNU regularmente, estou procurando o tmux para fazer as mesmas coisas. Uma das coisas que faço regularmente é ter um par de janelas diferentes abertas, uma com algum código aberto no vim, e algumas janelas de terminais abertas para testar o código e, às vezes, uma ou duas janelas para várias outras coisas. Eu divido a tela verticalmente e geralmente tenho a janela vim no painel superior e, em seguida, uma das outras janelas na parte inferior.

Os principais comandos que eu uso então são Ctrl a , Tab para girar entre os painéis e Ctrl < kbd> a , n para girar entre as janelas dentro de um painel. Por exemplo, com o vim no painel superior, alterno para o painel inferior e, em seguida, giro através dos outros terminais, fazendo o que preciso. A tela fica dividida o tempo todo.

O problema é que não consigo encontrar recursos comparáveis ao Ctrl a , n da tela no tmux. Alternar janelas parece não funcionar dentro de um painel, mas salta completamente. Se a tela estiver dividida, as duas únicas opções parecem ser saltar para alguma janela que não esteja dividida e, em seguida, dividi-la ou fazer uma sub-divisão de um painel. Nem o que eu estava procurando.

Sugestões (além de ficar com a tela)?

    
por FooBar 28.10.2012 / 23:05

5 respostas

23

tmux e tela têm modelos diferentes, portanto não há um equivalente exato.

Em termos tela , uma divisão permite exibir várias janelas ao mesmo tempo. next ( C-a n ) rotaciona janelas através da parte ativa da divisão; isso permite girar janelas "ocultas" através da região ativa da divisão.

Em termos tmux , uma divisão divide uma janela em um ou mais painéis. Cada parte de uma janela dividida é um painel individual, os painéis nunca ficam ocultos (se uma janela é selecionada (visível), todos os painéis também são), e um painel só pode ser usado em uma única divisão de uma janela (um painel pode não estar em várias janelas, e não pode estar em várias divisões da mesma janela). Existem comandos para mover painéis em torno (ou entre) janelas, mas não de maneira idêntica a next em tela .

Você pode usar uma ligação como a seguinte para organizar um efeito semelhante:

bind-key C-n swap-pane -s :+.top \; rotate-window -Ut :+

Você provavelmente vai querer colocar isso no seu arquivo ~/.tmux.conf , mas você pode simplesmente digitar / colá-lo após Prefixo : para vinculá-lo em sua instância atual do servidor .

Para usar a ligação, selecione sua "janela principal", divida-a, crie uma janela "recipiente do painel" imediatamente após a "janela principal" e use a ligação para girar qualquer painel na "janela principal" entre o grupo na janela "recipiente do painel".

Veja como você pode criar a configuração:

  • Escolha uma janela para usar como sua "janela principal". Iniciar (por exemplo) Vim .

  • Divida sua "janela principal" em dois painéis.

    Por exemplo Prefixo " ( :split-window )

    Você pode usar esse painel como sua janela de teste (ou visualizador de log, ou qualquer outro).

  • Crie uma nova janela (o "recipiente do painel") imediatamente após a janela principal.

    Por exemplo Prefixo c ( :new-window )

    É importante que nenhuma outra janela fique entre os índices da "janela principal" e da janela "recipiente do painel" ( + nos especificadores de janela usados nos comandos ligados significa "a próxima janela numerada mais alta").

  • Divida esta janela em vários painéis. Para girar através de três painéis, divida essa janela em dois painéis (o terceiro painel é o da "janela principal").

    Talvez você precise de um shell para git e um shell para executar uma interface de banco de dados. Coloque cada um em um painel separado nesta janela "recipiente do painel".

  • Volte para a sua "janela principal". Selecione o painel que você deseja "girar para fora".

    Você pode usar o Prefixo Acima / Abaixo / Esquerda / Direita para mover-se entre os painéis.

  • Invoque a ligação para trocar o painel atual com o primeiro painel na janela "recipiente do painel" e ("nos bastidores") gire os painéis dentro da janela "recipiente do painel" (para que da próxima vez que você executar a encadernação, o primeiro comando troca com o painel "próximo" na sequência).

    Prefixo Controle - n (a ligação usa C-n, mas você pode mudar isso para o que quiser).

  • Para rolar para trás pelos painéis, você pode usar o seguinte:

bind-key C-p swap-pane -s :+.bottom \; rotate-window -Dt :+
    
por 29.10.2012 / 07:04
28

Eu acredito que o que você está procurando é Ctrl b + (, , , ). Isso permitirá que você se mova entre os painéis.

    
por 29.10.2012 / 01:35
3

use bind -r , para que você possa pressionar prefix uma vez e, em seguida, outras chaves em uma sequência para localizar seu painel. O tempo limite pode ser ajustado por repeat-time . Verifique man tmux

bind -r Tab select-pane -t :.+

Se você preferir hjkl ,

bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R
    
por 05.01.2016 / 06:07
2

Este é um pequeno conf que permite mover para painéis ou janelas usando os atalhos ALT ou SHIFT + arrow. Não há necessidade de usar o prefixo da chave é confortável.

## NAVIGATION: ############################

# Switch panes 
# Usage: "ALT+arrow keys" (without prefix key)
# from https://gist.github.com/spicycode
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Switch windows 
# usage: "SHIFT+arrow" (without prefix key)
bind -n S-Left  previous-window
bind -n S-Right next-window

Se você é mais preguiçoso do que eu, também poderia se interessar pelo seguinte código que permite a navegação de painéis por mouse. (uso: prefixo da chave + m para ligar, M para desligá-lo)

## MOUSE CONTROL: #########################
set -g mode-mouse off
set -g mouse-resize-pane off
set -g mouse-select-pane off
set -g mouse-select-window off

# Toggle mouse on 
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'

# Toggle mouse off
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'

esta configuração deve funcionar com certeza para o tmux 1.6 a 1.9.

    
por 25.09.2015 / 23:12
1

Esta resposta dá-lhe dois painéis, onde ambos os painéis mantêm o mesmo conjunto de janelas, mas cada painel pode alternar entre janelas independentemente.

A abordagem do tmux é usar três sessões:

  • uma sessão externa para os painéis ,
  • uma sessão interna para as janelas (você pode anexar isso de um único painel),
  • uma visualização secundária na sessão interna (para o outro painel).

Sim, isso é filosofia do UNIX que enlouqueceu. Vamos começar:

# Create a session to hold the multiple windows
$ tmux new-session -s inner

    <Ctrl-b> c   to create a few windows, run some things

    <Ctrl-b> d   to detach, but leave it running

# Create a session to hold multiple panes (the view)
$ tmux new-session -s outer

    <Ctrl-b> "   to split

# Open the inner session in the current (bottom) pane
$ unset TMUX ; tmux attach -t inner

Agora você pode alternar para o painel superior e abrir o Vim como de costume. Para percorrer as janelas na sessão interna (o painel inferior) você precisará usar Ctrl-b Ctrl-b n e p .

Aside: That is a bit unwieldy but you could always change the prefix of the outer session, e.g. to Ctrl-a, like this:

<Ctrl-b> :set-option prefix C-a

Then it would just be Ctrl-b n and p to cycle the inner windows, and Ctrl-a o to cycle the outer panes.

OK agora, em vez de abrir o Vim no painel superior, vamos nos conectar novamente à sua sessão interna. Saia do vim e, desta vez, use o comando new-session (principalmente com -t not -s ):

$ tmux new-session -t inner

Voila! Agora você pode percorrer as janelas nos painéis superior e inferior.

O motivo pelo qual devemos usar new-session -t pela segunda vez é que, se fôssemos simplesmente attach -t novamente, os painéis superior e inferior seriam sincronizados, sempre mostrando a mesma janela, que não é o que você deseja. Para permitir que esse painel se mova pelas janelas independentemente do outro painel, criamos uma nova sessão de "visualização", mas conectamos seu back-end diretamente à sessão existente que contém as janelas. Isso também é conhecido como " sessões agrupadas ". (Aliás, esse link também sugere usar [un]link-window para mover as janelas entre as sessões.)

É claro que, para a simetria, você poderia ter executado tmux new-session -t inner no painel inferior também, em vez de attach . Nesse caso, você estaria executando 4 instâncias do tmux (mais um processo tmux para o servidor)!

    
por 27.06.2016 / 05:25