如何在Vim中删除多个缓冲区?
假设我有多个文件在Vim中作为缓冲区打开。 这些文件有*.cpp
, *.h
,一些是*.xml
。 我想用:bd *.xml
closures所有的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