vim – 如何从一个文件读取行的范围到当前的缓冲区

我想从文件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] 

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

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

{range}引用当前文件中的目标,而不是源文件中的行的范围。

看来,经过一番实验

 :147,227r /path/to/foo/foo.c 

意思是在这个文件的第227行之后插入/path/to/foo/foo.c的内容。 即:它忽略了147。

您将需要:

 :r /path/to/foo/foo.c :d 228,$ :d 1,146 

三个步骤,但它会完成…

范围允许将命令应用于当前缓冲区中的一组行。

因此,读取指令的范围意味着将内容插入到当前文件中的位置,而不是要读取的文件的范围。

我只需要在我的代码项目中这样做,并做到这一点:

/path/to/foo/foo.c打开的缓冲区中:

 :147,227w export.txt 

在我正在使用的缓冲区中:

 :r export.txt 

在我的书中更容易…它需要打开两个文件,但是如果我导入一组线,我通常都会打开它们。 这个方法更通用,更容易记住,尤其是当我试图用g/<search_criteria/:.w >> export.txt或者其他一些更复杂的方式selectg/<search_criteria/:.w >> export.txt导出/导入更复杂的行。

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

 :r !head -20 xyz.xml 

将从xyz.xml的前20行读入光标所在的当前缓冲区

 :r !tail -10 xyz.xml 

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

头部和尾部命令速度非常快,因此即使将它们组合起来也可以比其他方法更快地处理非常大的文件。

 :r !head -700030 xyz.xml| tail -30 

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

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