如何在Vim中删除多个缓冲区?

假设我有多个文件在Vim中作为缓冲区打开。 这些文件有*.cpp*.h ,一些是*.xml 。 我想用:bd *.xmlclosures所有的XML文件。 但是,Vim不允许这样(E93:多个匹配…)。

有没有办法做到这一点?

PS我知道:bd file1 file2 file3作品。 所以我可以以某种方式评估*.xmlfile1.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