# HG changeset patch # User Thien-Thi Nguyen # Date 1068826591 0 # Node ID a9d324df91c7448c8f14c76bc16e37a9e4102e32 # Parent 4cb0d5b004e977fbc51946888dcc2a4f3686164d (easy-mmode-define-navigation): Take additional optional arg NARROWFUN. For the generated functions: Add local var `was-narrowed-p'. Also, if NARROWFUN is specified, include frags that arrange to check for and save narrowing state before the move and then conditionally call NARROWFUN after the move. diff -r 4cb0d5b004e9 -r a9d324df91c7 lisp/emacs-lisp/easy-mmode.el --- a/lisp/emacs-lisp/easy-mmode.el Fri Nov 14 13:04:15 2003 +0000 +++ b/lisp/emacs-lisp/easy-mmode.el Fri Nov 14 16:16:31 2003 +0000 @@ -419,7 +419,7 @@ ;;; easy-mmode-define-navigation ;;; -(defmacro easy-mmode-define-navigation (base re &optional name endfun) +(defmacro easy-mmode-define-navigation (base re &optional name endfun narrowfun) "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 @@ -427,10 +427,20 @@ BASE-next also tries to make sure that the whole entry is visible by searching for its end (by calling ENDFUN if provided or by looking for the next entry) and recentering if necessary. -ENDFUN should return the end position (with or without moving point)." +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." (let* ((base-name (symbol-name base)) (prev-sym (intern (concat base-name "-prev"))) - (next-sym (intern (concat base-name "-next")))) + (next-sym (intern (concat base-name "-next"))) + (check-narrow-maybe (when narrowfun + '(setq was-narrowed-p + (prog1 (or (/= (point-min) 1) + (/= (point-max) + (1+ (buffer-size)))) + (widen))))) + (re-narrow-maybe (when narrowfun + `(when was-narrowed-p (,narrowfun))))) (unless name (setq name base-name)) `(progn (add-to-list 'debug-ignored-errors @@ -441,26 +451,33 @@ (unless count (setq count 1)) (if (< count 0) (,prev-sym (- count)) (if (looking-at ,re) (setq count (1+ count))) - (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)))))))) + (let (was-narrowed-p) + ,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))) (defun ,prev-sym (&optional count) ,(format "Go to the previous COUNT'th %s" (or name base-name)) (interactive) (unless count (setq count 1)) (if (< count 0) (,next-sym (- count)) - (unless (re-search-backward ,re nil t count) - (error "No previous %s" ,name))))))) + (let (was-narrowed-p) + ,check-narrow-maybe + (unless (re-search-backward ,re nil t count) + (error "No previous %s" ,name)) + ,re-narrow-maybe)))))) + (provide 'easy-mmode)