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

时间:2008-10-27 15:12:28

标签: vim

我想将文件foo.c中的第n1行 - > n2行读入当前缓冲区。

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

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

7 个答案:

答案 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或其他更复杂的选择行的方式导出/导入一组棘手的行。