From: npostavs@users.sourceforge.net
To: Alexander Shukaev <emacs@Alexander.Shukaev.name>
Cc: 27306@debbugs.gnu.org
Subject: bug#27306: Regression: Emacs Lisp Indentation
Date: Sat, 10 Jun 2017 11:33:44 -0400 [thread overview]
Message-ID: <87a85fx3fr.fsf@users.sourceforge.net> (raw)
In-Reply-To: <88de418a-0e23-9ff7-5cea-cd2add2dab8c@Alexander.Shukaev.name> (Alexander Shukaev's message of "Sat, 10 Jun 2017 14:59:01 +0200")
[-- Attachment #1: Type: text/plain, Size: 458 bytes --]
tags 27306 patch
quit
Alexander Shukaev <emacs@Alexander.Shukaev.name> writes:
> In Emacs 26 series, a call to `indent-region' changes the above
> indentation to
>
> (user-error "Unexpected initialization file: `%s'
> Expected initialization file: `%s'"
> (abbreviate-file-name user-init-file)
> (abbreviate-file-name this-init-file))
>
> which appears wrong to me. Please, take a look at this. Thank you.
Thanks for reporting, here's a patch:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 4899 bytes --]
From 9e5c05a5cff6ab4eea5667792cf277c020b95426 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Sat, 10 Jun 2017 09:50:48 -0400
Subject: [PATCH v1] Fix wrong indentation after string literal (Bug#27306)
* lisp/emacs-lisp/lisp-mode.el (lisp-indent-state)
(lisp-indent-calc-next): Remove `depth' field, use (car ppss) instead.
* test/lisp/emacs-lisp/lisp-mode-tests.el
(lisp-indent-region-after-string-literal): New test.
---
lisp/emacs-lisp/lisp-mode.el | 27 +++++++++++++--------------
test/lisp/emacs-lisp/lisp-mode-tests.el | 13 +++++++++++++
2 files changed, 26 insertions(+), 14 deletions(-)
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 1e38d44e1b..59db00d5f9 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -773,11 +773,9 @@ (cl-defstruct (lisp-indent-state
(:constructor lisp-indent-initial-state
(&aux (ppss (lisp-ppss))
(ppss-point (point))
- (depth (car ppss))
- (stack (make-list (1+ depth) nil)))))
+ (stack (make-list (1+ (car ppss)) nil)))))
stack ;; Cached indentation, per depth.
ppss
- depth
ppss-point)
(defun lisp-indent-calc-next (state)
@@ -785,9 +783,11 @@ (defun lisp-indent-calc-next (state)
STATE is updated by side effect, the first state should be
created by `lisp-indent-initial-state'. This function may move
by more than one line to cross a string literal."
- (pcase-let (((cl-struct lisp-indent-state
- (stack indent-stack) ppss depth ppss-point)
- state))
+ (pcase-let* (((cl-struct lisp-indent-state
+ (stack indent-stack) ppss ppss-point)
+ state)
+ (indent-depth (car ppss)) ; Corresponding to indent-stack.
+ (depth indent-depth))
;; Parse this line so we can learn the state to indent the
;; next line.
(while (let ((last-sexp (nth 2 ppss)))
@@ -799,22 +799,22 @@ (defun lisp-indent-calc-next (state)
(if (and (not (nth 2 ppss)) (= depth (car ppss)))
(setf (nth 2 ppss) last-sexp)
(setq last-sexp (nth 2 ppss)))
+ (setq depth (car ppss))
;; Skip over newlines within strings.
(nth 3 ppss))
(let ((string-start (nth 8 ppss)))
- (setq ppss (parse-partial-sexp (point) (point-max)
- nil nil ppss 'syntax-table))
- (setf (nth 2 ppss) string-start)) ; Finished a complete string.
+ (setq ppss (parse-partial-sexp (point) (point-max)
+ nil nil ppss 'syntax-table))
+ (setf (nth 2 ppss) string-start) ; Finished a complete string.
+ (setq depth (car ppss)))
(setq ppss-point (point)))
(setq ppss-point (point))
- (let* ((next-depth (car ppss))
- (depth-delta (- next-depth depth)))
+ (let* ((depth-delta (- depth indent-depth)))
(cond ((< depth-delta 0)
(setq indent-stack (nthcdr (- depth-delta) indent-stack)))
((> depth-delta 0)
(setq indent-stack (nconc (make-list depth-delta nil)
- indent-stack))))
- (setq depth next-depth))
+ indent-stack)))))
(prog1
(let (indent)
(cond ((= (forward-line 1) 1) nil)
@@ -826,7 +826,6 @@ (defun lisp-indent-calc-next (state)
;; This only happens if we're in a string.
(t (error "This shouldn't happen"))))
(setf (lisp-indent-state-stack state) indent-stack)
- (setf (lisp-indent-state-depth state) depth)
(setf (lisp-indent-state-ppss-point state) ppss-point)
(setf (lisp-indent-state-ppss state) ppss))))
diff --git a/test/lisp/emacs-lisp/lisp-mode-tests.el b/test/lisp/emacs-lisp/lisp-mode-tests.el
index f2fe7a6cf4..582041cfc2 100644
--- a/test/lisp/emacs-lisp/lisp-mode-tests.el
+++ b/test/lisp/emacs-lisp/lisp-mode-tests.el
@@ -185,6 +185,19 @@ (ert-deftest lisp-indent-region-in-sexp ()
(indent-region (point) (point-max))
(should (equal (buffer-string) correct)))))
+(ert-deftest lisp-indent-region-after-string-literal ()
+ (with-temp-buffer
+ (insert "\
+\(user-error \"Unexpected initialization file: `%s'
+Expected initialization file: `%s'\"
+ (abbreviate-file-name user-init-file)
+ (abbreviate-file-name this-init-file))")
+ (let ((indent-tabs-mode nil)
+ (correct (buffer-string)))
+ (emacs-lisp-mode)
+ (indent-region (point-min) (point-max))
+ (should (equal (buffer-string) correct)))))
+
(provide 'lisp-mode-tests)
;;; lisp-mode-tests.el ends here
--
2.11.1
next prev parent reply other threads:[~2017-06-10 15:33 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-13 0:59 bug#25191: Redesign `recentf-menu-bar' logic and its callers Alexander Shukaev
2017-06-10 12:59 ` bug#27306: Regression: Emacs Lisp Indentation Alexander Shukaev
2017-06-10 15:33 ` npostavs [this message]
2017-06-13 11:27 ` npostavs
2017-06-16 7:39 ` Alexander Shukaev
2017-06-10 19:00 ` bug#27315: Regression: `abbreviate-file-name' and `tramp-file-name-handler' Alexander Shukaev
2017-06-11 9:13 ` Michael Albinus
2017-06-11 11:30 ` Alexander Shukaev
2017-06-12 15:59 ` Michael Albinus
2017-06-13 21:55 ` Alexander Shukaev
2017-06-14 12:38 ` Michael Albinus
2017-06-16 7:33 ` Alexander Shukaev
2017-06-16 8:39 ` Michael Albinus
2019-10-09 7:46 ` bug#25191: Redesign `recentf-menu-bar' logic and its callers Lars Ingebrigtsen
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=87a85fx3fr.fsf@users.sourceforge.net \
--to=npostavs@users.sourceforge.net \
--cc=27306@debbugs.gnu.org \
--cc=emacs@Alexander.Shukaev.name \
/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).