删除VIM中的所有空缓冲区

时间:2011-07-01 19:12:50

标签: vim

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

bufdo! (something)

(something)是条件命令,bdelete是当前缓冲区,如果该缓冲区的长度/大小为零?

3 个答案:

答案 0 :(得分:12)

由于不允许影响缓冲区列表 一个:bufdo - 参数命令(参见:help :bufdo),我们必须使用更多 罗嗦的单词,但是相当简单。

下面的函数枚举所有现有的缓冲区编号和删除 那些没有名字的人(显示为[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

如果要完全删除空缓冲区,包括卸载 那些,考虑(小心!)用bdelete替换bwipeout(参见 :help :bd:help :bw)。

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

if bufloaded(i) && bufname(i) == '' && getbufline(i, 1, 2) == ['']

请注意,此处bufexists()已更改为bufloaded()。它是 必要的,因为有可能只获取那些内容 加载的缓冲区(对于卸载的缓冲区getbufline()返回 空列表,无论其内容如何)。

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:6)

我唯一想到的就是创建一个报告缓冲区是否为空的函数。像这样:

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

" Test it like this:
echo BufferIsEmpty()