vim - 如何读取文件到当前缓冲区的行范围

Ama*_*ain 55 vim

我想从文件foo.c读取行n1-> n2到当前缓冲区.

我试过了: 147,227r /path/to/foo/foo.c

但我得到:"E16:无效范围",但我确定foo.c包含超过1000行.

小智 87

:r! sed -n 147,227p /path/to/foo/foo.c
Run Code Online (Sandbox Code Playgroud)


joe*_*dle 25

你可以在纯Vimscript中完成它,而不必使用像sed这样的外部工具:

:put =readfile('/path/to/foo/foo.c')[146:226]
Run Code Online (Sandbox Code Playgroud)

请注意,我们必须从行号中减少一个,因为数组从0开始,而行号从1开始.

缺点:此解决方案比接受的答案长7个字符,并且它将暂时消耗相对于其他文件大小的内存.


Ste*_*son 19

{range}指的是当前文件中的目标,而不是源文件中的行范围.

经过一些实验,似乎

:147,227r /path/to/foo/foo.c
Run Code Online (Sandbox Code Playgroud)

表示在此文件中插入第/path/to/foo/foo.c227行之后的内容.即:它忽略了147.


小智 7

发布的其他解决方案非常适合特定的行号。通常,您想从另一个文件的顶部或底部读取。在这种情况下,读取头或尾的输出非常快。例如 -

:r !head -20 xyz.xml
Run Code Online (Sandbox Code Playgroud)

将从xyz.xml的前20行读取到当前缓冲区中的光标所在的位置

:r !tail -10 xyz.xml 
Run Code Online (Sandbox Code Playgroud)

将从xyz.xml中的最后10行读入当前光标所在的缓冲区

head和tail命令的速度非常快,因此,对于大型文件,甚至将它们组合起来也比其他方法要快得多。

:r !head -700030 xyz.xml| tail -30
Run Code Online (Sandbox Code Playgroud)

将从文件xyz.xml中读取700000到700030的行号到当前缓冲区

即使对于相当大的文件,此操作也应该立即完成。