Wednesday, April 25, 2007

Loop on lines in emacs (version 1)


(defmacro do-lines (args &rest body)
(let ((line (gensym "line-"))
(beg (gensym "beg-"))
(end (gensym "end-")))

`(let (,@args)
(save-excursion
(save-match-data
(goto-char (point-min))
(while (< (point) (point-max))
(setq ,beg (point))
(forward-line 1)
(setq ,end (point))
(setq ,line (buffer-substring-no-properties ,beg ,end))

(setq ,(car args) ,line)
(when ',(cdr args) (setq ,(cadr args) ,beg))
(when ',(cddr args) (setq ,(caddr args) ,end))

(progn ,@body)))))))

(let (lines)
(do-lines (l b e)
(push (cons l e) lines))
(reverse lines))

No comments: