web-dev-qa-db-fra.com

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

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.

118
mdrozdziel

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-Wr (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-Wx - échanger la fenêtre courante avec la suivante

  • Ctrl-WShift-H - déplacer cette fenêtre à l'extrême gauche

  • Ctrl-WShift-K - déplacer cette fenêtre vers le haut

(et de même pour Ctrl-WShift-J et Ctrl-WShift-L). Voir:

:help window-moving

pour plus d'informations.

287
DrAl

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:

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

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

  1. <Leader>yw pour ouvrir une fenêtre.
  2. Déplacez votre curseur dans une autre fenêtre.
  3. <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.

3
wes

À 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 ouvertes
  • ctrl-w h concentre 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 échange la fenêtre courante avec son voisin
  • ctrl-w H déplacer la fenêtre actuelle à l'extrême gauche
  • ctrl-w J déplace la fenêtre courante en bas
  • ctrl-w K déplace la fenêtre courante en haut
  • ctrl-w L déplacer la fenêtre actuelle à l'extrême droite
1
Aman Dogra

Comme <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>
1
Bohr