如何关闭所有非';在vim的窗口中是否显示t?

如何关闭所有非';在vim的窗口中是否显示t?,vim,Vim,我在vim中打开了大量缓冲区,只有少数缓冲区在拆分窗口或其他选项卡上打开。是否有一种方法可以关闭其中一个拆分或选项卡中当前可见的部分以外的所有部分?将此添加到您的.vimrc中: function! CloseHiddenBuffers() let i = 0 let n = bufnr('$') while i < n let i = i + 1 if bufloaded(i) && bufwinnr(i) < 0 exe '

我在vim中打开了大量缓冲区,只有少数缓冲区在拆分窗口或其他选项卡上打开。是否有一种方法可以关闭其中一个拆分或选项卡中当前可见的部分以外的所有部分?

将此添加到您的.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
(您可能需要将密钥或命令绑定到它。)

更新:

这是一个更新的版本,支持标签页。(我自己不使用标签页,所以我没有意识到bufwinnr只适用于当前页面上的windows)


您可以在
.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
函数!消灭
“所有*缓冲区编号列表
设l:buffers=range(1,bufnr(“$”))
“我们在哪一页?
设l:currentTab=tabpagenr()
尝试
“浏览所有选项卡页
设l:tab=0
而l:tab

使用
:调用Wipeout()

我知道第二个脚本无法正常工作的原因

这是因为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

谢谢你。

这又是一次挑战。使用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()

有一个插件可以做到这一点,还有更多


查看

我的问题可能措辞不正确-我正在尝试清理
:ls
的输出,但此函数似乎没有这样做。是因为缺少选项卡页支持,还是其他原因?我在上面添加了一个支持标签页的版本。它以什么方式不起作用?(还有,你使用的是什么版本的vim?/me假装1.5年没有过去。。。我正在运行vim 7.3。我看不到任何后台缓冲区会随着您的函数运行而消失。
:ls
:call CloseHiddenBuffers
:ls
不会导致ls输出发生任何变化。这会删除修改过的缓冲区吗?原子规则的答案是有效的,这一个会删除选项卡中的缓冲区,并且似乎有奇怪的行为。小心-
擦除()
认为其他选项卡(不是当前可见选项卡的选项卡)中的窗口是不可见的。作为参考,我在遇到这一问题之前就发现了这一点。这里的答案更好,因为它们处理的是选项卡页面。Artem Nezvigin将下面的无数解决方案改编为插件,如果“bufloaded(b)”对于我们想要关闭的缓冲区来说是假的,为什么不只是“if!bufloaded(b)”?这就成功了,但我非常喜欢:Wipeout非常吸引人的
命令-纳格斯=?Wipeout调用CloseHiddenBuffers()
这会破坏命令。我在运行Bdi后第一次激活command时得到“Vim::DeletedBufferError:尝试引用已删除的缓冲区”。下次我尝试Commands keybinding时,什么都没有发生,我的其他几个keybinding也停止工作。@bobpaul我不使用CommandT,但您可以尝试在函数中使用
b删除
,而不是
b管道
。这可能不会让CommandT感到不安。嗨,atomicules,我正在尝试你的函数,我遇到了一系列类似这样的错误:。有什么想法吗?@trusktr抱歉,只是刚刚看到你的评论。您链接到的页面现在为空。从.rb扩展我猜这是另一个命令冲突?如果是这样的话,我真的无能为力,因为我没有使用它。@atomicules Oops,我想我的服务器会在某个特定的时间后删除粘贴(这主意不错,也许我可以添加一个选项来锁定它)。我尝试了你的函数,结果出错了。哦,现在没时间了。太棒了<代码>:CloseHiddenBuffers
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
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()