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 X
und 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.
emacs
large-files
Amelio Vazquez-Reina
quelle
quelle
ed
?57890000,57890010p
Antworten:
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 SieC-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-command
mit 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 mitM-:
(eval-expression
) aufrufen :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 ).
quelle
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.
Im Puffer:
Oder mit hinzugefügten Zeilennummern:
Im Puffer:
Ich habe dies in einem StackOverflow Q / A gefunden
quelle
Sie können dies mit View Large Files tun , einem Emacs-Minor-Modus, der genau für diesen Fall entwickelt wurde.
quelle