有没有办法获得Vim缓冲区中的行数,不一定是当前的行数?
使用line('$')
,可以获得当前缓冲区的最后一行的编号,从而得到行数。使用getbufline({expr}, 1 , '$')
,可以获得{expr}
给出的缓冲区的行字符串列表,列表大小为行数。
使用getbufline
会产生在内存中复制整个文件的开销,只是为了得到它包含的行数。 line
执行此任务,但仅适用于当前缓冲区。
这应该是从脚本完成的,而不是交互式地进行,并且如果可能的话,只需要line('$')
的最小开销。
答案 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
中的缓冲区从零开始编制索引,而不是从一个开始。