Emacs: ouvrir un tampon avec toutes les lignes entre les lignes X à Y à partir d'un énorme fichier


10

Dans le même esprit que cette autre question: ligne de chat X à ligne Y sur un énorme fichier :

Existe-t-il un moyen d'ouvrir depuis Emacs (et d'afficher sur un tampon) un ensemble donné de lignes (par exemple toutes les lignes entre la ligne Xet Y) à partir d'un énorme fichier texte?

Par exemple, ouvrir et afficher dans un tampon toutes les lignes entre les lignes 57890000 et 57890010 du fichier huge.txt

Mise à jour: je suis intéressé par une solution qui au moins peut ouvrir les lignes en lecture seule (uniquement à des fins d'affichage), bien que ce serait génial si je pouvais également modifier les lignes (et les enregistrer dans le fichier d'origine).


Souhaitez-vous seulement le voir, ou même le modifier?
choroba

1
Et de l'intérieur ed? 57890000,57890010p
Kevin

Réponses:


7

Si vous souhaitez ouvrir tout le fichier (ce qui nécessite), mais n'en afficher qu'une partie dans la fenêtre de l'éditeur, utilisez le rétrécissement . Sélectionnez la partie du tampon sur laquelle vous souhaitez travailler et appuyez sur C-x n n( narrow-to-region). Dites «oui» si vous obtenez une invite concernant une commande désactivée. Appuyez sur C-x n w( widen) pour voir à nouveau tout le tampon. Si vous enregistrez le tampon, le fichier complet est sélectionné: toutes les données sont toujours là, le rétrécissement ne restreint que ce que vous voyez.

Si vous souhaitez afficher une partie d'un fichier, vous pouvez l'insérer dans le tampon courant shell-commandavec un argument prefix ( M-1 M-!); exécutez la commande appropriée pour extraire les lignes souhaitées , par exemple <huge.txt tail -n +57890001 | head -n 11.

Il existe également une fonction Lisp insert-file-contentsqui peut prendre une plage d'octets. Vous pouvez l'invoquer avec M-:( eval-expression):

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

Notez que vous pouvez rencontrer la limite de taille entière (dépendante de la version et de la plateforme, vérifiez la valeur de most-positive-fixnum).

En théorie, il serait possible d'écrire un mode Emacs qui charge et enregistre des parties de fichiers de manière transparente selon les besoins (bien que la limite sur les tailles entières rendrait impossible l'utilisation des décalages de fichiers réels sur les machines 32 bits). Le seul effort dans cette direction que je connaisse est VLF (lien GitHub ici ).


1

Vous pouvez trouver cette combinaison perl et elisp utile. Il vous permet de diriger les données vers un tampon. Les appels ultérieurs utilisant le même nom de tampon ajouteront les nouvelles lignes au même tampon.

Vous pouvez "éditer" le tampon , mais l'édition ne reflète en aucun cas la source (qui est un canal ) ... Elle n'affiche aucun numéro de ligne, bien que vous puissiez modifier l'entrée pour inclure un préfixe numéroté pour chaque ligne.

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

Dans le tampon:

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

Ou, avec des numéros de ligne ajoutés:

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

Dans le tampon:

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

J'ai trouvé cela sur un StackOverflow Q / A


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.