Fix (end-of-defun N) for N >= 2

* lisp/emacs-lisp/lisp.el (end-of-defun): Only skip to next line when
after end of defun when ARG is 1 or less.
* test/lisp/emacs-lisp/lisp-tests.el (end-of-defun-twice): New
test (bug#24427).
This commit is contained in:
Noam Postavsky 2020-08-11 16:02:11 +02:00 committed by Lars Ingebrigtsen
parent 2a47ef86e9
commit 9b9473ad75
2 changed files with 57 additions and 1 deletions

View file

@ -482,7 +482,8 @@ is called as a function to find the defun's end."
(if (looking-at "\\s<\\|\n")
(forward-line 1))))))
(funcall end-of-defun-function)
(funcall skip)
(when (<= arg 1)
(funcall skip))
(cond
((> arg 0)
;; Moving forward.

View file

@ -367,6 +367,61 @@ start."
"
"Test buffer for `mark-defun'."))
;;; end-of-defun
(ert-deftest end-of-defun-twice ()
"Test behavior of prefix arg for `end-of-defun' (Bug#24427).
Calling `end-of-defun' twice should be the same as a prefix arg
of two."
(setq last-command nil)
(cl-flet ((eod2 (lambda ()
(goto-char (point-min))
(end-of-defun)
(end-of-defun)
(let ((pt-eod2 (point)))
(goto-char (point-min))
(end-of-defun 2)
(should (= (point) pt-eod2))))))
(with-temp-buffer
(insert "\
\(defun a ())
\(defun b ())
\(defun c ())")
(eod2))
(with-temp-buffer
(insert "\
\(defun a ())
\(defun b ())
\(defun c ())")
(eod2)))
(elisp-tests-with-temp-buffer ";; Comment header
\(defun func-1 (arg)
\"docstring\"
body)
=!p1=
;; Comment before a defun
\(defun func-2 (arg)
\"docstring\"
body)
\(defun func-3 (arg)
\"docstring\"
body)
=!p2=(defun func-4 (arg)
\"docstring\"
body)
;; end
"
(goto-char p1)
(end-of-defun 2)
(should (= (point) p2))))
;;; mark-defun
(ert-deftest mark-defun-no-arg-region-inactive ()
"Test `mark-defun' with no prefix argument and inactive
region."