changeset 101957:db03a07a8e3e

(end-of-defun): Rewrite, to use the ARG argument to beginning-of-defun-raw.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Thu, 12 Feb 2009 04:31:01 +0000
parents 6ad8cdf501c1
children e2dc5f14229e
files lisp/ChangeLog lisp/emacs-lisp/lisp.el
diffstat 2 files changed, 33 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Thu Feb 12 04:16:14 2009 +0000
+++ b/lisp/ChangeLog	Thu Feb 12 04:31:01 2009 +0000
@@ -1,5 +1,8 @@
 2009-02-12  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* emacs-lisp/lisp.el (end-of-defun): Rewrite, to use the ARG argument
+	to beginning-of-defun-raw.
+
 	* emacs-lisp/lisp.el (end-of-defun): Don't skip to next line after
 	calling end-of-defun-function if it already moved to BOL.
 
--- a/lisp/emacs-lisp/lisp.el	Thu Feb 12 04:16:14 2009 +0000
+++ b/lisp/emacs-lisp/lisp.el	Thu Feb 12 04:31:01 2009 +0000
@@ -341,50 +341,36 @@
       (and transient-mark-mode mark-active)
       (push-mark))
   (if (or (null arg) (= arg 0)) (setq arg 1))
-  (while (> arg 0)
-    (let ((pos (point))
-	  retry-point)
-      (end-of-line 1)
-      (beginning-of-defun-raw 1)
-      (while (unless (eobp)
-               (funcall end-of-defun-function)
-               (unless (bolp)
-                 (skip-chars-forward " \t")
-                 (if (looking-at "\\s<\\|\n")
-                     (forward-line 1)))
-               ;; If we started after the end of the previous
-               ;; function, try again with the next one.
-               (unless (or (> (point) pos)
-			   (eq (point) retry-point))
-		 (or (bobp) (forward-char -1))
-		 (beginning-of-defun-raw -1)
-		 (setq retry-point (point)))))
-      ;; Ensure that we move forward.
-      (when (< (point) pos)
-	(goto-char pos)))
-    (setq arg (1- arg)))
-  (while (< arg 0)
-    (let ((pos (point)))
-      (while (unless (bobp)
-               (beginning-of-line 1)
-               (beginning-of-defun-raw 1)
-               (let ((beg (point))
-		     retry-point)
-                 (funcall end-of-defun-function)
-                 (unless (bolp)
-                   (skip-chars-forward " \t")
-                   (if (looking-at "\\s<\\|\n")
-                       (forward-line 1)))
-                 ;; If we started from within the function just found,
-                 ;; try again with the previous one.
-                 (unless (or (< (point) pos)
-			     (eq (point) retry-point))
-                   (goto-char beg)
-                   (setq retry-point (point))))))
-      ;; Ensure that we move backward.
-      (when (> (point) pos)
-	(goto-char pos)))
-    (setq arg (1+ arg))))
+  (let ((pos (point))
+        (beg (progn (end-of-line 1) (beginning-of-defun-raw 1) (point))))
+    (funcall end-of-defun-function)
+    (cond
+     ((> arg 0)
+      ;; Moving forward.
+      (if (> (point) pos)
+          ;; We already moved forward by one because we started from
+          ;; within a function.
+          (setq arg (1- arg))
+        ;; We started from after the end of the previous function.
+        (goto-char pos))
+      (unless (zerop arg)
+        (beginning-of-defun-raw (- arg))
+        (funcall end-of-defun-function)))
+     ((< arg 0)
+      ;; Moving backward.
+      (if (< (point) pos)
+          ;; We already moved backward because we started from between
+          ;; two functions.
+          (setq arg (1+ arg))
+        ;; We started from inside a function.
+        (goto-char beg))
+      (unless (zerop arg)
+        (beginning-of-defun-raw (- arg))
+        (funcall end-of-defun-function))))
+    (unless (bolp)
+      (skip-chars-forward " \t")
+      (if (looking-at "\\s<\\|\n")
+          (forward-line 1)))))
 
 (defun mark-defun (&optional allow-extend)
   "Put mark at end of this defun, point at beginning.