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 X
et 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).
emacs
large-files
Amelio Vazquez-Reina
la source
la source
ed
?57890000,57890010p
Réponses:
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 surC-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-command
avec 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-contents
qui peut prendre une plage d'octets. Vous pouvez l'invoquer avecM-:
(eval-expression
):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 ).
la source
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.
Dans le tampon:
Ou, avec des numéros de ligne ajoutés:
Dans le tampon:
J'ai trouvé cela sur un StackOverflow Q / A
la source
Vous pouvez le faire avec View Large Files , un mode mineur emacs conçu exactement pour ce cas.
la source