我想将文件foo.c中的第n1行 - > n2行读入当前缓冲区。
我试过了:147,227r /path/to/foo/foo.c
但我得到:“E16:无效范围”,但我确定foo.c包含超过1000行。
答案 0 :(得分:83)
:r! sed -n 147,227p /path/to/foo/foo.c
答案 1 :(得分:20)
您可以在纯Vimscript中完成,而无需使用像sed这样的外部工具:
:put =readfile('/path/to/foo/foo.c')[146:226]
请注意,我们必须从行号中减少一个,因为数组从0开始,而行号从1开始。
缺点:此解决方案比接受的答案长7个字符,并且它将暂时消耗相对于其他文件大小的内存。
答案 2 :(得分:18)
{range}指的是当前文件中的目的地,而不是源文件中的行范围。
经过一些实验,似乎
:147,227r /path/to/foo/foo.c
表示在此文件的第227行之后插入/path/to/foo/foo.c
的内容。,即:它忽略了147。
答案 3 :(得分:5)
发布的其他解决方案非常适合特定的行号。通常情况下,您想要从另一个文件的顶部或底部读取。在这种情况下,读取头部或尾部的输出非常快。例如 -
: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的行号到当前缓冲区
即使对于相当大的文件,此操作也应立即完成。
答案 4 :(得分:2)
您需要:
:r /path/to/foo/foo.c
:d 228,$
:d 1,146
三个步骤,但它会完成它......
答案 5 :(得分:2)
范围允许将命令应用于当前缓冲区中的一组行。
因此,读取指令的范围意味着在当前文件中插入内容的位置,而不是您要读取的文件范围。
答案 6 :(得分:2)
我只需要在我的代码项目中执行此操作并以此方式执行此操作:
在/path/to/foo/foo.c
打开的缓冲区中:
:147,227w export.txt
在缓冲区I中使用:
:r export.txt
我的书中更容易......它需要打开两个文件,但如果我导入一组行,我通常都会打开它们。这种方法对我来说更为通用且更容易记住,特别是如果我尝试使用g/<search_criteria/:.w >> export.txt
或其他更复杂的选择行的方式导出/导入一组棘手的行。