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

时间:2013-01-27 05:08:07

标签: vim

有没有办法获得Vim缓冲区中的行数,不一定是当前的行数?

使用line('$'),可以获得当前缓冲区的最后一行的编号,从而得到行数。使用getbufline({expr}, 1 , '$'),可以获得{expr}给出的缓冲区的行字符串列表,列表大小为行数。

使用getbufline会产生在内存中复制整个文件的开销,只是为了得到它包含的行数。 line执行此任务,但仅适用于当前缓冲区。

这应该是从脚本完成的,而不是交互式地进行,并且如果可能的话,只需要line('$')的最小开销。

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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