获取包含真实文件的缓冲区列表的最佳方法是什么?

时间:2013-03-18 09:09:14

标签: vim

在我的Vimscript中,我想迭代所有/仅包含磁盘上文件的缓冲区。目前我正在这样做以获得一系列缓冲区ID:

filter(range(1, bufnr('$')), 'buflisted(v:val)')

然后我用以下方法测试每个缓冲区ID:

filereadable(fnamemodify(bufname(buffer_id), ':p'))

我已经阅读了关于buflisted,bufloaded和朋友的文档,但我还不清楚它们之间的区别。因此,我不确定上面的代码段是否最佳。

此外,这似乎是一个内置函数的常见任务,但我找不到。

这是最好的方式还是有更好的方法?

2 个答案:

答案 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"))')