113 votes

Comment supprimer plusieurs tampons dans Vim ?

En supposant que j'ai plusieurs fichiers ouverts comme tampons dans Vim. Les fichiers ont *.cpp , *.h et certains sont *.xml . Je veux fermer tous les fichiers XML avec :bd *.xml . Cependant, Vim ne le permet pas (E93 : More than one match...).

Y a-t-il un moyen de le faire ?

P.S. Je sais que :bd file1 file2 file3 travaux. Alors puis-je évaluer d'une manière ou d'une autre *.xml a file1.xml file2.xml file3.xml ?

179voto

Björn Steinbrink Points 706

Vous pouvez utiliser <C-a> pour terminer tous les matchs. Ainsi, si vous tapez :bd *.xml et puis appuyez sur <C-a> vim complètera la commande pour :bd file1.xml file2.xml file3.xml .

5voto

Habi Points 1929

Essayez le script ci-dessous. L'exemple est pour "txt", changez-le si nécessaire, par exemple en "xml". Les tampons modifiés ne sont pas supprimés. Appuyez sur \bd pour supprimer les tampons.

map <Leader>bd :bufdo call <SID>DeleteBufferByExtension("txt")

function!  <SID>DeleteBufferByExtension(strExt)
   if (matchstr(bufname("%"), ".".a:strExt."$") == ".".a:strExt )
      if (! &modified)
         bd
      endif
   endif
endfunction

[Edit] Idem sans :bufdo (comme demandé par Luc Hermitte, voir commentaire ci-dessous)

map <Leader>bd :call <SID>DeleteBufferByExtension("txt")

function!  <SID>DeleteBufferByExtension(strExt)
   let s:bufNr = bufnr("$")
   while s:bufNr > 0
       if buflisted(s:bufNr)
           if (matchstr(bufname(s:bufNr), ".".a:strExt."$") == ".".a:strExt )
              if getbufvar(s:bufNr, '&modified') == 0
                 execute "bd ".s:bufNr
              endif
           endif
       endif
       let s:bufNr = s:bufNr-1
   endwhile
endfunction

5voto

Luc Hermitte Points 14171

Vous pouvez utiliser ceci.

:exe 'bd '. join(filter(map(copy(range(1, bufnr('$'))), 'bufname(v:val)'), 'v:val =~ "\.xml$"'), ' ')

Il devrait être assez facile de l'ajouter à une commande.

function! s:BDExt(ext)
  let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && bufname(v:val) =~ "\.'.a:ext.'$"')
  if empty(buffers) |throw "no *.".a:ext." buffer" | endif
  exe 'bd '.join(buffers, ' ')
endfunction

command! -nargs=1 BDExt :call s:BDExt(<f-args>)

3voto

Kent Points 136

Moi aussi, j'avais besoin de cette fonctionnalité en permanence. C'est la solution que j'ai dans mon vimrc.

function! GetBufferList()
    return filter(range(1,bufnr('$')), 'buflisted(v:val)')
endfunction

function! GetMatchingBuffers(pattern)
    return filter(GetBufferList(), 'bufname(v:val) =~ a:pattern')
endfunction

function! WipeMatchingBuffers(pattern)
    let l:matchList = GetMatchingBuffers(a:pattern)

    let l:count = len(l:matchList)
    if l:count < 1
        echo 'No buffers found matching pattern ' . a:pattern
        return
    endif

    if l:count == 1
        let l:suffix = ''
    else
        let l:suffix = 's'
    endif

    exec 'bw ' . join(l:matchList, ' ')

    echo 'Wiped ' . l:count . ' buffer' . l:suffix . '.'
endfunction

command! -nargs=1 BW call WipeMatchingBuffers('<args>')

Maintenant, je peux juste faire :BW regex (par exemple :BW \.cpp$ et efface tous les tampons correspondants qui ont ce motif dans leur nom de chemin.

Si vous voulez supprimer plutôt qu'effacer, vous pouvez bien sûr remplacer exec 'bw ' . join(l:matchList, ' ') con exec 'bd ' . join(l:matchList, ' ')

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