mapping – ¿Existe una forma idiomática de leer cada línea en un búfer para procesarla línea por línea?

Pregunta:

En Python haría lo siguiente para procesar un archivo línea por línea:

with open(infile) as f:
    for line in f:
        process(line)

Al intentar buscar cómo hacer lo mismo en elisp (con búferes en lugar de archivos), no encontré una forma obvia.

(Lo que quiero terminar son dos estructuras de datos ordenadas de líneas, una con todas las líneas que coinciden con una expresión regular y la otra que contiene las que no coinciden).

Respuesta:

Hay varias formas de hacerlo. La forma de Kaushal se puede hacer un poco más eficiente, con:

(goto-char (point-min))
(while (not (eobp))
  (let ((line (buffer-substring (point)
                                (progn (forward-line 1) (point)))))
    ...))

Pero en Emacs es mucho más habitual trabajar en el búfer que en cadenas. Entonces, en lugar de extraer la cadena y luego trabajar en ella, simplemente haría:

(goto-char (point-min))
(while (not (eobp))
  ...
  (forward-line 1))

Además, si desea operar en una región en lugar de en todo el búfer, y si su "operación" incluye modificar el búfer, es frecuente hacerlo al revés (para que no le muerda el hecho de que el "fin "la posición de su región se mueve cada vez que modifica el búfer):

(goto-char end)
(while (> (point) start)
  ...
  (forward-line -1))

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım