Tôi cũng đã từng có nhu cầu về chức năng này. Đây là giải pháp tôi có trong vimrc của mình.
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>')
Bây giờ, tôi chỉ có thể làm :BW regex
(ví dụ: :BW \.cpp$
và xóa tất cả các bộ đệm phù hợp khớp với mẫu đó trong tên đường dẫn của chúng.
Nếu bạn muốn xóa thay vì xóa, tất nhiên bạn có thể thay thế exec 'bw ' . join(l:matchList, ' ')
bằngexec 'bd ' . join(l:matchList, ' ')
<tab>
chỉ cho phép bạn duyệt qua các trận đấu, đặt một mục nhập duy nhất trên dòng lệnh,<C-a>
thêm tất cả các trận đấu cùng một lúc.