删除VIM中的所有空缓冲区

eee*_*aii 16 vim

我现在在Vim打开了120个缓冲区.这些缓冲区中约有50%是空文件.我想以某种方式使用bufdo!关闭所有空的缓冲区.有没有办法可以说:

bufdo! (something)
Run Code Online (Sandbox Code Playgroud)

当前缓冲区(something)的条件命令bdeleteIF在哪里,该缓冲区的长度/大小为零?

ib.*_*ib. 13

由于不允许使用:bufdo-argument命令影响缓冲区列表(请参阅参考资料:help :bufdo),因此我们必须使用更多罗嗦但相当简单的Vim脚本.

下面的函数枚举所有现有的缓冲区编号,并删除那些没有名称([No Name]在界面中显示)和任何未保存的更改.(后者由:bdelete命令保证 ,没有!符号,不删除修改后的缓冲区).

function! DeleteEmptyBuffers()
    let [i, n; empty] = [1, bufnr('$')]
    while i <= n
        if bufexists(i) && bufname(i) == ''
            call add(empty, i)
        endif
        let i += 1
    endwhile
    if len(empty) > 0
        exe 'bdelete' join(empty)
    endif
endfunction
Run Code Online (Sandbox Code Playgroud)

如果您想彻底删除空的缓冲器,包括卸载的,考虑(小心!)替换bdeletebwipeout(见 :help :bd,:help :bw).

要测试要删除的缓冲区的内容,请使用getbufline()function.例如,要绝对确保缓冲区中不包含任何文本,请按如下方式修改循环if内的语句while.

if bufloaded(i) && bufname(i) == '' && getbufline(i, 1, 2) == ['']
Run Code Online (Sandbox Code Playgroud)

请注意,这里bufexists()更改为bufloaded().这是必要的,因为只能获取加载的那些缓冲区的内容(对于卸载的缓冲区,getbufline()无论其内容如何都返回空列表).


Luc*_*tte 11

我一直在使用以下功能来完成这项工作:

function! s:CleanEmptyBuffers()
    let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && empty(bufname(v:val)) && bufwinnr(v:val)<0 && !getbufvar(v:val, "&mod")')
    if !empty(buffers)
        exe 'bw ' . join(buffers, ' ')
    endif
endfunction
Run Code Online (Sandbox Code Playgroud)

它与ib的版本非常相似,只是它单独留下了quickfix缓冲区(只要在窗口中显示任何其他空缓冲区)


Fre*_*ihl 6

我能想到的唯一一件事就是创建一个报告缓冲区是否为空的函数.像这样的东西:

function! BufferIsEmpty()
    if line('$') == 1 && getline(1) == '' 
        return 1
    else
        return 0
    endif
endfunction

" Test it like this:
echo BufferIsEmpty()
Run Code Online (Sandbox Code Playgroud)

  • 类似条件:`line2byte(line("$")+ 1)<= 2`. (2认同)