Emacs: Öffnen Sie einen Puffer mit allen Zeilen zwischen den Zeilen X bis Y aus einer riesigen Datei

10

Im gleichen Sinne wie diese andere Frage: Katze Zeile X bis Zeile Y in einer riesigen Datei :

Gibt es eine Möglichkeit, aus Emacs heraus einen bestimmten Satz von Zeilen (z. B. alle Zeilen zwischen Zeile Xund Y) aus einer riesigen Textdatei zu öffnen (und in einem Puffer anzuzeigen) ?

ZB Öffnen Sie alle Zeilen zwischen den Zeilen 57890000 und 57890010 aus der Datei und zeigen Sie sie in einem Puffer an huge.txt

Update: Ich bin an einer Lösung interessiert, die zumindest die Zeilen schreibgeschützt öffnen kann (nur zu Anzeigezwecken), obwohl es großartig wäre, wenn ich die Zeilen auch bearbeiten (und in der Originaldatei speichern) könnte.

Amelio Vazquez-Reina
quelle
Dou möchten Sie es nur sehen oder sogar bearbeiten?
Choroba
1
Wie wäre es von innen ed? 57890000,57890010p
Kevin

Antworten:

7

Wenn Sie die gesamte Datei öffnen möchten (was erforderlich ist), aber nur einen Teil davon im Editorfenster anzeigen möchten, verwenden Sie die Verengung . Wählen Sie den Teil des Puffers aus, an dem Sie arbeiten möchten, und drücken Sie C-x n n( narrow-to-region). Sagen Sie "Ja", wenn Sie eine Eingabeaufforderung zu einem deaktivierten Befehl erhalten. Drücken Sie C-x n w( widen), um den gesamten Puffer erneut anzuzeigen. Wenn Sie den Puffer speichern, wird die vollständige Datei ausgewählt: Alle Daten sind noch vorhanden. Durch die Verengung wird nur das eingeschränkt, was Sie sehen.

Wenn Sie einen Teil einer Datei anzeigen möchten, können Sie ihn shell-commandmit einem Präfixargument ( M-1 M-!) in den aktuellen Puffer einfügen . Führen Sie den entsprechenden Befehl aus, um die gewünschten Zeilen zu extrahieren , z <huge.txt tail -n +57890001 | head -n 11.

Es gibt auch eine Lisp-Funktion insert-file-contents, die einen Bytebereich annehmen kann. Sie können es mit M-:( eval-expression) aufrufen :

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

Beachten Sie, dass Sie möglicherweise auf die Größenbeschränkung für Ganzzahlen stoßen (version- und plattformabhängig, überprüfen Sie den Wert von most-positive-fixnum).

Theoretisch wäre es möglich, einen Emacs-Modus zu schreiben, der Teile von Dateien nach Bedarf transparent lädt und speichert (obwohl die Begrenzung der Ganzzahlgröße die Verwendung tatsächlicher Datei-Offsets auf 32-Bit-Computern unmöglich machen würde). Die einzige Anstrengung in diese Richtung, die ich kenne, ist VLF (GitHub-Link hier ).

Gilles 'SO - hör auf böse zu sein'
quelle
1

Diese Kombination aus Perl und Elisp ist möglicherweise hilfreich. Sie können Daten an einen Puffer weiterleiten. Bei nachfolgenden Aufrufen mit demselben Puffernamen werden die neuen Zeilen an denselben Puffer angehängt.

Sie können den Puffer "bearbeiten" , aber die Bearbeitung spiegelt sich in keiner Weise in der Quelle (die eine Pipe ist ) wider ... Es werden keine Zeilennummern angezeigt, obwohl Sie die Eingabe so anpassen können, dass für jede ein nummeriertes Präfix enthalten ist Linie.

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

Im Puffer:

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

Oder mit hinzugefügten Zeilennummern:

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

Im Puffer:

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

Ich habe dies in einem StackOverflow Q / A gefunden

Peter.O
quelle
1

Sie können dies mit View Large Files tun , einem Emacs-Minor-Modus, der genau für diesen Fall entwickelt wurde.

Echsecutor
quelle