changeset 85463:771c063a16df

(easy-mmode-define-navigation): Add `body' arg. Cleanup the check-narrow-maybe/re-narrow-maybe mess.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sat, 20 Oct 2007 01:46:38 +0000
parents 43a9834cf1a6
children b8519672d451
files lisp/ChangeLog lisp/emacs-lisp/easy-mmode.el
diffstat 2 files changed, 35 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sat Oct 20 01:28:35 2007 +0000
+++ b/lisp/ChangeLog	Sat Oct 20 01:46:38 2007 +0000
@@ -1,5 +1,8 @@
 2007-10-20  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
+	Add `body' arg.  Cleanup the check-narrow-maybe/re-narrow-maybe mess.
+
 	* vc-bzr.el (vc-bzr-diff-tree):
 	* vc-git.el (vc-git-diff-tree):
 	* vc-hg.el (vc-hg-diff-tree):
@@ -7,8 +10,6 @@
 	* vc-mtn.el (vc-mtn-diff-tree):
 	* vc-svn.el (vc-svn-diff-tree): Remove.
 
-2007-10-20  Stefan Monnier  <monnier@iro.umontreal.ca>
-
 	* vc-mtn.el (vc-mtn-revision-completion-table):
 	* vc-cvs.el (vc-cvs-revision-completion-table):
 	* vc-arch.el (vc-arch-revision-completion-table):
--- a/lisp/emacs-lisp/easy-mmode.el	Sat Oct 20 01:28:35 2007 +0000
+++ b/lisp/emacs-lisp/easy-mmode.el	Sat Oct 20 01:46:38 2007 +0000
@@ -478,7 +478,8 @@
 ;;; easy-mmode-define-navigation
 ;;;
 
-(defmacro easy-mmode-define-navigation (base re &optional name endfun narrowfun)
+(defmacro easy-mmode-define-navigation (base re &optional name endfun narrowfun
+                                             &rest body)
   "Define BASE-next and BASE-prev to navigate in the buffer.
 RE determines the places the commands should move point to.
 NAME should describe the entities matched by RE.  It is used to build
@@ -488,17 +489,20 @@
   the next entry) and recentering if necessary.
 ENDFUN should return the end position (with or without moving point).
 NARROWFUN non-nil means to check for narrowing before moving, and if
-found, do `widen' first and then call NARROWFUN with no args after moving."
+found, do `widen' first and then call NARROWFUN with no args after moving.
+BODY is executed after moving to the destination location."
+  (declare (indent 5) (debug (exp exp exp def-form def-form &rest def-body)))
   (let* ((base-name (symbol-name base))
 	 (prev-sym (intern (concat base-name "-prev")))
 	 (next-sym (intern (concat base-name "-next")))
-         (check-narrow-maybe
-	  (when narrowfun
-	    '(setq was-narrowed
-		   (prog1 (or (< (- (point-max) (point-min)) (buffer-size)))
-		     (widen)))))
-         (re-narrow-maybe (when narrowfun
-                            `(when was-narrowed (,narrowfun)))))
+         (when-narrowed
+          (lambda (body)
+            (if (null narrowfun) body
+              `(let ((was-narrowed
+                      (prog1 (or (< (- (point-max) (point-min)) (buffer-size)))
+                        (widen))))
+                 ,body
+                 (when was-narrowed (,narrowfun)))))))
     (unless name (setq name base-name))
     `(progn
        (add-to-list 'debug-ignored-errors
@@ -509,33 +513,31 @@
 	 (unless count (setq count 1))
 	 (if (< count 0) (,prev-sym (- count))
 	   (if (looking-at ,re) (setq count (1+ count)))
-           (let (was-narrowed)
-             ,check-narrow-maybe
-             (if (not (re-search-forward ,re nil t count))
-                 (if (looking-at ,re)
-                     (goto-char (or ,(if endfun `(,endfun)) (point-max)))
-                   (error "No next %s" ,name))
-               (goto-char (match-beginning 0))
-               (when (and (eq (current-buffer) (window-buffer (selected-window)))
-                          (interactive-p))
-                 (let ((endpt (or (save-excursion
-                                    ,(if endfun `(,endfun)
-                                       `(re-search-forward ,re nil t 2)))
-                                  (point-max))))
-                   (unless (pos-visible-in-window-p endpt nil t)
-                     (recenter '(0))))))
-             ,re-narrow-maybe)))
+           ,(funcall when-narrowed
+             `(if (not (re-search-forward ,re nil t count))
+                  (if (looking-at ,re)
+                      (goto-char (or ,(if endfun `(,endfun)) (point-max)))
+                    (error "No next %s" ,name))
+                (goto-char (match-beginning 0))
+                (when (and (eq (current-buffer) (window-buffer (selected-window)))
+                           (interactive-p))
+                  (let ((endpt (or (save-excursion
+                                     ,(if endfun `(,endfun)
+                                        `(re-search-forward ,re nil t 2)))
+                                   (point-max))))
+                    (unless (pos-visible-in-window-p endpt nil t)
+                      (recenter '(0)))))))
+           ,@body))
        (put ',next-sym 'definition-name ',base)
        (defun ,prev-sym (&optional count)
 	 ,(format "Go to the previous COUNT'th %s" (or name base-name))
 	 (interactive "p")
 	 (unless count (setq count 1))
 	 (if (< count 0) (,next-sym (- count))
-           (let (was-narrowed)
-             ,check-narrow-maybe
-             (unless (re-search-backward ,re nil t count)
-               (error "No previous %s" ,name))
-             ,re-narrow-maybe)))
+           ,(funcall when-narrowed
+             `(unless (re-search-backward ,re nil t count)
+                (error "No previous %s" ,name)))
+           ,@body))
        (put ',prev-sym 'definition-name ',base))))