Emacs: відкрийте буфер із усіма рядками між рядками X до Y з величезного файлу


10

У такому ж дусі, як і це інше питання: котяча лінія X до рядка Y на величезному файлі :

Чи є спосіб відкрити зсередини Emacs (і показати на буфері) заданий набір рядків (наприклад, всі рядки між рядком Xі Y) з величезного текстового файлу?

Наприклад, відкрийте та покажіть у буфері всі рядки між рядками 57890000 та 57890010 з файлу huge.txt

Оновлення: мене цікавить рішення, яке принаймні може відкривати рядки лише для читання (лише для цілей відображення), хоча було б чудово, якщо я також можу редагувати рядки (і зберегти у вихідний файл).


Ду, ви лише хочете його побачити або навіть відредагувати?
choroba

1
Як щодо всередині ed? 57890000,57890010p
Кевін

Відповіді:


7

Якщо ви хочете відкрити весь файл (що вимагає), але показати лише його частину у вікні редактора, використовуйте звуження . Виберіть частину буфера, над яким потрібно працювати, і натисніть 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):

(insert-file-contents "huge.txt" nil 456789000 456791000)

Зауважте, що ви можете зіткнутися з цілим обмеженням розміру (залежно від версії та платформи, перевірте значення most-positive-fixnum).

Теоретично можна було б створити режим Emacs, який завантажує та зберігає частини файлів прозоро за потребою (хоча обмеження на цілі розміри унеможливить використання фактичних зрушень файлів на 32-бітних машинах). Єдине зусилля в тому напрямку, про яке я знаю, - це VLF (посилання GitHub тут ).


1

Ви можете вважати цю комбінацію perl та elisp корисною. Це дозволяє передавати дані в буфер. Подальші виклики, використовуючи те саме ім’я буфера, додадуть нові рядки до того ж буфера.

Ви можете "редагувати" буфер , але редагування жодним чином не відображається назад до джерела (яке є трубою ) ... Він не показує жодних номерів рядків, хоча ви можете налаштувати вхід, щоб включити нумерований префікс для кожного рядок.

from=50000000
  to=50000010
<file_50 head -n "$to" | tail -n +"$from" | e-sink.pl

У буфері:

<<<<< start: 2012-09-09T01:39:49
1000000
VSjU K97X5Z dFcc ZZd2OqQ PzbnphT
yQBTt LOic Ks sPXrq tty oy
dA8 SD BvO daZ KFPr44X
X0m3BI eR4go YjFp7e vbJr3oe Y0OGgH3 uPfz yfq59
we rm L9iD ugcJBND daS

7pO lwUFzNE HPlPW fmPZ vpRs Rx EFeHaFM
b0 1B ncr Db324 vwO Un34R
HDZS wq9zg W013 5JGly
kAfP QPpjjyh pXMAw I1 CGKDc23 qCBnP
<<<<<   end: 0.630s

Або з доданими номерами рядків:

from=50000000
  to=50000010
<file_50 head -n "$to" | tail -n +"$from" | nl -v$from -ba -w${#to} | e-sink.pl

У буфері:

<<<<< start: 2012-09-09T01:53:44
50000000    1000000
50000001    VSjU K97X5Z dFcc ZZd2OqQ PzbnphT
50000002    yQBTt LOic Ks sPXrq tty oy
50000003    dA8 SD BvO daZ KFPr44X
50000004    X0m3BI eR4go YjFp7e vbJr3oe Y0OGgH3 uPfz yfq59
50000005    we rm L9iD ugcJBND daS
50000006    
50000007    7pO lwUFzNE HPlPW fmPZ vpRs Rx EFeHaFM
50000008    b0 1B ncr Db324 vwO Un34R
50000009    HDZS wq9zg W013 5JGly
50000010    kAfP QPpjjyh pXMAw I1 CGKDc23 qCBnP
<<<<<   end: 0.768s

Я знайшов це на StackOverflow Q / A


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.