2

在我的 Vimscript 中,我想遍历所有/仅包含磁盘上文件的缓冲区。目前我这样做是为了获取缓冲区 id 数组:

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

然后稍后我使用以下命令测试每个缓冲区 ID:

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

我已经阅读了关于buflisted、bufloaded 和friends 的文档,但我仍然不清楚它们之间的区别。因此,我不确定我上面的片段是否是最佳的。

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

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

4

2 回答 2

1

我猜“常用方式”只是使用:bufdo并让它失败:write未命名的、未持久的文件,但在插件中,做更多检查是件好事。

你的方法对我来说很好。:help 'buflisted'说:

如果它被重置,它不会用于 ":bnext"、"ls"、缓冲区菜单等。这个选项由 Vim 重置,用于仅用于记住文件名或标记的缓冲区。Vim 在开始编辑缓冲区时设置它。

所以假设你的插件做了类似的事情:bufdo,使用buflisted()是正确的。

于 2013-03-19T10:27:26.347 回答
0

我认为 buffer_id -> 文件名转换可以通过以下方式更好地完成:

expand('#' . buffer_id . ':p')

这可以与缓冲区列表结合到这个单行中:

filter(range(1, bufnr('$')), 'buflisted(v:val) && filereadable(expand("#" . v:val . ":p"))')
于 2013-03-25T10:34:52.093 回答