Como trocar arquivos entre janelas no VIM?


123

Quando trabalho com o VIM, sempre tenho várias janelas visíveis. Às vezes eu gostaria de ter uma maneira fácil, trocar essas janelas em alguns lugares. Existe algum plug-in, macro etc. para tornar isso mais fácil? BTW, eu uso o MiniBufExplorer.


2
"Trocando essas janelas em alguns lugares", você quer dizer "abrir o buffer que está na janela A na janela B e vice-versa, sem alterar a posição das janelas"?
hcs42

1
Sim, é exatamente isso que eu quero.
Mdrozdziel

Respostas:


304

Existem alguns comandos úteis incorporados que oferecem uma certa quantidade de controle, mas não são abrangentes. Os principais são:

  • Ctrl- W, r(ou seja CTRL, segure , pressione W, solte CTRL, pressione r) - que gira as janelas (a primeira janela se torna a segunda, a segunda se torna a terceira, etc.)

  • Ctrl- W, x- troque a janela atual pela próxima

  • Ctrl- W, Shift- H- mova esta janela para a extrema esquerda

  • Ctrl- W, Shift- K- move esta janela para o topo

(e da mesma forma para Ctrl- W, Shift- Je Ctrl- W, Shift- L). Vejo:

:help window-moving

Para maiores informações.


16
Essa deve ser a "melhor resposta" - funcionalidade nativa, não um Vimscript personalizado.
David Rivers

1
Não completamente, não. Existem muitos casos de uso que não podem ser feitos usando o gerenciamento de janelas interno sem destruir e recriar janelas. O script de buffers de troca permite esses casos de uso.
bobpaul

note que o ctl-w também funciona. O ctl-W fechará as janelas em alguns emuladores de terminal.
Datakid 26/05/19

7

Eu escrevi e tenho usado o seguinte trecho de código no meu vimrc para copiar e colar minhas janelas do Vim.

Isso define, por exemplo, os seguintes atalhos:

  • <c-w>y: "Puxa a janela", ou seja, armazena o número do buffer na janela atual em uma variável global.
  • <c-w>pp: "Coloca a janela no lugar da janela atual", ou seja, lê o número do buffer armazenado anteriormente e abre esse buffer na janela atual. Ele também armazena o número do buffer que costumava estar na janela atual.

Se, "trocando essas janelas em alguns lugares", significa "abrir o buffer na janela A na janela B e vice-versa, sem alterar a posição das janelas", você pode usar a seguinte seqüência de teclado para trocar as janelas:

  1. Selecione a janela A (com o mouse ou com os comandos do teclado)
  2. Pressione <c-w>y(puxando o número do buffer)
  3. Selecionar janela B
  4. Pressione <c-w>pp(colando o buffer)
  5. Selecione a janela A
  6. Pressione <c-w>pp(colando o buffer novamente)

Funciona apenas no Vim> = 7.0.

if version >= 700
function! HOpen(dir,what_to_open)

    let [type,name] = a:what_to_open

    if a:dir=='left' || a:dir=='right'
        vsplit
    elseif a:dir=='up' || a:dir=='down'
        split
    end

    if a:dir=='down' || a:dir=='right'
        exec "normal! \<c-w>\<c-w>"
    end

    if type=='buffer'
        exec 'buffer '.name
    else
        exec 'edit '.name
    end
endfunction

function! HYankWindow()
    let g:window = winnr()
    let g:buffer = bufnr('%')
    let g:bufhidden = &bufhidden
endfunction

function! HDeleteWindow()
    call HYankWindow()
    set bufhidden=hide
    close
endfunction

function! HPasteWindow(direction)
    let old_buffer = bufnr('%')
    call HOpen(a:direction,['buffer',g:buffer])
    let g:buffer = old_buffer
    let &bufhidden = g:bufhidden
endfunction

noremap <c-w>d :call HDeleteWindow()<cr>
noremap <c-w>y :call HYankWindow()<cr>
noremap <c-w>p<up> :call HPasteWindow('up')<cr>
noremap <c-w>p<down> :call HPasteWindow('down')<cr>
noremap <c-w>p<left> :call HPasteWindow('left')<cr>
noremap <c-w>p<right> :call HPasteWindow('right')<cr>
noremap <c-w>pk :call HPasteWindow('up')<cr>
noremap <c-w>pj :call HPasteWindow('down')<cr>
noremap <c-w>ph :call HPasteWindow('left')<cr>
noremap <c-w>pl :call HPasteWindow('right')<cr>
noremap <c-w>pp :call HPasteWindow('here')<cr>
noremap <c-w>P :call HPasteWindow('here')<cr>

endif

4

Fiz uma pergunta semelhante na mesma época: queria uma maneira de trocar janelas especificamente, sem alterar um layout arbitrariamente complicado. Acabei fazendo um plugin vim de uma das soluções sugeridas. Chama-se WindowSwap.vim ; instale-o com seu gerenciador de plugins vim preferido e experimente.

Com WindowSwap.vim, você simplesmente

  1. <Leader>yw puxar uma janela.
  2. Mova o cursor para outra janela.
  3. <Leader>pw para colar essa janela, trocando-a pela posição da primeira.

As combinações de teclas são naturalmente configuráveis ​​para suas preferências.


1

Como <c-w>rou <c-w>xtem uma restrição que você não pode girar ou trocar janelas Quando as divisões de janela vertical e horizontal são misturadas. E <c-w>Hpode fazer com que o layout da janela mude além da sua expectativa, especialmente quando você tem muitas janelas.

Portanto, você pode fazer algum trabalho para satisfazer suas necessidades específicas de troca de janela / buffer. Aqui está um exemplo para alternar a janela atual com a janela superior esquerda (normalmente eu a maximizo verticalmente):

function! SwitchMainWindow()
  let l:current_buf = winbufnr(0)
  exe "buffer" . winbufnr(1)
  1wincmd w
  exe "buffer" . l:current_buf
endfunction
nnoremap <c-w><c-e> :call SwitchMainWindow()<cr>

1

Na minha opinião, http://vimcasts.org/episodes/working-with-windows/ tem a resposta perfeita para esta pergunta. Em resumo:

  • ctrl-w w ciclo entre as janelas abertas
  • ctrl-w h focalize a janela para a esquerda
  • ctrl-w j focar a janela para baixo
  • ctrl-w k focar a janela para cima
  • ctrl-w l focalize a janela para a direita
  • ctrl-w r gire todas as janelas
  • ctrl-w x trocar janela atual com seu vizinho
  • ctrl-w H mover a janela atual para a extrema esquerda
  • ctrl-w J mover a janela atual para baixo
  • ctrl-w K mover a janela atual para o topo
  • ctrl-w L mover a janela atual para a extrema direita

3
Qual o motivo da adição de uma resposta que não traz novas informações úteis para a publicação? Isso foi respondido perfeitamente há 6 anos. Você está fazendo campanha publicitária para vimcasts?
Mdrozdziel

@mdrozdziel Agradeço esta resposta 9 anos após o OP. Resposta mais concisa com apenas as informações que eu queria.
roro
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.