2009-10-07 35 views
38

我在vim中打开了一大堆缓冲区,只有其中的几个在分割窗口或其他选项卡中打开。有没有办法关闭除了当前可见的分割或制表符之外的所有分支?如何关闭在vim窗口中未显示的所有缓冲区?

+1

作为参考,我发现这个[雅虎的Vim组线程(http://tech.groups.yahoo.com/group/vim/message/56425)之前,我碰到这个来了SO问答。这里的答案更好,因为他们处理标签页。 – atomicules 2011-09-06 13:35:44

+1

Artem Nezvigin已将下面的无数解决方案改编成一个插件,[wipeout.vim](http://www.vim.org/scripts/script.php?script_id=4882) – 2014-03-03 19:17:31

回答

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 

使用:call Wipeout()

+1

这是否删除修改的缓冲区? – 2011-04-11 21:16:10

+0

atomules的答案工作,这一个删除标签中的缓冲区,似乎有奇怪的行为。 – 2014-03-25 18:46:13

+0

小心 - 'Wipeout()'将其他选项卡中的窗口(不是当前可见选项卡的选项卡)视为不可见。 – emallove 2014-09-29 18:40:23

8

添加到您的.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 

然后你就可以做到这一点,收隐藏的缓冲区:

: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 
+0

我可能错误地解释了我的问题 - m试图清理':ls'的输出,这个函数似乎没有这样做。 – 2009-10-08 06:48:01

+0

缺乏标签页支持还是其他?我已经添加了一个支持上面的标签页的版本。 – 2009-10-08 08:39:17

+0

这仍然不适合我。 – 2009-10-09 19:33:33

3

我知道为什么第二个脚本无法正常工作。

这是由于bufloaded()函数必须是bufexits()!

的确,要删除的缓冲区没有加载!只要删除这个条件是可以的,但是当我们试图清除一个未使用的缓冲区时它会发出警告,所以我们必须使用bufexists(b)。

最终的解决方案是:

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 

谢谢你。

+0

如果“bufloaded(b)”对于我们想要关闭的缓冲区完全错误,为什么不只是“if!bufloaded(b)”? – derenio 2013-11-08 14:20:59

+0

这样做的伎俩,但我很喜欢:Wipeout非常吸引人的命令! -nargs =?擦除呼叫CloseHiddenBuffers()' – expelledboy 2013-11-21 07:53:18

24

还有另外一件事情。使用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() 
+0

这打破了CommandT。我在运行Bdi后第一次激活CommandT时,得到“Vim :: DeletedBufferError:尝试引用已删除的缓冲区”。下次我尝试CommandTs键绑定时,根本没有任何反应,我的其他几个键绑定也停止工作。 – bobpaul 2015-04-16 19:40:45

+0

@bobpaul我不使用CommandT,但可以尝试在函数中使用'bdelete'而不是'bwipeout'。这可能会让CommandT变得更糟。 – atomicules 2015-04-17 11:35:03

+0

嗨原子尺,我想你的功能,我得到了一堆像这样的错误:http://trusktr.io:7777/isowiyirid.rb。有任何想法吗? – trusktr 2016-01-09 04:14:07

相关问题