Troque a posição de duas janelas

29

Digamos o seguinte é a estrutura atual da minha janela:

+ ----- + ----------------------------
| |
| A
| |
+ ----- +
| |
| B

A ordem de A e B não é muito natural. Seria melhor se B estivesse no topo.

No entanto, se eu for <C-w>K, B será o topo de todas as janelas, o que não é o que eu quero. Como posso colocar B acima de A, mas não acima de qualquer outra janela que já esteja acima de A?

E se duas janelas estiverem divididas verticalmente, como posso alterá-las para dividir horizontalmente?

Jason Hu
fonte
7
Este post explica como girar janelas. Trata- se de alternar divisões da vertical para a horizontal.
Lcd047
@ lcd047 Essas são perguntas fora deste site. Vale a pena escrever uma pequena resposta aqui e incluir os links (que são valiosos)?
Bernhard
1
@ Bernhard Suponho que esta seja uma boa pergunta para a meta .
Lcd047
1
@Bernhard Sim . Certifique-se de escrever uma resposta completa, não apenas os links.
Gilles 'SO- stop be evil'
1
Então, explique o que você está tentando fazer e por que as duas respostas que eu apontei para você não abordam o problema.
Lcd047

Respostas:

33

Para trocar as duas partes de uma janela dividida, basta: <C-w> <C-r>

modesto
fonte
Posso estar errado, mas sua solução gira as janelas, portanto, com mais de 2 divisões, o resultado não será o que o OP estava procurando.
statox
Você está absolutamente certo. O OP estava procurando por s.th. mais complicado do que "trocar as duas partes de uma janela dividida".
Modesto
Na verdade, o OP está procurando um comando para trocar duas janelas divididas, mas sua solução gira todas as janelas divididas atuais. Como afirmado em :h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.Portanto, se você tiver três divisões, o cursor na parte inferior e <c-w><c-r>a terceira janela estarão sobre as outras duas, que não é o que o OP estava pedindo:How can I put B above A, but not above any other window that is already above A?
statox
6

Para trocar windowposições, o efeito é equivalente à troca de buffers que essas duas janelas mostram.
Por exemplo, se a janela A tiver o buffer 2 e a janela B o buffer 8, vá para a Janela A, selecione o buffer 8 e, em seguida, para a Janela B, selecione o buffer 2.

Essa ideia me inspirou a escrevê-la - e já está na minha própria caixa de ferramentas

Código da função:

function! WinBufSwap()
  let thiswin = winnr()
  let thisbuf = bufnr("%")
  let lastwin = winnr("#")
  let lastbuf = winbufnr(lastwin)

  exec  lastwin . " wincmd w" ."|".
      \ "buffer ". thisbuf ."|".
      \ thiswin ." wincmd w" ."|".
      \ "buffer ". lastbuf
endfunction

command! Wswap :call WinBufSwap()
map <Leader>bs <C-c>:call WinBufSwap()<CR>
  1. Selecione a janela A
  2. Selecionar janela B
  3. :call WinBufSwap()
    Isso troca os buffers nas duas janelas pré-selecionadas, deixando o cursor na janela original.

A seleção das duas janelas desejadas a serem trocadas antes do tempo é o detalhe principal, pois é necessário especificar para o Vim com quem trabalhar.

Cometsong
fonte
Apenas uma precisão, quando você diz "selecione a janela A e depois B", você quer dizer "Concentre-se em A e depois em B para marcar a ordem dos últimos buffers e janelas vistos, para trocar corretamente? Ou será que" selecione "significa algo diferente de" ter o foco em "?
padawin 16/04
Sim, exatamente: estou usando "selecionar" como "focar".
Cometsong 17/04
6
CTRL-W x troca da janela atual pela janela N
                   (padrão: próxima janela)

( index.txtseção 2.2, "Comandos da janela")

Se A é a janela atual, a próxima será B, então você só precisa <C-w> x

Se B for a janela atual (e houver mais janelas abaixo), primeiro você precisará ir para A e trocar: <C-w> k <C-w> x

JigglyNaga
fonte
4

Outra alternativa para trocar janelas ou trocar os buffers é marcar posições (usando marcas maiúsculas ) em seus arquivos e abrir essas marcas nas janelas de sua escolha.

Por exemplo, se eu tiver dois arquivos, file_A e file_B :

  • Eu iria para a janela com file_A e marcaria:mA
  • vá para a janela com file_B e marque-a:mB
  • Em seguida, busque a marca do arquivo_A nessa janela:'A
  • em seguida, voltar para a primeira janela e buscar a marca de file_B lá: 'B.

A vantagem desse método é que, por algum motivo, você divide seu painel mais de uma vez e não há lógica clara para trocá-los, como se você deseja trocar os painéis às 12 horas e às 7 horas, você pode ' apenas gire as janelas, mas você pode facilmente trocar os buffers.

Chan Youn
fonte
0

Você pode trocar os buffers entre duas janelas com a seguinte função:

function! SwitchWindow(count) abort
    let l:current_buf = winbufnr(0)
    exe "buffer" . winbufnr(a:count)
    exe a:count . "wincmd w"
    exe "buffer" . l:current_buf
    wincmd p
endfunction
nnoremap <C-w>x :<C-u>call SwitchWindow(v:count1)<CR>

Agora, na maioria das vezes, a troca dos buffers funcionará tecnicamente como a troca de janelas. Como você não controla manualmente as janelas, controla qual janela está mantendo qual buffer. Portanto, a função acima o ajudará na maioria das situações.

klaus
fonte