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.
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.
Respostas:
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.
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:
<c-w>y
(puxando o número do buffer)<c-w>pp
(colando o buffer)<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
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
<Leader>yw
puxar uma janela. <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.
Como <c-w>r
ou <c-w>x
tem 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>H
pode 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>
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 abertasctrl-w h
focalize a janela para a esquerdactrl-w j
focar a janela para baixoctrl-w k
focar a janela para cimactrl-w l
focalize a janela para a direitactrl-w r
gire todas as janelasctrl-w x
trocar janela atual com seu vizinhoctrl-w H
mover a janela atual para a extrema esquerdactrl-w J
mover a janela atual para baixoctrl-w K
mover a janela atual para o topoctrl-w L
mover a janela atual para a extrema direita