我想从文件foo.c读取行n1-> n2到当前缓冲区.
我试过了: 147,227r /path/to/foo/foo.c
但我得到:"E16:无效范围",但我确定foo.c包含超过1000行.
:r! sed -n 147,227p /path/to/foo/foo.c
你可以在纯Vimscript中完成它,而不必使用像sed这样的外部工具:
:put =readfile('/path/to/foo/foo.c')[146:226]
请注意,我们必须从行号中减少一个,因为数组从0开始,而行号从1开始.
缺点:此解决方案比接受的答案长7个字符,并且它将暂时消耗相对于其他文件大小的内存.
{range}指的是当前文件中的目标,而不是源文件中的行范围.
经过一些实验,似乎
:147,227r /path/to/foo/foo.c
表示在此文件中插入第/path/to/foo/foo.c
227行之后的内容.即:它忽略了147.
发布的其他解决方案非常适合特定的行号。通常,您想从另一个文件的顶部或底部读取。在这种情况下,读取头或尾的输出非常快。例如 -
:r !head -20 xyz.xml
将从xyz.xml的前20行读取到当前缓冲区中的光标所在的位置
:r !tail -10 xyz.xml
将从xyz.xml中的最后10行读入当前光标所在的缓冲区
head和tail命令的速度非常快,因此,对于大型文件,甚至将它们组合起来也比其他方法要快得多。
:r !head -700030 xyz.xml| tail -30
将从文件xyz.xml中读取700000到700030的行号到当前缓冲区
即使对于相当大的文件,此操作也应该立即完成。