在我的Vimscript中,我想迭代所有/仅包含磁盘上文件的缓冲区。目前我正在这样做以获得一系列缓冲区ID:
filter(range(1, bufnr('$')), 'buflisted(v:val)')
然后我用以下方法测试每个缓冲区ID:
filereadable(fnamemodify(bufname(buffer_id), ':p'))
我已经阅读了关于buflisted,bufloaded和朋友的文档,但我还不清楚它们之间的区别。因此,我不确定上面的代码段是否最佳。
此外,这似乎是一个内置函数的常见任务,但我找不到。
这是最好的方式还是有更好的方法?
答案 0 :(得分:1)
我认为“常用方式”只是使用:bufdo
,并且在未命名的未加载文件的:write
上失败,但在插件中,最好进行更多检查。
你的方法对我来说很好。 :help 'buflisted'
说:
如果重置,它不会用于“:bnext”,“ls”,Buffers菜单等。 Vim为仅用于记忆的缓冲区重置此选项 文件名或标记。 Vim在开始编辑缓冲区时设置它。
因此,假设您的插件与:bufdo
类似,使用buflisted()
是正确的。
答案 1 :(得分:0)
我认为buffer_id - >文件名转换可以通过以下方式更好地完成:
expand('#' . buffer_id . ':p')
这可以与缓冲区列表组合成这个单行:
filter(range(1, bufnr('$')), 'buflisted(v:val) && filereadable(expand("#" . v:val . ":p"))')