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

pep*_*ico 8 vim

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

有了line('$')一个可以得到当前缓冲区的最后一行的数字,因此线量.有了getbufline({expr}, 1 , '$')一个可以得到由下式给出一个缓冲的行字符串列表{expr},该列表的大小是那么的行数.

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

这应该是从脚本完成的,而不是以交互方式完成,并且line('$')如果可能的话,开销最小.

ZyX*_*ZyX 6

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

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

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

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

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