在Vim脚本中有没有办法获取缓冲区的行数?

5fjcxozz  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(101)

有没有一种方法可以得到Vim缓冲区中的行数,而不一定是当前的行数?
使用line('$'),可以获得当前缓冲区的最后一行的编号,从而获得行数量。用getbufline({expr}, 1 , '$')可以得到一个由{expr}给出的缓冲区的行字符串列表,列表的大小是行数。
使用getbufline的开销是在内存中复制整个文件,只是为了获得它包含的行数。line执行此任务,但仅适用于当前缓冲区。
这应该是从脚本中完成的,而不是交互式的,如果可能的话,与line('$')一样具有最小的开销。

yqhsw0fo

yqhsw0fo1#

如果vim是使用python支持编译的,并且不是旧版本,那么可以使用7.3.569

python import vim
let numlines=pyeval('len(vim.buffers['.({expr}-1).'])')

。对于支持python的旧版vim,您可以使用

python import vim
python vim.command('let numlines='+str(len(vim.buffers[int(vim.eval('{expr}'))-1])))

测试显示,对于11 MiB日志文件,第一种解决方案比len(getbufline({expr}, 1, '$'))快209倍(0.000211秒vs 0.044122秒)。请注意,vim.buffers中的缓冲区的索引从零开始,而不是从一开始。

fkaflof6

fkaflof62#

自Vim 8.1.1967(2019年9月)起,您可以将窗口ID作为第二个参数传递给line()。所以现在它只是:

line('$', bufwinid(bufnr))

其中bufnr是缓冲区编号。

相关问题