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

Можно попробовать сценарий оболочки (назовите его timer.sh) как это:

. timer.val

case "$1" in 
  start)
   echo $TIMERSTART
   echo "TIMERSTART=`date +%s`" > timer.val
   echo $TIMERSTART
   ;;
  stop)
   echo $TIMERSTART
   TIMEREND=`date +%s`
   echo $TIMEREND
   let RESULT=$TIMEREND-$TIMERSTART
   echo $RESULT
   ;;
  *)
   echo "no command"
esac
10
13.04.2017, 15:36
3 ответа

Если Вы хотите открыть целый файл (который требует), но покажите только часть его в окне редактора, используйте сужение. Выберите часть буфера, который Вы хотите продолжить работать и нажать 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 здесь).

7
27.01.2020, 20:03

Можно найти этот жемчуг и 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

1
27.01.2020, 20:03
[1184290] Это можно сделать с помощью [1184708] View Large Files [1184709], режим emacs minor, предназначенный именно для этого случая.[1184291].
1
27.01.2020, 20:03

Теги

Похожие вопросы