From 0c2ec7c634d9426d435bf783240eba2073140ef0 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Thu, 11 May 2017 18:12:40 -0400 Subject: [PATCH v1] Make sure indent-sexp stops at end of sexp (Bug#26878) * lisp/emacs-lisp/lisp-mode.el (indent-sexp): Check endpos before indenting. * test/lisp/emacs-lisp/lisp-mode-tests.el (indent-sexp-stop): New test. --- lisp/emacs-lisp/lisp-mode.el | 33 ++++++++++++++++++--------------- test/lisp/emacs-lisp/lisp-mode-tests.el | 14 ++++++++++++++ 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el index 2131597758..0b1ca3f2f9 100644 --- a/lisp/emacs-lisp/lisp-mode.el +++ b/lisp/emacs-lisp/lisp-mode.el @@ -1185,21 +1185,24 @@ indent-sexp ;; after point. (save-excursion (forward-sexp 1) (point))))) (save-excursion - (while (< (point) endpos) - (let ((indent (lisp-indent-calc-next parse-state))) - ;; If the line contains a comment indent it now with - ;; `indent-for-comment'. - (when (nth 4 (lisp-indent-state-ppss parse-state)) - (save-excursion - (goto-char (lisp-indent-state-ppss-point parse-state)) - (indent-for-comment) - (setf (lisp-indent-state-ppss-point parse-state) - (line-end-position)))) - ;; But not if the line is blank, or just a comment (we - ;; already called `indent-for-comment' above). - (skip-chars-forward " \t") - (unless (or (eolp) (eq (char-syntax (char-after)) ?<) (not indent)) - (indent-line-to indent))))) + (while (let ((indent (lisp-indent-calc-next parse-state)) + (ppss (lisp-indent-state-ppss parse-state))) + ;; If the line contains a comment indent it now with + ;; `indent-for-comment'. + (when (and (nth 4 ppss) (<= (nth 8 ppss) endpos)) + (save-excursion + (goto-char (lisp-indent-state-ppss-point parse-state)) + (indent-for-comment) + (setf (lisp-indent-state-ppss-point parse-state) + (line-end-position)))) + (when (< (point) endpos) + ;; Indent the next line, unless it's blank, or just a + ;; comment (we will `indent-for-comment' the latter). + (skip-chars-forward " \t") + (unless (or (eolp) (not indent) + (eq (char-syntax (char-after)) ?<)) + (indent-line-to indent)) + t)))) (move-marker endpos nil))) (defun indent-pp-sexp (&optional arg) diff --git a/test/lisp/emacs-lisp/lisp-mode-tests.el b/test/lisp/emacs-lisp/lisp-mode-tests.el index 1f78eb3010..f2fe7a6cf4 100644 --- a/test/lisp/emacs-lisp/lisp-mode-tests.el +++ b/test/lisp/emacs-lisp/lisp-mode-tests.el @@ -99,6 +99,20 @@ lisp-mode-tests--correctly-indented-sexp (indent-sexp) (should (equal (buffer-string) correct))))) +(ert-deftest indent-sexp-stop () + "Make sure `indent-sexp' stops at the end of the sexp." + ;; See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=26878. + (with-temp-buffer + (emacs-lisp-mode) + (insert "(a ()\n)") + (let ((original (buffer-string))) + (search-backward "a ") + (goto-char (match-end 0)) + (indent-sexp) + ;; The final paren should not be indented, because the sexp + ;; we're indenting ends on the previous line. + (should (equal (buffer-string) original))))) + (ert-deftest lisp-indent-region () "Test basics of `lisp-indent-region'." (with-temp-buffer -- 2.11.1