emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-26 8579105: Don't fail to indent-sexp before a full


From: Noam Postavsky
Subject: [Emacs-diffs] emacs-26 8579105: Don't fail to indent-sexp before a full sexp (Bug#31984)
Date: Fri, 27 Jul 2018 20:14:43 -0400 (EDT)

branch: emacs-26
commit 857910539313c0f2d89fe5626a41f1abe6c33ca7
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>

    Don't fail to indent-sexp before a full sexp (Bug#31984)
    
    * lisp/emacs-lisp/lisp-mode.el (indent-sexp): Only signal error if the
    initial forward-sexp fails.  Suppress scan-error forn any of the
    forward-sexp calls after that.
    * test/lisp/emacs-lisp/lisp-mode-tests.el (indent-sexp-cant-go): New
    test.
---
 lisp/emacs-lisp/lisp-mode.el            | 24 ++++++++++++++++--------
 test/lisp/emacs-lisp/lisp-mode-tests.el | 11 +++++++++++
 2 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 44b2723..205c810 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -1199,14 +1199,22 @@ ENDPOS is encountered."
     (setq endpos (copy-marker
                   (if endpos endpos
                     ;; Get error now if we don't have a complete sexp
-                    ;; after point.  We actually look for a sexp which
-                    ;; ends after the current line so that we properly
-                    ;; indent things like #s(...).  This might not be
-                    ;; needed if Bug#15998 is fixed.
-                    (let ((eol (line-end-position)))
-                      (save-excursion (while (and (< (point) eol) (not (eobp)))
-                                        (forward-sexp 1))
-                                      (point))))))
+                    ;; after point.
+                    (save-excursion
+                      (let ((eol (line-end-position)))
+                        (forward-sexp 1)
+                        ;; We actually look for a sexp which ends
+                        ;; after the current line so that we properly
+                        ;; indent things like #s(...).  This might not
+                        ;; be needed if Bug#15998 is fixed.
+                        (condition-case ()
+                            (while (and (< (point) eol) (not (eobp)))
+                              (forward-sexp 1))
+                          ;; But don't signal an error for incomplete
+                          ;; sexps following the first complete sexp
+                          ;; after point.
+                          (scan-error nil)))
+                      (point)))))
     (save-excursion
       (while (let ((indent (lisp-indent-calc-next parse-state))
                    (ppss (lisp-indent-state-ppss parse-state)))
diff --git a/test/lisp/emacs-lisp/lisp-mode-tests.el 
b/test/lisp/emacs-lisp/lisp-mode-tests.el
index 0b052e9..30f606d 100644
--- a/test/lisp/emacs-lisp/lisp-mode-tests.el
+++ b/test/lisp/emacs-lisp/lisp-mode-tests.el
@@ -125,6 +125,17 @@ noindent\" 3
 #s(foo
    bar)\n"))))
 
+(ert-deftest indent-sexp-cant-go ()
+  "`indent-sexp' shouldn't error before a sexp."
+  ;; See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=31984#32.
+  (with-temp-buffer
+    (emacs-lisp-mode)
+    (insert "(())")
+    (goto-char (1+ (point-min)))
+    ;; Paredit calls `indent-sexp' from this position.
+    (indent-sexp)
+    (should (equal (buffer-string) "(())"))))
+
 (ert-deftest lisp-indent-region ()
   "Test basics of `lisp-indent-region'."
   (with-temp-buffer



reply via email to

[Prev in Thread] Current Thread [Next in Thread]