11

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

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

Usinggetbufline有在内存中复制整个文件的开销,只是为了获取它包含的行数。line完成这项工作,但仅适用于当前缓冲区。

这应该通过脚本完成,而不是交互方式,并且尽可能减少开销line('$')

4

1 回答 1

8

如果 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 的日志文件,第一个解决方案的速度比之前快 209 倍len(getbufline({expr}, 1, '$'))(0.000211 与 0.044122 秒)。请注意,缓冲区vim.buffers的索引从零开始,而不是从一开始。

于 2013-01-27T05:28:56.973 回答