How to delete multiple buffers in Vim?

后端 未结 8 1336
北恋
北恋 2021-01-29 18:51

Assuming I have multiple files opened as buffers in Vim. The files have *.cpp, *.h and some are *.xml. I want to close all the XML files w

8条回答
  •  长情又很酷
    2021-01-29 19:27

    I too had a need for this functionality all the time. This is the solution I have in my 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('')
    

    Now, I can just do :BW regex (e.g. :BW \.cpp$ and wipe all matching buffers that have match that pattern in their pathname.

    If you want to delete rather than wipe, you can of course replace exec 'bw ' . join(l:matchList, ' ') with exec 'bd ' . join(l:matchList, ' ')

提交回复
热议问题