[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 4cee95815b9: pp.el: Try and fix bug#70039
From: |
Stefan Monnier |
Subject: |
master 4cee95815b9: pp.el: Try and fix bug#70039 |
Date: |
Thu, 28 Mar 2024 15:31:16 -0400 (EDT) |
branch: master
commit 4cee95815b9d7d56f6f77abb1cc17e346c038685
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>
pp.el: Try and fix bug#70039
* lisp/emacs-lisp/pp.el (pp-fill): Avoid splitting `#N#` or `#[`.
* test/lisp/emacs-lisp/pp-tests.el (pp-tests--sanity): New test.
---
lisp/emacs-lisp/pp.el | 27 +++++++++++++++++----------
test/lisp/emacs-lisp/pp-tests.el | 19 +++++++++++++++++++
2 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/lisp/emacs-lisp/pp.el b/lisp/emacs-lisp/pp.el
index 26c77d6b047..d586fc59939 100644
--- a/lisp/emacs-lisp/pp.el
+++ b/lisp/emacs-lisp/pp.el
@@ -166,12 +166,19 @@ it inserts and pretty-prints that arg at point."
(interactive "r")
(if (null end) (pp--object beg #'pp-fill)
(goto-char beg)
- (let ((end (copy-marker end t))
- (newline (lambda ()
- (skip-chars-forward ")]}")
- (unless (save-excursion (skip-chars-forward " \t") (eolp))
- (insert "\n")
- (indent-according-to-mode)))))
+ (let* ((end (copy-marker end t))
+ (avoid-unbreakable
+ (lambda ()
+ (and (memq (char-before) '(?# ?s ?f))
+ (memq (char-after) '(?\[ ?\())
+ (looking-back "#[sf]?" (- (point) 2))
+ (goto-char (match-beginning 0)))))
+ (newline (lambda ()
+ (skip-chars-forward ")]}")
+ (unless (save-excursion (skip-chars-forward " \t")
(eolp))
+ (funcall avoid-unbreakable)
+ (insert "\n")
+ (indent-according-to-mode)))))
(while (progn (forward-comment (point-max))
(< (point) end))
(let ((beg (point))
@@ -198,10 +205,10 @@ it inserts and pretty-prints that arg at point."
;; reduce the indentation depth.
;; Similarly, we prefer to cut before a "." than after
;; it because it reduces the indentation depth.
- (while (not (zerop (skip-chars-backward " \t({[',.")))
- (and (memq (char-before) '(?# ?s ?f))
- (looking-back "#[sf]?" (- (point) 2))
- (goto-char (match-beginning 0))))
+ (while
+ (progn
+ (funcall avoid-unbreakable)
+ (not (zerop (skip-chars-backward " \t({[',.")))))
(if (bolp)
;; The sexp already starts on its own line.
(progn (goto-char beg) nil)
diff --git a/test/lisp/emacs-lisp/pp-tests.el b/test/lisp/emacs-lisp/pp-tests.el
index 7f7c798cde8..7606183d645 100644
--- a/test/lisp/emacs-lisp/pp-tests.el
+++ b/test/lisp/emacs-lisp/pp-tests.el
@@ -66,4 +66,23 @@
(while (search-forward "." nil t)
(should (not (eolp))))))
+(ert-deftest pp-tests--sanity ()
+ (with-temp-buffer
+ (lisp-data-mode)
+ (let ((testdata "(a b c #1=#[0 \"\" [] 0] #s(foo #1# bar))"))
+ (let ((res (car (read-from-string testdata))))
+ (dotimes (i (length testdata))
+ (erase-buffer)
+ (insert testdata)
+ (let ((fill-column i))
+ (pp-fill (point-min) (point-max))
+ (goto-char (point-min))
+ (condition-case err
+ (should (equal (read (current-buffer)) res))
+ (invalid-read-syntax
+ (message "Invalid fill result with i=%d:\n%s"
+ i (buffer-string))
+ (signal (car err) (cdr err))
+ ))))))))
+
;;; pp-tests.el ends here.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 4cee95815b9: pp.el: Try and fix bug#70039,
Stefan Monnier <=