Como alternar entre painéis dentro de uma janela no tmux como na tela?

41

Eu pensei que Mover o painel tmux para a janela era a mesma pergunta, mas não parece ser.

Vindo do uso regular da tela GNU, estou procurando o tmux para fazer as mesmas coisas. Entre as coisas que faço regularmente, há duas janelas diferentes abertas, uma com algum código aberto no vim e algumas janelas de terminais abertas para testar o código, e algumas vezes uma ou duas janelas para várias outras coisas. Eu divido a tela na vertical e, muitas vezes, a janela do vim no painel superior e, em seguida, uma das outras janelas na parte inferior.

Os principais comandos Então eu uso são Ctrla, Tabpara rodar entre os painéis e Ctrla, npara rodar entre as janelas dentro de um painel. Por exemplo, com o vim no painel superior, alterno para o painel inferior e depois giro pelos outros terminais, fazendo o que eu preciso. A tela permanece dividida o tempo todo.

O problema é que não consigo encontrar capacidade comparável à da tela Ctrla, nno tmux. A mudança de janelas parece não funcionar dentro de um painel, mas é um salto total. Se a tela estiver dividida, as duas únicas opções parecerão saltar para uma janela que não esteja dividida e depois dividi-la ou fazer uma subdivisão de um painel. Nem é o que eu estava procurando.

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

FooBar
fonte
Sua terminologia é um pouco confusa. Em tmuxuma janela pode ser dividida em vários painéis. Você está tentando alternar entre painéis em uma janela com um atalho de teclado?
jasonwryan
Eu estava tentando seguir a nomenclatura das ferramentas, mas admito que é confusa. Eu sei como mudar o foco de um painel para outro. O que estou tentando descobrir é como alternar o que é exibido em um painel específico sem alterar o layout.
FooBar
Então, para mover o conteúdo de um painel para outro? Você está procurando swap-pane? Se você deseja imitar as telas Ctrl-a n, o equivalente ao tmux é Ctrl-b n.
jasonwryan

Respostas:

28

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

Em termos de tela , uma divisão permite exibir várias janelas ao mesmo tempo. next( C-a n) gira as janelas através da parte ativa da divisão; isso permite que você gire janelas "ocultas" pela região ativa da divisão.

Em termos do 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 são ocultados (se uma janela é selecionada (visível), todos os seus 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 pode estar em várias janelas e não pode estar em várias divisões da mesma janela). Existem comandos para mover painéis nas janelas (ou entre), mas não de maneira idêntica à nextda 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 desejará colocar isso no seu ~/.tmux.confarquivo, mas poderá digitar / colar depois Prefix :para vinculá-lo à sua instância atual do servidor.

Para usar a encadernação, escolha sua “janela principal”, divida-a, crie uma janela “contêiner do painel” imediatamente após a “janela principal” e use a encadernação para girar qualquer painel na “janela principal” entre o grupo no “ recipiente do painel ”.

Aqui está como você pode criar a instalação:

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

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

    Por exemplo Prefix "( :split-window)

    Você pode usar esse painel como sua janela de teste (ou visualizador de logs ou qualquer outra coisa).

  • Crie uma nova janela (o “contêiner do painel”) imediatamente após a janela principal.

    Por exemplo Prefix c( :new-window)

    É importante que nenhuma outra janela fique entre os índices da “janela principal” e da janela “contêiner do painel” ( +nos especificadores de janela usados ​​nos comandos encadernados significa “a próxima janela mais numerada”).

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

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

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

    Você pode usar Prefix Up/ Down/ Left/ Rightpara se mover entre os painéis.

  • Chame a ligação para trocar o painel atual pelo primeiro painel na janela "painel de contêineres" e ("nos bastidores") gire os painéis dentro da janela "painel de contêineres" (para que, na próxima vez em que você execute a ligação, o primeiro comando trocas com o painel "próximo" na sequência).

    Prefix Control- n(a ligação usa Cn, mas você pode alterar isso para o que quiser).

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

painel de troca Cp da chave de ligação -s: +. bottom \; rodar-janela -Dt: +
Chris Johnsen
fonte
Obrigado! Ótima explicação e a ligação sugerida parece replicar pelo menos a funcionalidade que eu estava procurando.
FooBar
Desculpe-me, como poderia um tamanho grande um painel e, em seguida, trocar de volta para o arranjo anterior
MageProspero
1
@JamesAndino: O tmux 1.8 tem resize-pane -Z(por padrão, vinculado ao Prefixo + z) que "amplia" temporariamente um painel para ter o tamanho total da janela. Para a versão anterior à 1.8, não havia uma maneira integrada de fazer isso; outros criaram soluções com script a partir de outros comandos internos (por exemplo, algumas das respostas à pergunta da SU: “Maximizando” um painel no tmux ).
31813 Chris Johnsen
ty, compilado e carregado #
MageProspero 13/10
3
Acredito em C-b ociclos de painéis.
Sam Selikoff
39

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

sparticvs
fonte
2
Sinto muito, mas não fui muito claro. Eu descobri como passar de painel para painel. No tmux, Ctrl b + o funciona da mesma forma que Ctrl a + Tab na tela. O que estou procurando é a funcionalidade equivalente à Ctrl a + n da tela.
FooBar
@FooBar como sobre Ctrl-b+{ou Ctrl-b+}? Isso é o mais próximo que posso encontrar dessa funcionalidade. Os painéis não são feitos da mesma maneira no tmux, pois são manipulados na tela.
Sparticvs 29/10/12
Muitas vezes, tenho problemas para focar no painel realçado, digamos que tenho dois painéis, pressiono frequentemente ^b↑. Como, então, realmente foco o painel destacado, de modo que outro seja capturado pelo shell, e não pelo tmux?
ThorSummoner
6

use bind -r, para que você possa pressionar prefixuma vez e depois outras teclas em uma sequência para localizar seu painel. O tempo limite pode ser ajustado em repeat-time. Verificaman 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
zhazha
fonte
2

Aqui está uma pequena conf que permite que você mova para exibir painéis ou janelas usando os atalhos ALT ou SHIFT + seta. Não é necessário usar o prefixo da chave.

## 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 pode se interessar pelo código a seguir que permite a navegação por painéis pelo mouse. (uso: prefixo da tecla + m para ativar, M para desativá-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'

essa configuração deve funcionar está funcionando com certeza para o tmux 1.6 a 1.9.

xaa
fonte
2

Essas respostas oferecem dois painéis, nos quais os dois painéis mantêm o mesmo conjunto de janelas, mas cada painel pode alternar entre janelas independentemente.

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

  • uma sessão externa para os painéis ,
  • uma sessão interna para as janelas (você pode anexar a isso em um painel),
  • uma visão secundária na sessão interna (para o outro painel).

Sim, esta é a filosofia UNIX louco ido. 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 (painel inferior), você precisará usar Ctrl-b Ctrl-b ne p.

Lado: Isso é um pouco pesado, mas você sempre pode alterar o prefixo da sessão externa, por exemplo Ctrl-a, para , assim:

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

Então seria apenas Ctrl-b ne ppercorrer as janelas internas e Ctrl-a opercorrer os painéis externos.

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 um new-sessioncomando (principalmente com -tnot not -s):

$ tmux new-session -t inner

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

A razão pela qual devemos usar new-session -ta segunda vez é que, se simplesmente fizermos attach -tnovamente, os painéis superior e inferior serão 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 "exibição", mas conectamos seu back-end diretamente à sessão existente que contém as janelas. Isso também é conhecido como " sessões agrupadas ". (A propósito, esse link também sugere usar [un]link-windowpara mover janelas entre as sessões.)

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

joeytwiddle
fonte
0

Coloque o seguinte código no seu .tmux.conf:

# cycle prev/next pane
bind -n S-right select-pane -t :.+
bind -n S-left select-pane -t :.-

Recarregar a configuração, você pode pressionar (diretamente sem a tecla de prefixo) Shift+ para alternar os painéis no sentido horário e Shift+ para alternar no sentido inverso.

Testado no Tmux 2.8.


Caso você não queira editar a configuração, prefix+ oé a ligação de tecla padrão para o ciclo no sentido horário. Ocasionalmente encontrei essa ligação de chave, então recebo o comando tmux list-keyse o uso para minhas próprias ligações de chave:

bind-key    -T prefix       o                 select-pane -t :.+
Reorx
fonte