]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't fail to indent-sexp before a full sexp (Bug#31984)
authorNoam Postavsky <npostavs@gmail.com>
Fri, 27 Jul 2018 23:41:39 +0000 (19:41 -0400)
committerNoam Postavsky <npostavs@gmail.com>
Fri, 27 Jul 2018 23:41:39 +0000 (19:41 -0400)
* 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
test/lisp/emacs-lisp/lisp-mode-tests.el

index 44b27236a9ca0a7636fa35e37d708125c338b584..205c810b978a8f980bfaa130390394fe463cb095 100644 (file)
@@ -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)))
index 0b052e9fc306d53d3ce3e7d3d15023cdbae7147e..30f606d3816b56e4d5adaeb3cef3eb5c5f5921d0 100644 (file)
@@ -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