我在vim中打开了一大堆缓冲区,其中只有少数缓冲区在分割窗口或其他选项卡上打开.有没有办法关闭除了其中一个分割或标签中当前可见的所有内容?
ato*_*les 26
还有另一种看法.使用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()
Run Code Online (Sandbox Code Playgroud)
too*_*php 21
以下是您可以选择的替代解决方案.vimrc:
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
Run Code Online (Sandbox Code Playgroud)
使用:call Wipeout().
将其添加到.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
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做来关闭隐藏的缓冲区:
:call CloseHiddenBuffers()
Run Code Online (Sandbox Code Playgroud)
(您可能希望将键或命令绑定到它.)
更新:
这是一个更新的版本,以支持标签页.(我自己不使用标签页,所以我没有意识到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
Run Code Online (Sandbox Code Playgroud)