From f9f34ece3da8c2c8c9983bb685ec5151f2955d93 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 12 Feb 2009 04:31:01 +0000 Subject: [PATCH] (end-of-defun): Rewrite, to use the ARG argument to beginning-of-defun-raw. --- lisp/ChangeLog | 3 ++ lisp/emacs-lisp/lisp.el | 74 +++++++++++++++++------------------------ 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 73f01a0daa6..614644b4940 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,8 @@ 2009-02-12 Stefan Monnier + * 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. diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el index b53c98acb7e..8c263881499 100644 --- a/lisp/emacs-lisp/lisp.el +++ b/lisp/emacs-lisp/lisp.el @@ -341,50 +341,36 @@ is called as a function to find the defun's end." (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. -- 2.39.5