我知道vimscript中存在数组或类似的数据结构。
我知道每个缓冲区被分配了一个唯一的编号。
我的目标是将每个编号放入与缓冲区数量相同长度的数组中,即
for i in number of open buffers: array[i] = #buffer
我想让
array
成为vimscript中的变量文件。#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
评论
到目前为止,您尝试过什么吗?您是否已阅读文档(:h:ls,:h缓冲区列表,:h:bnext,:h缓冲区)?您实际上想做什么?我认为您的问题将从更多细节中受益。@statox用:bnext迭代是一个非常麻烦的解决方案-请参阅我的答案。否则,确实,像往常一样,在vim中,必须将文档读为(几乎)其中的所有内容。但是,在这种情况下,将要合并几个元素。我们需要熟悉:h函数和:h List中的十几个条目。
@statox我不知道vimscript,我希望能有一个快速的答案。我不知道该怎么做。你是否因为我的问题不够清楚而否决了我的问题?我会为您编辑。
@LucHermitte我同意:bnext不是要走的路,解决方案也不是很直接。我只是指出,在一个问题中进行最少的研究通常是一个好主意:这样,回答者就觉得自己在帮助自己,而不仅仅是做一些工作,因为OP懒于做。 @lsund:我并没有对你进行投票(我倾向于避免在没有充分理由的情况下对新用户的问题进行投票)我只是邀请你提供有关你已经研究的内容的更多细节:-)