Lorsque je travaille avec VIM, j'ai toujours plusieurs fenêtres visibles. Parfois, j'aimerais avoir un moyen simple d'échanger ces fenêtres par endroits. Existe-t-il un plugin, une macro, etc. pour rendre cela plus facile? BTW, j'utilise MiniBufExplorer.
Il existe quelques commandes utiles intégrées qui vous donnent un certain contrôle, mais elles ne sont pas complètes. Les principaux sont:
Ctrl-W, r (c.-à-d. CTRL, presse W, Libération CTRL, presse r) - qui fait tourner les fenêtres (la première fenêtre devient la deuxième, la seconde devient la troisième, etc.)
Ctrl-W, x - échanger la fenêtre courante avec la suivante
Ctrl-W, Shift-H - déplacer cette fenêtre à l'extrême gauche
Ctrl-W, Shift-K - déplacer cette fenêtre vers le haut
(et de même pour Ctrl-W, Shift-J et Ctrl-W, Shift-L). Voir:
:help window-moving
pour plus d'informations.
J'ai écrit et ai utilisé l'extrait de code suivant dans mon vimrc pour copier-coller mes fenêtres Vim.
Cela définit par exemple les raccourcis suivants:
<c-w>y
: "Yanks the window", c'est-à-dire stocke le numéro du tampon dans la fenêtre courante dans une variable globale.<c-w>pp
: "Met la fenêtre à la place de la fenêtre courante", c'est-à-dire qu'elle lit le numéro de tampon stocké précédemment et ouvre ce tampon dans la fenêtre courante. Il stocke également le numéro du tampon qui était dans la fenêtre actuelle.Si en "échangeant ces fenêtres par endroits", vous voulez dire "ouvrir le tampon dans la fenêtre A dans la fenêtre B, et vice versa, sans changer la position des fenêtres", vous pouvez utiliser la séquence de clavier suivante pour permuter les fenêtres:
<c-w>y
(tirant le numéro du tampon)<c-w>pp
(coller le tampon)<c-w>pp
(coller à nouveau le tampon)Cela ne fonctionne que dans 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
J'ai demandé une question similaire à peu près au même moment: je voulais un moyen d'échanger les fenêtres spécifiquement sans modifier une disposition arbitrairement compliquée. J'ai fini par créer un plugin vim à partir d'une des solutions qui ont été suggérées. Cela s'appelle WindowSwap.vim ; installez-le avec votre gestionnaire de plug-ins vim préféré et faites-le tourner.
Avec WindowSwap.vim, vous feriez simplement
<Leader>yw
pour ouvrir une fenêtre.<Leader>pw
pour coller cette fenêtre, en la remplaçant par la position de la première.Les combinaisons de touches sont bien sûr configurables selon vos préférences.
À mon avis, http://vimcasts.org/episodes/working-with-windows/ a la réponse parfaite à cette question. En bref:
ctrl-w w
faire défiler les fenêtres ouvertesctrl-w h
concentre la fenêtre vers la gauchectrl-w j
concentrer la fenêtre vers le basctrl-w k
concentrer la fenêtre vers le hautctrl-w l
concentrer la fenêtre vers la droitectrl-w r
faire pivoter toutes les fenêtresctrl-w x
échange la fenêtre courante avec son voisin ctrl-w H
déplacer la fenêtre actuelle à l'extrême gauchectrl-w J
déplace la fenêtre courante en basctrl-w K
déplace la fenêtre courante en hautctrl-w L
déplacer la fenêtre actuelle à l'extrême droiteComme <c-w>r
ou <c-w>x
a une restriction que vous ne pouvez pas faire pivoter ou échanger des fenêtres lorsque les divisions de fenêtres verticales et horizontales sont mélangées. Et <c-w>H
peut modifier la disposition des fenêtres au-delà de vos attentes, en particulier lorsque vous avez plusieurs fenêtres.
Vous pouvez donc faire un certain travail pour satisfaire vos besoins particuliers de commutation de fenêtre/tampon. Voici un exemple pour changer la fenêtre actuelle avec la fenêtre en haut à gauche (généralement je la maximise verticalement):
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>