我现在在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)
如果您想彻底删除空的缓冲器,包括卸载的,考虑(小心!)替换bdelete用bwipeout(见
: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缓冲区(只要在窗口中显示任何其他空缓冲区)
我能想到的唯一一件事就是创建一个报告缓冲区是否为空的函数.像这样的东西:
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)
| 归档时间: |
|
| 查看次数: |
3442 次 |
| 最近记录: |