Подтвердить что ты не робот

Vim - Как читать диапазон строк из файла в текущий буфер

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

Я пробовал: 147,227r /path/to/foo/foo.c

Но я получаю: "E16: Недопустимый диапазон", хотя я уверен, что foo.c содержит более 1000 строк.

4b9b3361

Ответ 1

:r! sed -n 147,227p /path/to/foo/foo.c

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Вам нужно будет:

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

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

Ответ 5

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

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

Ответ 6

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

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

:147,227w export.txt

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

:r export.txt

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

Ответ 7

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

:r !head -20 xyz.xml

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

:r !tail -10 xyz.xml 

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

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

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

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

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