131 votes

Comment échanger des fichiers entre Windows dans VIM ?

Lorsque je travaille avec VIM, j'ai toujours plusieurs Windows visibles. Parfois, j'aimerais avoir un moyen facile de permuter ces fenêtres. Existe-t-il un plugin, une macro, etc. pour rendre cela plus facile ? BTW, j'utilise MiniBufExplorer.

2 votes

Par "permuter ces fenêtres en place", voulez-vous dire "ouvrir le tampon qui est dans la fenêtre A dans la fenêtre B, et vice versa, sans changer la position des fenêtres" ?

1 votes

Oui, c'est exactement ce que je veux.

327voto

DrAl Points 29528

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

  • Ctrl - W , r (c'est-à-dire qu'il faut tenir CTRL , appuyez sur W Communiqué de presse CTRL , appuyez sur r ) - qui fait pivoter les fenêtres (la première fenêtre devient la deuxième, la deuxième devient la troisième, etc.)

  • Ctrl - W , x - échanger 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 en haut de la page

(et de même pour Ctrl - W , Shift - J et Ctrl - W , Shift - L ). Voir :

:help window-moving

pour plus d'informations.

18 votes

Cela devrait être la "meilleure réponse" - une fonctionnalité native, pas un Vimscript personnalisé.

2 votes

Pas complètement, non. Il y a beaucoup de cas d'utilisation qui ne peuvent pas être faits en utilisant la gestion des fenêtres intégrée sans détruire et recréer Windows. Le swap buffers script permet ces cas d'utilisation.

0 votes

Notez que ctl-w fonctionne également. ctl-W fermera Windows dans certains émulateurs de terminal.

7voto

hcs42 Points 5407

J'ai écrit et utilisé l'extrait de code suivant dans mon vimrc pour copier-coller mes fenêtres Vim. copier-coller mes fenêtres Vim.

Cela définit par exemple les raccourcis suivants :

  • <c-w>y : "Yanks the window", c'est-à-dire stocker le numéro du tampon dans la fenêtre actuelle fenêtre actuelle dans une variable globale.
  • <c-w>pp : "Met la fenêtre à la place de la fenêtre actuelle", c'est-à-dire qu'il lit le fichier numéro de tampon stocké précédemment et ouvre ce tampon dans la fenêtre courante. Il enregistre également le numéro du tampon qui se trouvait dans la fenêtre actuelle. actuelle.

Si par "permuter ces fenêtres en place", vous voulez dire "ouvrir le tampon de 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 clavier suivante pour permuter les fenêtres :

  1. Sélectionner la fenêtre A (soit avec la souris, soit avec les commandes du clavier)
  2. Appuyez sur <c-w>y (enlever le numéro du tampon)
  3. Sélectionnez la fenêtre B
  4. Appuyez sur <c-w>pp (collage du tampon)
  5. Sélectionnez la fenêtre A
  6. Appuyez sur <c-w>pp (en collant à nouveau le tampon)

Il 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

4voto

wes Points 2856

J'ai demandé à un question similaire à peu près au même moment : Je voulais un moyen de permuter spécifiquement Windows sans altérer une mise en page arbitrairement compliquée. J'ai fini par créer un plugin vim à partir de l'une des solutions proposées. Il s'appelle WindowSwap.vim installez-le avec votre gestionnaire de plugins vim préféré et essayez-le.

Avec WindowSwap.vim, vous devez simplement

  1. <Leader>yw pour tirer sur 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 la première.

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

2voto

Aman Dogra Points 31

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

  • ctrl-w w passer d'une fenêtre ouverte à l'autre
  • ctrl-w h focaliser la fenêtre vers la gauche
  • ctrl-w j focaliser la fenêtre vers le bas
  • ctrl-w k focaliser la fenêtre vers le haut
  • ctrl-w l focaliser 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

1voto

Bohr Points 450

Comme <c-w>r ou <c-w>x comporte une restriction selon laquelle il est impossible de faire pivoter ou d'échanger des fenêtres lorsque des 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, surtout si vous avez de nombreuses fenêtres.

Vous pouvez donc faire quelques travaux pour satisfaire vos besoins particuliers de commutation fenêtre/tampon. Voici un exemple de commutation de la fenêtre actuelle avec la fenêtre en haut à gauche (typiquement, je la fais maximiser 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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X