如何在Vim中删除多个缓冲区?
假设我有多个文件在Vim中作为缓冲区打开。 这些文件有*.cpp , *.h ,一些是*.xml 。 我想用:bd *.xmlclosures所有的XML文件。 但是,Vim不允许这样(E93:多个匹配…)。 
有没有办法做到这一点?
  PS我知道:bd file1 file2 file3作品。 所以我可以以某种方式评估*.xml到file1.xml file2.xml file3.xml ? 
 您可以使用<Ca>完成所有匹配。 所以如果你input:bd *.xml ,然后点击<Ca> ,vim将完成命令:bd file1.xml file2.xml file3.xml 。 
你也可以使用:
  :.,$-bd[elete] " to delete buffers from the current one to last but one :%bd[elete] " to delete all buffers 
 :3,5bd[elete] 
将删除从3到5的缓冲区范围。
你可以使用这个。
 :exe 'bd '. join(filter(map(copy(range(1, bufnr('$'))), 'bufname(v:val)'), 'v:val =~ "\.xml$"'), ' ') 
将它添加到命令应该很容易。
 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>) 
试试下面的脚本。 示例是“txt”,根据需要更改它,例如“xml”。 修改的缓冲区不会被删除。 按\ bd删除缓冲区。
 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 
[编辑]同样没有:bufdo(根据Luc Hermitte的要求,见下面的评论)
 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 
我也一直需要这个function。 这是我在我的vimrc中的解决scheme。
 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>') 
 现在,我可以这样做:BW regex (例如:BW \.cpp$和擦除path名中匹配该模式的所有匹配缓冲区。 
 如果你想删除而不是擦除,你当然可以replaceexec 'bw ' . join(l:matchList, ' ')  exec 'bw ' . join(l:matchList, ' ') exec 'bd ' . join(l:matchList, ' ') exec 'bd ' . join(l:matchList, ' ') 
 非常简单:使用:bd[elete]命令。 例如, :bd[elete] buf#1 buf#5 buf#3将删除缓冲区1,3和5。 
从Vim 7.4.282开始,
TAB只会自动完成一个文件
使用<ca>自动完成所有文件。
你可以使用:
 bd filetype 
 那么只需使用<ca>便于完成指定文件types的所有打开文件。 
例如,你有1.xml,2.xml,3.xml和4.xml,你可以这样做:
 bd xml 
 然后按<ca> 
vim会自动为你完成如下:
 bd 1.xml 2.xml 3.xml 4.xml 
你可以按回车来完成这个命令。
如果您对上述文件中的一个进行了更改,请记住执行以下操作:
 bd! xml