Emacs: apre un buffer con tutte le linee tra le linee da X a Y da un file enorme


10

Con lo stesso spirito di questa altra domanda: linea di gatto X alla linea Y su un file enorme :

Esiste un modo per aprire all'interno di Emacs (e mostrare su un buffer) un determinato insieme di linee (ad esempio tutte le linee tra la linea Xe Y) da un enorme file di testo?

Ad esempio, aprire e mostrare in un buffer tutte le righe tra le righe 57890000 e 57890010 dal file huge.txt

Aggiornamento: sono interessato a una soluzione che almeno possa aprire le righe in sola lettura (solo a scopo di visualizzazione), anche se sarebbe fantastico se posso anche modificare le righe (e salvare nel file originale).


Vuoi solo vederlo o addirittura modificarlo?
Choroba,

1
Che ne dici dall'interno ed? 57890000,57890010p
Kevin,

Risposte:


7

Se vuoi aprire l'intero file (che richiede), ma mostrarne solo una parte nella finestra dell'editor, usa il restringimento . Seleziona la parte del buffer su cui vuoi lavorare e premi C-x n n( narrow-to-region). Dì "sì" se ricevi un prompt su un comando disabilitato. Premere C-x n w( widen) per visualizzare nuovamente l'intero buffer. Se si salva il buffer, viene selezionato il file completo: tutti i dati sono ancora lì, il restringimento limita solo ciò che vedi.

Se si desidera visualizzare una parte di un file, è possibile inserirlo nel buffer corrente shell-commandcon un argomento prefisso ( M-1 M-!); eseguire il comando appropriato per estrarre le righe desiderate , ad es <huge.txt tail -n +57890001 | head -n 11.

C'è anche una funzione Lisp insert-file-contentsche può richiedere un intervallo di byte. Puoi invocarlo con M-:( eval-expression):

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

Si noti che è possibile imbattersi nel limite di dimensioni intere (dipendente dalla versione e dalla piattaforma, controllare il valore di most-positive-fixnum).

In teoria sarebbe possibile scrivere una modalità Emacs che carica e salva parti di file in modo trasparente secondo necessità (anche se il limite sulle dimensioni intere renderebbe impossibile l'utilizzo di offset di file effettivi su macchine a 32 bit). L'unico sforzo in quella direzione che conosco è VLF (link GitHub qui ).


1

Potresti trovare utile questa combinazione perl ed elisp . Ti consente di reindirizzare i dati a un buffer. Le successive chiamate che utilizzano lo stesso nome buffer aggiungeranno le nuove righe allo stesso buffer.

Puoi "modificare" il buffer , ma la modifica non si riflette in alcun modo sull'origine (che è una pipe ) ... Non mostra alcun numero di riga, sebbene puoi modificare l'input per includere un prefisso numerato per ogni linea.

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

Nel buffer:

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

Oppure, con i numeri di riga aggiunti:

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

Nel buffer:

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

Ho trovato questo su uno StackOverflow Q / A


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.