如何关闭vim中窗口中未显示的所有缓冲区?

Dre*_*ens 40 vim

我在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().

  • 这会删除修改的缓冲区吗? (2认同)

Lau*_*ves 9

将其添加到.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)


Nik*_*lic 6

有一个插件可以做到这一点,甚至更多!

查看close-buffers.vim