如何closuresvim中窗口中未显示的所有缓冲区?
我在vim中打开了一大堆缓冲区,其中只有一些在分割窗口或其他选项卡中打开。 有没有办法closures所有,但目前在这些拆分或制表符中可见的那些?
这里有一个可以放在.vimrc
的替代解决scheme:
function! Wipeout() " list of *all* buffer numbers let l:buffers = range(1, bufnr('$')) " what tab page are we in? let l:currentTab = tabpagenr() try " go through all tab pages let l:tab = 0 while l:tab < tabpagenr('$') let l:tab += 1 " go through all windows let l:win = 0 while l:win < winnr('$') let l:win += 1 " whatever buffer is in this window in this tab, remove it from " l:buffers list let l:thisbuf = winbufnr(l:win) call remove(l:buffers, index(l:buffers, l:thisbuf)) endwhile endwhile " if there are any buffers left, delete them if len(l:buffers) execute 'bwipeout' join(l:buffers) endif finally " go back to our original tab page execute 'tabnext' l:currentTab endtry endfunction
使用:call Wipeout()
。
还有另一个承担这一点。 使用Vim给出的例子来帮助tabpagebuflist()
获取出现在标签或窗口中的缓冲区列表。 我有我的.vimrc
下面
function! DeleteInactiveBufs() "From tabpagebuflist() help, get a list of all buffers in all tabs let tablist = [] for i in range(tabpagenr('$')) call extend(tablist, tabpagebuflist(i + 1)) endfor "Below originally inspired by Hara Krishna Dara and Keith Roberts "http://tech.groups.yahoo.com/group/vim/message/56425 let nWipeouts = 0 for i in range(1, bufnr('$')) if bufexists(i) && !getbufvar(i,"&mod") && index(tablist, i) == -1 "bufno exists AND isn't modified AND isn't in the list of buffers open in windows and tabs silent exec 'bwipeout' i let nWipeouts = nWipeouts + 1 endif endfor echomsg nWipeouts . ' buffer(s) wiped out' endfunction command! Bdi :call DeleteInactiveBufs()
添加到您的.vimrc:
function! CloseHiddenBuffers() let i = 0 let n = bufnr('$') while i < n let i = i + 1 if bufloaded(i) && bufwinnr(i) < 0 exe 'bd ' . i endif endwhile endfun
然后你可以这样做来closures隐藏的缓冲区:
:call CloseHiddenBuffers()
(你可能想要绑定一个键或一个命令。)
更新:
这是一个版本更新,以支持标签页。 (我自己不使用标签页,所以我没有意识到,bufwinnr只适用于当前页面上的窗口)。
function! CloseHiddenBuffers() " figure out which buffers are visible in any tab let visible = {} for t in range(1, tabpagenr('$')) for b in tabpagebuflist(t) let visible[b] = 1 endfor endfor " close any buffer that's loaded and not visible for b in range(1, bufnr('$')) if bufloaded(b) && !has_key(visible, b) exe 'bd ' . b endif endfor endfun
我知道为什么第二个脚本不能正常工作。
这是由于bufloaded()函数必须是bufexits()!
事实上,一个缓冲区删除不加载! 只要删除这个条件是可以的,但是当我们试图清除一个没有使用的缓冲区时,它会发出警告,所以我们必须使用bufexists(b)。
最终的解决scheme如下:
function! CloseHiddenBuffers() " Tableau pour memoriser la visibilite des buffers let visible = {} " Pour chaque onglet... for t in range(1, tabpagenr('$')) " Et pour chacune de ses fenetres... for b in tabpagebuflist(t) " On indique que le buffer est visible. let visible[b] = 1 endfor endfor " Pour chaque numero de buffer possible... for b in range(1, bufnr('$')) " Si b est un numero de buffer valide et qu'il n'est pas visible, on le " supprime. if bufexists(b) && !has_key(visible, b) " On ferme donc tous les buffers qui ne valent pas 1 dans le tableau et qui " sont pourtant charges en memoire. execute 'bwipeout' b endif endfor endfun
谢谢你。
有一个插件可以做到这一点,还有更多!
看看close-buffers.vim