Lorsque je travaille avec VIM, j’ai toujours plusieurs fenêtres visibles. Parfois, je voudrais avoir un moyen facile d’échanger ces fenêtres par endroits. Y a-t-il un plugin, une macro, etc. pour rendre cela plus facile? BTW, j’utilise MiniBufExplorer.
Il y a quelques commandes utiles intégrées qui vous donnent un certain contrôle, mais ce n’est pas exhaustif. Les principaux sont:
Ctrl – W , r (c.-à-d. Maintenez CTRL , appuyez sur W , relâchez CTRL , appuyez sur r ) – qui fait pivoter les fenêtres (la première fenêtre devient la deuxième, la seconde devient la troisième, etc.)
Ctrl – W , x – intervertit la fenêtre en cours avec la suivante
Ctrl – W , Shift – H – déplace cette fenêtre vers l’extrême gauche
Ctrl – W , Shift – K – déplace 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 utilisé l’extrait de code suivant dans mon vimrc pour copier-coller mes fenêtres Vim.
Ceci définit par exemple les raccourcis suivants:
y
: “Yanks the window”, c’est-à-dire stocke le numéro du tampon dans la fenêtre en cours dans une variable globale. pp
: “Place la fenêtre à la place de la fenêtre actuelle”, c.-à-d. qu’elle lit le numéro de tampon stocké précédemment et ouvre ce tampon dans la fenêtre en cours. Il stocke également le numéro du tampon qui se trouvait dans la fenêtre actuelle. Si, en “échangeant ces fenêtres par endroits”, vous voulez dire “ouvrir le tampon dans la fenêtre A de la fenêtre B et inversement, sans changer la position des fenêtres”, vous pouvez utiliser la séquence de clavier suivante pour permuter les fenêtres:
y
(en tirant le numéro de tampon) pp
(coller le tampon) 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! \\ " 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 d :call HDeleteWindow() noremap y :call HYankWindow() noremap p :call HPasteWindow('up') noremap p :call HPasteWindow('down') noremap p :call HPasteWindow('left') noremap p :call HPasteWindow('right') noremap pk :call HPasteWindow('up') noremap pj :call HPasteWindow('down') noremap ph :call HPasteWindow('left') noremap pl :call HPasteWindow('right') noremap pp :call HPasteWindow('here') noremap P :call HPasteWindow('here') endif
J’ai posé une question similaire à peu près au même moment: je voulais un moyen d’échanger des fenêtres spécifiquement sans modifier une mise en page compliquée arbitrairement. J’ai fini par créer un plug-in vim à partir d’une des solutions proposées. Il s’appelle WindowSwap.vim ; installez-le avec votre gestionnaire de plug-in vim préféré et lancez-le.
Avec WindowSwap.vim, vous auriez simplement
yw
pour tirer une fenêtre. pw
pour coller cette fenêtre, en l’échangeant avec la position du premier. Les combinaisons de touches sont bien entendu configurables selon vos préférences.
Comme
ou
a une ressortingction, vous ne pouvez pas faire pivoter ou échanger des fenêtres lorsque des divisions de fenêtres verticales et horizontales sont mélangées. Et
peut modifier la disposition de la fenêtre au-delà de vos attentes, en particulier lorsque vous avez beaucoup de fenêtres.
Vous pouvez donc travailler pour satisfaire vos besoins particuliers en matière de changement de fenêtre / tampon. Voici un exemple de commutation de la fenêtre en cours avec la fenêtre en haut à gauche (en général, 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 :call SwitchMainWindow()
À mon avis, http://vimcasts.org/episodes/working-with-windows/ a la réponse parfaite à cette question. En bref:
ctrl-w w
cycle entre les fenêtres ouvertes ctrl-w h
apparaître la fenêtre à gauche ctrl-w j
concentre la fenêtre vers le bas ctrl-w k
concentre la fenêtre vers le haut ctrl-w l
concentre la fenêtre vers la droite ctrl-w r
faire pivoter toutes les fenêtres ctrl-w x
échange la fenêtre courante avec son voisin ctrl-w H
déplace la fenêtre actuelle à l’extrême gauche ctrl-w J
déplace la fenêtre actuelle vers le bas ctrl-w K
déplace la fenêtre actuelle vers le haut ctrl-w L
déplace la fenêtre actuelle à l’extrême droite