Comment échanger des fichiers entre les fenêtres dans VIM?


123

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.


2
Par «permuter ces fenêtres par endroits», voulez-vous dire «ouvrir le tampon qui se trouve dans la fenêtre A dans la fenêtre B, et vice versa, sans changer la position des fenêtres»?
hcs42

1
Oui, c'est exactement ce que je veux.
mdrozdziel

Réponses:


304

Il existe quelques commandes utiles intégrées qui vous donnent un certain contrôle, mais ce n'est pas complet. Les principaux sont:

  • Ctrl- W, r(c'est-à-dire maintenir CTRL, appuyer W, relâcher CTRL, appuyer 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- permuter la fenêtre actuelle 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- Jet Ctrl- W, Shift- L). Voir:

:help window-moving

pour plus d'informations.


16
Cela devrait être la «meilleure réponse» - une fonctionnalité native, pas un Vimscript personnalisé.
David Rivers

1
Pas complètement, non. Il existe de nombreux cas d'utilisation qui ne peuvent pas être réalisés en utilisant la gestion des fenêtres intégrée sans détruire et recréer des fenêtres. Le script de swap buffers permet ces cas d'utilisation.
bobpaul

notez que ctl-w fonctionne également. ctl-W fermera les fenêtres de certains émulateurs de terminal.
datakid

7

J'ai écrit et j'utilise 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: "Arrache la fenêtre", c'est à dire stocke le numéro du tampon dans la fenêtre courante dans une variable globale.
  • <c-w>pp: "Place la fenêtre à la place de la fenêtre courante", c'est-à-dire qu'il 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 se trouvait dans la fenêtre actuelle.

Si par "permuter 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 touches 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 <c-w>y(tirant sur le numéro du tampon)
  3. Sélectionnez la fenêtre B
  4. Appuyez sur <c-w>pp(coller le tampon)
  5. Sélectionnez la fenêtre A
  6. Appuyez sur <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

4

J'ai posé une question similaire à peu près au même moment: je voulais un moyen de permuter les fenêtres spécifiquement sans modifier une mise en page arbitrairement compliquée. J'ai fini par créer un plugin vim à partir de l'une des solutions suggérées. Il s'appelle WindowSwap.vim ; installez-le avec votre gestionnaire de plugins vim préféré et donnez-lui un tourbillon.

Avec WindowSwap.vim, vous

  1. <Leader>yw pour tirer une fenêtre.
  2. Déplacez votre curseur vers une autre fenêtre.
  3. <Leader>pw pour coller cette fenêtre, en l'échangeant avec la position de la première.

Les combinaisons de touches sont bien sûr configurables selon vos préférences.


1

Comme <c-w>rou <c-w>xa une restriction selon laquelle vous ne pouvez pas faire pivoter ou échanger des fenêtres Lorsque les divisions de fenêtre verticales et horizontales sont mélangées. Et<c-w>H peut faire changer la disposition de la fenêtre au-delà de vos attentes, surtout lorsque vous avez de nombreuses fenêtres.

Vous pouvez donc faire un certain travail pour satisfaire vos besoins particuliers de commutation fenêtre / tampon. Voici un exemple de changement de 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>

1

À mon avis, http://vimcasts.org/episodes/working-with-windows/ a la réponse parfaite à cette question. En bref:

  • ctrl-w w faire défiler entre les fenêtres ouvertes
  • ctrl-w h concentrer la fenêtre vers la gauche
  • ctrl-w j concentrer la fenêtre vers le bas
  • ctrl-w k concentrer la fenêtre vers le haut
  • ctrl-w l concentrer la fenêtre vers la droite
  • ctrl-w r faire pivoter toutes les fenêtres
  • ctrl-w x échanger la fenêtre courante avec son voisin
  • ctrl-w H déplacer la fenêtre actuelle à l'extrême gauche
  • ctrl-w J déplacer la fenêtre actuelle vers le bas
  • ctrl-w K déplacer la fenêtre actuelle vers le haut
  • ctrl-w L déplacer la fenêtre actuelle à l'extrême droite

3
Quelle est la raison d'ajouter une réponse qui n'apporte aucune nouvelle information utile au message? Cela a été parfaitement répondu il y a 6 ans. Faites-vous une campagne publicitaire pour les vimcasts?
mdrozdziel

@mdrozdziel J'apprécie cette réponse 9 ans après l'OP. Réponse la plus concise avec seulement les informations que je voulais.
roro
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.