From: Noam Postavsky <npostavs@gmail.com>
To: 30891@debbugs.gnu.org
Subject: bug#30891: 26.0.91; indent of malformed lisp
Date: Tue, 20 Mar 2018 21:19:35 -0400 [thread overview]
Message-ID: <87y3imrzrs.fsf@gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1188 bytes --]
I recently got a private report about a problem with the new lisp indent
functions: they don't work well when the buffer contains syntax errors.
For example, indent-region in a buffer containing:
)
(+ 2
3)
gives
Debugger entered--Lisp error: (wrong-type-argument consp nil)
lisp-indent-calc-next(#s(lisp-indent-state :stack (nil) :ppss (0 nil nil nil nil nil 0 nil nil nil nil) :ppss-point 146))
lisp-indent-region(146 158)
indent-region(146 158 nil)
funcall-interactively(indent-region 146 158 nil)
call-interactively(indent-region nil nil)
command-execute(indent-region)
The error can be fixed with the patch below, I think it's safe for
emacs-26. But, it still gives wrong indentation if you do indent-region
on the latter two lines. That could be fixed with
(advice-add 'lisp-ppss :override
#'lisp-ppss-open-paren-in-column-0-is-defun-start)
The lisp-ppss-open-paren-in-column-0-is-defun-start function is included
(but uncalled) in the patch. Using it in the override suggested above
will bring back Bug#27920 though. We could include the function and
suggest to use it (with the aforementioned caveat) in etc/NEWS or
PROBLEMS perhaps?
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 1941 bytes --]
From da0916b591a983c9b4ee9c8201600a77ba506b92 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Sat, 17 Mar 2018 21:14:11 -0400
Subject: [PATCH v1] Handle indentation of malformed Lisp
* lisp/emacs-lisp/lisp-mode.el
(lisp-ppss-open-paren-in-column-0-is-defun-start): New function.
* lisp/emacs-lisp/lisp-mode.el (lisp-indent-calc-next): If we run out
of indent stack, reset the parse state.
---
lisp/emacs-lisp/lisp-mode.el | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index f082983d48..58710e9876 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -794,6 +794,21 @@ lisp-ppss
(parse-partial-sexp sexp-start pos nil nil (syntax-ppss sexp-start)))
pss)))
+(defun lisp-ppss-open-paren-in-column-0-is-defun-start (&optional pos)
+ (save-excursion
+ (if pos
+ (goto-char pos)
+ (setq pos (point)))
+ (or (looking-at-p "^(")
+ (re-search-backward "^(" nil t)
+ (goto-char (point-min)))
+ (let ((ppss (parse-partial-sexp (point) pos)))
+ (if (< (car ppss) 0)
+ ;; Too many close parens, probably syntax error. Give a
+ ;; fresh state.
+ (parse-partial-sexp (point) (point))
+ ppss))))
+
(cl-defstruct (lisp-indent-state
(:constructor nil)
(:constructor lisp-indent-initial-state
@@ -844,6 +859,10 @@ lisp-indent-calc-next
(prog1
(let (indent)
(cond ((= (forward-line 1) 1) nil)
+ ;; Negative depth, probably some kind of syntax error.
+ ((null indent-stack)
+ ;; Reset state.
+ (setq ppss (parse-partial-sexp (point) (point))))
((car indent-stack))
((integerp (setq indent (calculate-lisp-indent ppss)))
(setf (car indent-stack) indent))
--
2.11.0
next reply other threads:[~2018-03-21 1:19 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-21 1:19 Noam Postavsky [this message]
2018-03-21 6:50 ` bug#30891: 26.0.91; indent of malformed lisp Eli Zaretskii
2018-03-21 11:50 ` Noam Postavsky
2018-10-24 23:39 ` Noam Postavsky
2018-10-25 14:53 ` Eli Zaretskii
2018-10-25 22:04 ` Noam Postavsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y3imrzrs.fsf@gmail.com \
--to=npostavs@gmail.com \
--cc=30891@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).