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