Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除Vim中的所有空缓冲区?_Vim - Fatal编程技术网

如何删除Vim中的所有空缓冲区?

如何删除Vim中的所有空缓冲区?,vim,Vim,我现在有120个缓冲器在Vim中打开。大约50%的缓冲区是空文件。我想以某种方式使用:bufdo关闭所有空缓冲区的命令。我有没有办法说: :bufdo! ‹cmd› 其中嫀cmd›是一个条件命令,如果当前缓冲区的长度/大小为零,则该命令将删除当前缓冲区。我唯一能想到的是创建一个 报告缓冲区是否为空。大概是这样的: function! BufferIsEmpty() return line('$') == 1 && getline(1) == '' endfunctio

我现在有120个缓冲器在Vim中打开。大约50%的缓冲区是空文件。我想以某种方式使用
:bufdo关闭所有空缓冲区的命令。我有没有办法说:

:bufdo! ‹cmd›

其中
嫀cmd›
是一个条件命令,如果当前缓冲区的长度/大小为零,则该命令将删除当前缓冲区。

我唯一能想到的是创建一个 报告缓冲区是否为空。大概是这样的:

function! BufferIsEmpty()
    return line('$') == 1 && getline(1) == '' 
endfunction

因为它不允许影响缓冲区列表 一个
:bufdo
-参数命令(请参见
:help:bufdo
),我们有 使用更加冗长但相当简单的Vim脚本

下面的函数枚举所有现有缓冲区编号并删除 那些没有名称(显示为
[无名称]
的 接口)或任何未保存的更改。后一个条件是有保证的 通过调用
: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
请注意,
bufexists()
在此处更改为
bufloaded()
。它是 必要的,因为可以只获取这些文件的内容 加载的缓冲区;对于卸载的缓冲区
getbufline()
返回
一个空列表,无论其内容如何。

我一直在使用以下函数来完成此工作:

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
函数!s:CleanEmptyBuffers()

让buffers=filter(range(1,bufnr('$),'buflisted(v:val)&&empty(bufname(v:val))&&bufwinnr(v:val)类似条件:
line2byte(line(“$”)+1)@ZyX:Why不
line2byte(line('$)<2
?@ib
vim-u NONE-N-N-c'调用setline(“,”abc”);echo line2byte(line(“$”)“
注意
:bufdo
-参数命令不能添加或删除缓冲区(请参见
:help:bufdo
)。
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