В том же духе, что и этот другой вопрос: cat line X - строка Y на огромном файле :
Есть ли способ открыть из Emacs (и показать в буфере) заданный набор строк (например, все строки между строкой X
и Y
) из огромного текстового файла?
Например, открыть и показать в буфере все строки между строками 57890000 и 57890010 из файла huge.txt
Обновление: меня интересует решение, которое по крайней мере может открывать строки только для чтения (только для целей отображения), хотя было бы здорово, если бы я мог также редактировать строки (и сохранять в исходном файле).
emacs
large-files
Амелио Васкес-Рейна
источник
источник
ed
?57890000,57890010p
Ответы:
Если вы хотите открыть весь файл (что требуется), но показать только его часть в окне редактора, используйте сужение . Выберите часть буфера, с которой вы хотите работать, и нажмите
C-x n n
(narrow-to-region
). Скажите «да», если вы получите запрос об отключенной команде. НажмитеC-x n w
(widen
), чтобы снова увидеть весь буфер. Если вы сохраните буфер, будет выбран весь файл: все данные все еще там, сужение только ограничивает то, что вы видите.Если вы хотите просмотреть часть файла, вы можете вставить его в текущий буфер
shell-command
с помощью префиксного аргумента (M-1 M-!
); выполните соответствующую команду, чтобы извлечь нужные строки , например<huge.txt tail -n +57890001 | head -n 11
.Существует также функция Lisp,
insert-file-contents
которая может принимать диапазон байтов. Вы можете вызвать его с помощьюM-:
(eval-expression
):Обратите внимание, что вы можете столкнуться с пределом целочисленного размера (зависит от версии и платформы, проверьте значение
most-positive-fixnum
).Теоретически было бы возможно написать режим Emacs, который загружает и сохраняет части файлов прозрачно по мере необходимости (хотя ограничение на целочисленные размеры сделает невозможным использование фактических смещений файлов на 32-битных машинах). Единственное усилие в этом направлении, о котором я знаю, это VLF (ссылка на GitHub здесь ).
источник
Вы можете найти эту комбинацию perl и elisp полезной. Это позволяет передавать данные в буфер. Последующие вызовы с использованием того же самого имени буфера добавят новые строки в тот же буфер.
Вы можете «отредактировать» буфер , но редактирование никоим образом не отражает обратно к источнику (который является каналом ) ... Он не показывает номеров строк, хотя вы можете настроить ввод, чтобы включить нумерованный префикс для каждого линия.
В буфере:
Или с добавленными номерами строк:
В буфере:
Я нашел это на StackOverflow Q / A
источник
Вы можете сделать это с помощью View Large Files , второстепенного режима emacs, предназначенного именно для этого случая.
источник