vim - Как прочитать диапазон строк из файла в текущий буфер - PullRequest
53 голосов
/ 27 октября 2008

Я хочу прочитать строку n1-> n2 из файла foo.c в текущий буфер.

Я пытался: 147,227r /path/to/foo/foo.c

Но я получаю: «E16: Invalid range», хотя я уверен, что foo.c содержит более 1000 строк.

Ответы [ 7 ]

83 голосов
/ 27 октября 2008
:r! sed -n 147,227p /path/to/foo/foo.c
20 голосов
/ 22 января 2014

Вы можете сделать это в чистом Vimscript, без необходимости использования внешнего инструмента, такого как sed:

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

Обратите внимание, что мы должны уменьшить на единицу от номеров строк, поскольку массивы начинаются с 0, а номера строк начинаются с 1.

Недостатки : Это решение на 7 символов длиннее принятого ответа, и оно будет временно потреблять память относительно размера другого файла.

18 голосов
/ 27 октября 2008

{диапазон} относится к месту назначения в текущем файле, а не к диапазону строк в исходном файле.

После некоторых экспериментов кажется

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

означает вставить содержимое /path/to/foo/foo.c после строки 227. в этом файле. Т.е.: игнорируется 147.

5 голосов
/ 10 июля 2017

Другие опубликованные решения отлично подходят для конкретных номеров строк. Часто бывает, что вы хотите прочитать сверху или снизу другого файла. В этом случае чтение вывода головы или хвоста происходит очень быстро. Например -

:r !head -20 xyz.xml

Считает первые 20 строк из xyz.xml в текущий буфер, где находится курсор

:r !tail -10 xyz.xml 

Считает последние 10 строк из xyz.xml в текущий буфер, где находится курсор

Команды head и tail чрезвычайно быстры, поэтому даже объединение их может быть намного быстрее, чем другие подходы для очень больших файлов.

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

Считает номера строк от 700000 до 700030 из файла xyz.xml в текущий буфер

Эта операция должна выполняться мгновенно даже для довольно больших файлов.

2 голосов
/ 15 января 2014

Я просто должен был сделать это в моем проекте кода и сделал это так:

В буфере с /path/to/foo/foo.c открытым:

:147,227w export.txt

В буфере я работаю с:

:r export.txt

Гораздо проще в моей книге ... Требуется открыть оба файла, но если я импортирую набор строк, я обычно все равно открываю оба. Этот метод более общий и его легче запомнить, особенно если я пытаюсь экспортировать / импортировать более хитрый набор строк, используя g/<search_criteria/:.w >> export.txt или какой-либо другой более сложный способ выбора строк.

2 голосов
/ 18 июня 2013

Диапазон разрешает применение команды к группе строк в текущем буфере.

Таким образом, диапазон инструкции чтения означает, куда вставить содержимое в текущий файл, но не диапазон файла, который вы хотите прочитать.

2 голосов
/ 27 октября 2008

Вам понадобится:

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

Три шага, но это будет сделано ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...