42 votes

Comment puis-je fermer tous les tampons qui ne sont pas affichés dans une fenêtre dans vim?

J'ai une horde de mémoires tampon ouvertes dans vim, dont quelques-unes seulement sont ouvertes dans des fenêtres divisées ou sur d'autres onglets. Existe-t-il un moyen de fermer tout sauf ceux qui sont actuellement visibles dans l'un de ces groupes ou onglets?

27voto

atomicules Points 1065

Encore une autre prise sur cela. Utilisation de l'exemple donné dans l'aide de Vim pour tabpagebuflist() pour obtenir une liste des mémoires tampons qui apparaissent dans un onglet ou une fenêtre. J'ai le dessous dans mes .vimrc

 function! DeleteInactiveBufs()
    "From tabpagebuflist() help, get a list of all buffers in all tabs
    let tablist = []
    for i in range(tabpagenr('$'))
        call extend(tablist, tabpagebuflist(i + 1))
    endfor

    "Below originally inspired by Hara Krishna Dara and Keith Roberts
    "http://tech.groups.yahoo.com/group/vim/message/56425
    let nWipeouts = 0
    for i in range(1, bufnr('$'))
        if bufexists(i) && !getbufvar(i,"&mod") && index(tablist, i) == -1
        "bufno exists AND isn't modified AND isn't in the list of buffers open in windows and tabs
            silent exec 'bwipeout' i
            let nWipeouts = nWipeouts + 1
        endif
    endfor
    echomsg nWipeouts . ' buffer(s) wiped out'
endfunction
command! Bdi :call DeleteInactiveBufs()
 

22voto

too much php Points 27983

Voici une solution alternative que vous pouvez ajouter à votre .vimrc :

 function! Wipeout()
  " list of *all* buffer numbers
  let l:buffers = range(1, bufnr('$'))

  " what tab page are we in?
  let l:currentTab = tabpagenr()
  try
    " go through all tab pages
    let l:tab = 0
    while l:tab < tabpagenr('$')
      let l:tab += 1

      " go through all windows
      let l:win = 0
      while l:win < winnr('$')
        let l:win += 1
        " whatever buffer is in this window in this tab, remove it from
        " l:buffers list
        let l:thisbuf = winbufnr(l:win)
        call remove(l:buffers, index(l:buffers, l:thisbuf))
      endwhile
    endwhile

    " if there are any buffers left, delete them
    if len(l:buffers)
      execute 'bwipeout' join(l:buffers)
    endif
  finally
    " go back to our original tab page
    execute 'tabnext' l:currentTab
  endtry
endfunction
 

Utilisez :call Wipeout() .

10voto

Laurence Gonsalves Points 50783

Ajoutez ceci à votre .vimrc:

 function! CloseHiddenBuffers()
  let i = 0
  let n = bufnr('$')
  while i < n
    let i = i + 1
    if bufloaded(i) && bufwinnr(i) < 0
      exe 'bd ' . i
    endif
  endwhile
endfun
 

Vous pouvez ensuite faire cela pour fermer les tampons cachés:

 :call CloseHiddenBuffers()
 

(Vous voudrez probablement lier une clé ou une commande à celle-ci.)

Mise à jour:

Voici une version mise à jour pour prendre en charge les pages à onglet. (Je n'utilise pas les pages à onglet moi-même, donc je n'avais pas réalisé que bufwinnr ne fonctionne que pour les fenêtres de la page actuelle).

 function! CloseHiddenBuffers()
  " figure out which buffers are visible in any tab
  let visible = {}
  for t in range(1, tabpagenr('$'))
    for b in tabpagebuflist(t)
      let visible[b] = 1
    endfor
  endfor
  " close any buffer that's loaded and not visible
  for b in range(1, bufnr('$'))
    if bufloaded(b) && !has_key(visible, b)
      exe 'bd ' . b
    endif
  endfor
endfun
 

3voto

fifou Points 39

Je sais pourquoi le second script ne fonctionne pas correctement.

Ceci est dû à la fonction bufloaded () qui doit être bufexits ()!

En effet, un tampon à supprimer n'est pas chargé! Supprimez simplement cette condition, mais vous avertissez lorsque nous essayons d'effacer un tampon non utilisé. Nous devons donc utiliser bufexists (b).

La solution finale est la suivante:

 function! CloseHiddenBuffers()
    " Tableau pour memoriser la visibilite des buffers                                                                                      
    let visible = {}
    " Pour chaque onglet...
    for t in range(1, tabpagenr('$'))
        " Et pour chacune de ses fenetres...
        for b in tabpagebuflist(t)
            " On indique que le buffer est visible.
            let visible[b] = 1
        endfor
    endfor
    " Pour chaque numero de buffer possible...
    for b in range(1, bufnr('$'))
        " Si b est un numero de buffer valide et qu'il n'est pas visible, on le
        " supprime.
        if bufexists(b) && !has_key(visible, b)
            " On ferme donc tous les buffers qui ne valent pas 1 dans le tableau et qui
            " sont pourtant charges en memoire.
            execute 'bwipeout' b
        endif
    endfor
endfun
 

Merci à toi.

0voto

Naga Kiran Points 2985

Jetez un coup d'oeil à ce plugin:

https://github.com/d11wtq/ctrlp_bdelete.vim

C'est une extension du plugin ctrlp où il permet également de sélectionner plusieurs tampons et de les supprimer tous à la fois.

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