我如何遍历当前打开的缓冲区并说将缓冲区编号加载到vimscript中的数组中?

我知道vimscript中存在数组或类似的数据结构。
我知道每个缓冲区被分配了一个唯一的编号。
我的目标是将每个编号放入与缓冲区数量相同长度的数组中,即for i in number of open buffers: array[i] = #buffer
我想让array成为vimscript中的变量文件。

评论

到目前为止,您尝试过什么吗?您是否已阅读文档(:h:ls,:h缓冲区列表,:h:bnext,:h缓冲区)?您实际上想做什么?我认为您的问题将从更多细节中受益。

@statox用:bnext迭代是一个非常麻烦的解决方案-请参阅我的答案。否则,确实,像往常一样,在vim中,必须将文档读为(几乎)其中的所有内容。但是,在这种情况下,将要合并几个元素。我们需要熟悉:h函数和:h List中的十几个条目。

@statox我不知道vimscript,我希望能有一个快速的答案。我不知道该怎么做。你是否因为我的问题不够清楚而否决了我的问题?我会为您编辑。

@LucHermitte我同意:bnext不是要走的路,解决方案也不是很直接。我只是指出,在一个问题中进行最少的研究通常是一个好主意:这样,回答者就觉得自己在帮助自己,而不仅仅是做一些工作,因为OP懒于做。 @lsund:我并没有对你进行投票(我倾向于避免在没有充分理由的情况下对新用户的问题进行投票)我只是邀请你提供有关你已经研究的内容的更多细节:-)

#1 楼

如果使用:bnext和全部,则可以遍历缓冲区。我强烈反对这种方法。它会触发自动命令,并且您必须记住自己的位置。换句话说,它可能太慢了,而且副作用很多。如果可以的话,请远离。

直到现在,我的首选方法是在filter()上使用range(1, bufnr('$'))来保留我感兴趣的缓冲区(bufloaded()bufexists()buflisted())。这样可以:

:let buffers = filter(range(1, bufnr('$')), 'bufexists(v:val)')


我们甚至可以走得更远,并使用其他方法来过滤缓冲区列表:根据它们的名称或缓冲区变量(例如getbufvar(v:val, 'foo', sentinelvalue) =~ "regex for b:foo"))。

如您所见,有很多选择。入口点是filter(),其功能名称中带有buf-> :h *buf*()^D(如按ctrl + D的^D,以查看功能列表)这将返回一个列表字典:每个字典都充满了每个现有缓冲区的大量信息。获取现有缓冲区的另一种方法是:

:let buffers = map(copy(getbufinfo()), 'v:val.bufnr')


或列出的缓冲区具有

:let buffers = map(filter(copy(getbufinfo()), 'v:val.listed'), 'v:val.bufnr')


评论


我猜是E117:未知函数:getbufinfo意味着我的vim没有这个,对吗?

– qneill
18年8月8日在20:35

@qneill。确实,您必须恢复到较早的功能,或者升级您的vim版本。

–卢克·赫米特(Luc Hermitte)
18 Mar 9 '18 at 0:04

#2 楼

在neovim上,除了getbufinfo()之外,还可以使用

let buffers = nvim_list_bufs()


nvim_list_bufs