]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/lisp.el (end-of-defun): Ensure we move.
authorStefan Monnier <monnier@iro.umontreal.ca>
Tue, 20 May 2014 18:55:41 +0000 (14:55 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Tue, 20 May 2014 18:55:41 +0000 (14:55 -0400)
Fixes: debbugs:17274
lisp/ChangeLog
lisp/emacs-lisp/lisp.el

index 90335fda7063e540d646525d24cf40320767e8dd..33700a238e1b024d49f9f029aa278b4c5260f422 100644 (file)
@@ -1,3 +1,7 @@
+2014-05-20  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/lisp.el (end-of-defun): Ensure we move (bug#17274).
+
 2014-05-18  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * emacs-lisp/timer.el (timer-event-handler): Don't run if canceled
index 0487515a142f79e7cc0d621f69fc24d3dbe0af30..80366db33d5f6341ac94072a5a799d3f68858bbf 100644 (file)
@@ -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.