62

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

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

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

4

7 回答 7

97
:r! sed -n 147,227p /path/to/foo/foo.c
于 2008-10-27T15:19:43.900 回答
31

您可以在纯 Vimscript 中执行此操作,而无需使用 sed 之类的外部工具:

:put =readfile('/path/to/foo/foo.c')[146:226]

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

缺点:此解决方案比接受的答案长 7 个字符。它将临时将整个文件读入内存,如果该文件很大,这可能是一个问题。

于 2014-01-22T08:24:52.270 回答
22

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

经过一些实验,似乎

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

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

于 2008-10-27T15:16:56.947 回答
12

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

: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 的行号到当前缓冲区

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

于 2017-07-10T11:55:29.703 回答
4

我只需要在我的代码项目中执行此操作并这样做:

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

:147,227w export.txt

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

:r export.txt

在我的书中要容易得多......它需要打开两个文件,但如果我要导入一组行,我通常都会让它们都打开。这种方法对我来说更通用,更容易记住,特别是如果我尝试使用g/<search_criteria/:.w >> export.txt或其他更复杂的选择线的方式导出/导入一组更复杂的线。

于 2014-01-15T06:13:04.047 回答
2

您将需要:

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

三个步骤,但它会完成它......

于 2008-10-27T15:23:28.557 回答
2

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

因此,读取指令的范围是指在当前文件中插入内容的位置,而不是您要读取的文件范围。

于 2013-06-18T09:56:38.853 回答