如何删除所有隐藏的缓冲区?

Pee*_*eja 21 vim

我喜欢用Vim运行'hidden'.但有时候,我有很多隐藏的缓冲区,我想杀死它们.我可以:bdelete对缓冲区列表中的每个隐藏缓冲区使用什么命令?

ZyX*_*ZyX 22

尝试以下功能:

function DeleteHiddenBuffers()
    let tpbl=[]
    call map(range(1, tabpagenr('$')), 'extend(tpbl, tabpagebuflist(v:val))')
    for buf in filter(range(1, bufnr('$')), 'bufexists(v:val) && index(tpbl, v:val)==-1')
        silent execute 'bwipeout' buf
    endfor
endfunction
Run Code Online (Sandbox Code Playgroud)

  • 我打算把它变成一个插件,但其他人做到了:https://github.com/arithran/vim-delete-hidden-buffers(唉,没有归属,虽然它显然是从这个答案中剪切和粘贴的)。 (3认同)
  • @ Rican7我打赌它不仅会破坏nerdtree.例如,Command-T打开它的缓冲区一次并且不期望它被关闭(或者,至少,在我碰巧遇到问题的过去版本之一中没想到它会被关闭).如果你看到这样的问题`&&!empty(getbufvar(v:val,"&buftype"))`可能有帮助.或者`&& index(["help",""],getbufvar(v:val,"&buftype"))!= -1`因为`:help`可能会产生一堆缓冲区. (2认同)

mog*_*rod 8

Extendend版本的@ZyX答案,跳过改性缓冲器,并输出已关闭缓冲器的数目。

function! DeleteHiddenBuffers()
  let tpbl=[]
  let closed = 0
  call map(range(1, tabpagenr('$')), 'extend(tpbl, tabpagebuflist(v:val))')
  for buf in filter(range(1, bufnr('$')), 'bufexists(v:val) && index(tpbl, v:val)==-1')
    if getbufvar(buf, '&mod') == 0
      silent execute 'bwipeout' buf
      let closed += 1
    endif
  endfor
  echo "Closed ".closed." hidden buffers"
endfunction
Run Code Online (Sandbox Code Playgroud)


Her*_*itz 5

这与Prince Goulash先前发布的功能略有不同.代码未经测试.它使用一个函数来解析:buffers命令的输出,其中包括隐藏缓冲区的'h'标记.如下所示:

function! DeleteHiddenBuffers()
    redir => buffersoutput
    buffers
    redir END
    let buflist = split(buffersoutput,"\n")
    for item in filter(buflist,"v:val[5] == 'h'")
            exec 'bdelete ' . item[:2]
    endfor
endfunction
Run Code Online (Sandbox Code Playgroud)