Emacs: abra un búfer con todas las líneas entre las líneas X a Y desde un archivo enorme

10

En el mismo espíritu que esta otra pregunta: línea de gato X a línea Y en un archivo enorme :

¿Hay alguna manera de abrir desde Emacs (y mostrar en un búfer) un conjunto dado de líneas (por ejemplo, todas las líneas entre la línea Xy Y) desde un archivo de texto enorme?

Por ejemplo, abrir y mostrar en un búfer todas las líneas entre las líneas 57890000 y 57890010 del archivo huge.txt

Actualización: estoy interesado en una solución que al menos pueda abrir las líneas en solo lectura (solo para fines de visualización), aunque sería genial si también puedo editar las líneas (y guardarlas en el archivo original).

Amelio Vazquez-Reina
fuente
¿Solo quieres verlo o incluso editarlo?
choroba
1
¿Qué tal desde dentro ed? 57890000,57890010p
Kevin

Respuestas:

7

Si desea abrir todo el archivo (lo cual requiere), pero muestra solo una parte de él en la ventana del editor, use el estrechamiento . Seleccione la parte del búfer en la que desea trabajar y presione C-x n n( narrow-to-region). Diga "sí" si recibe un mensaje sobre un comando deshabilitado. Presione C-x n w( widen) para ver todo el búfer nuevamente. Si guarda el búfer, se selecciona el archivo completo: todos los datos siguen ahí, el estrechamiento solo restringe lo que ve.

Si desea ver una parte de un archivo, puede insertarlo en el búfer actual shell-commandcon un argumento prefijo ( M-1 M-!); ejecute el comando apropiado para extraer las líneas deseadas , por ejemplo <huge.txt tail -n +57890001 | head -n 11.

También hay una función Lisp insert-file-contentsque puede tomar un rango de bytes. Puedes invocarlo con M-:( eval-expression):

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

Tenga en cuenta que puede encontrarse con el límite de tamaño entero (depende de la versión y la plataforma, verifique el valor de most-positive-fixnum).

En teoría, sería posible escribir un modo Emacs que cargue y guarde partes de archivos de forma transparente según sea necesario (aunque el límite en los tamaños de enteros haría imposible el uso de compensaciones de archivos reales en máquinas de 32 bits). El único esfuerzo en esa dirección que conozco es VLF (enlace de GitHub aquí ).

Gilles 'SO- deja de ser malvado'
fuente
1

Puede encontrar útil esta combinación perl y elisp . Le permite canalizar datos a un búfer. Las invocaciones posteriores que usen el mismo nombre de búfer agregarán las nuevas líneas al mismo búfer.

Puede "editar" el búfer , pero la edición de ninguna manera se refleja en la fuente (que es una tubería ) ... No muestra ningún número de línea, aunque puede ajustar la entrada para incluir un prefijo numerado para cada línea.

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

En el búfer:

<<<<< 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

O, con números de línea agregados:

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

En el búfer:

<<<<< 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

Encontré esto en un StackOverflow Q / A

Peter.O
fuente