我现在在Vim中打开了120个缓冲区。这些缓冲区中约有50%是空文件。我想以某种方式使用bufdo!
来关闭所有空的缓冲区。有没有办法可以说:
bufdo! (something)
(something)
是条件命令,bdelete
是当前缓冲区,如果该缓冲区的长度/大小为零?
答案 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()