Comment échanger des fichiers entre Windows dans VIM?

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:

  • CtrlW , 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.)

  • CtrlW , x – intervertit la fenêtre en cours avec la suivante

  • CtrlW , ShiftH – déplace cette fenêtre vers l’extrême gauche

  • CtrlW , ShiftK – déplace cette fenêtre vers le haut

(et de même pour CtrlW , ShiftJ et CtrlW , ShiftL ). 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:

  1. Sélectionnez la fenêtre A (avec la souris ou avec les commandes du clavier)
  2. Appuyez sur y (en tirant le numéro de tampon)
  3. Sélectionnez la fenêtre B
  4. Appuyez sur pp (coller le tampon)
  5. Sélectionnez la fenêtre A
  6. Appuyez sur 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

  1. yw pour tirer une fenêtre.
  2. Déplacez votre curseur dans une autre fenêtre.
  3. 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 r ou x 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 H 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