From: Stefan Monnier Date: Tue, 20 May 2014 18:55:41 +0000 (-0400) Subject: * lisp/emacs-lisp/lisp.el (end-of-defun): Ensure we move. X-Git-Tag: emacs-24.3.92~186 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=7b952d6142f5c611312761c0ad853deb453bbe88;p=emacs.git * lisp/emacs-lisp/lisp.el (end-of-defun): Ensure we move. Fixes: debbugs:17274 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 90335fda706..33700a238e1 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2014-05-20 Stefan Monnier + + * emacs-lisp/lisp.el (end-of-defun): Ensure we move (bug#17274). + 2014-05-18 Stefan Monnier * emacs-lisp/timer.el (timer-event-handler): Don't run if canceled diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el index 0487515a142..80366db33d5 100644 --- a/lisp/emacs-lisp/lisp.el +++ b/lisp/emacs-lisp/lisp.el @@ -373,16 +373,18 @@ is called as a function to find the defun's end." (push-mark)) (if (or (null arg) (= arg 0)) (setq arg 1)) (let ((pos (point)) - (beg (progn (end-of-line 1) (beginning-of-defun-raw 1) (point)))) + (beg (progn (end-of-line 1) (beginning-of-defun-raw 1) (point))) + (skip (lambda () + ;; When comparing point against pos, we want to consider that if + ;; point was right after the end of the function, it's still + ;; considered as "in that function". + ;; E.g. `eval-defun' from right after the last close-paren. + (unless (bolp) + (skip-chars-forward " \t") + (if (looking-at "\\s<\\|\n") + (forward-line 1)))))) (funcall end-of-defun-function) - ;; When comparing point against pos, we want to consider that if - ;; point was right after the end of the function, it's still - ;; considered as "in that function". - ;; E.g. `eval-defun' from right after the last close-paren. - (unless (bolp) - (skip-chars-forward " \t") - (if (looking-at "\\s<\\|\n") - (forward-line 1))) + (funcall skip) (cond ((> arg 0) ;; Moving forward. @@ -405,11 +407,19 @@ is called as a function to find the defun's end." (goto-char beg)) (unless (zerop arg) (beginning-of-defun-raw (- arg)) + (setq beg (point)) (funcall end-of-defun-function)))) - (unless (bolp) - (skip-chars-forward " \t") - (if (looking-at "\\s<\\|\n") - (forward-line 1))))) + (funcall skip) + (while (and (< arg 0) (>= (point) pos)) + ;; We intended to move backward, but this ended up not doing so: + ;; Try harder! + (goto-char beg) + (beginning-of-defun-raw (- arg)) + (if (>= (point) beg) + (setq arg 0) + (setq beg (point)) + (funcall end-of-defun-function) + (funcall skip))))) (defun mark-defun (&optional allow-extend) "Put mark at end of this defun, point at beginning.