From: Alan Mackenzie <acm@muc.de>
To: "Simen Heggestøyl" <simenheg@runbox.com>
Cc: 41897@debbugs.gnu.org
Subject: bug#41897: 28.0.50; JavaScript comment filling with mhtml-mode
Date: Sun, 21 Jun 2020 16:55:13 +0000 [thread overview]
Message-ID: <20200621165513.GA10667@ACM> (raw)
In-Reply-To: <87d05ta8z9.fsf@simenheg@gmail.com>
Hello again, Simen.
On Sat, Jun 20, 2020 at 20:27:22 +0200, Simen Heggestøyl wrote:
> Alan Mackenzie <acm@muc.de> writes:
> > The patch below fixes both these errors, and seems to allow your test
> > case to work.
> Yes, this seems to fix it in both emacs-27 and master, thanks.
> However in emacs-27 with the patch applied I now get a strange
> side-effect: After filling the comment, mhtml-mode seems to lose track
> of where the JavaScript portion of the buffer is. Please see the
> attached image. The position where point is should still be recognized
> as HTML+JS, but it's recognized as plain HTML+ instead after
> filling. This doesn't happen on master.
Yes. mhtml-mode keeps track of the position of the JavaScript bit by
applying text-properties. In certain circumstances, when point is at
(point-min), it fails to re-apply those properties after removing them.
This was happening in the filling, which uses narrowing. I think I've
got this fixed, now. (See patch below.)
> > You haven't said what version of Emacs you're running.
> I put the version number in the bug subject but forgot to mention it in
> the description, sorry about that.
No, my apologies: I completely missed it in the subject line. I'm happy
that you're working in master, and not Emacs 26. :-)
Anyhow, I've made significant progress on the problem. As well as the
problem above, I've repaired a few defects with auto-fill-mode. It's
more or less working. But M-q isn't completely working. If a buffer
contains the long line of your test case, followed by another line, M-q
doesn't fill them together, leaving the short line untouched.
I've had problems with auto-fill-function, and the current state in the
patch involves mhtml-mode assuming auto-fill-function is enabled. This
obviously needs fixing, but that's the way it is for now. Sorry.
There's still a bug with M-q where it sometimes throws an error about a
search being "on the wrong side of point". I haven't had time to
investigate this, yet.
So here's the current patch for the problem. Please install it on
master after removing yesterday's patch. From the .../emacs/lisp
directory, it should work with $ patch -p2 < this-email. (Or, maybe
there's a git command to do it more directly.)
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 04b449ecd2..f5b6a4c260 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -4570,7 +4570,7 @@ js-mode
;; Comments
(setq-local comment-start "// ")
- (setq-local comment-start-skip "\\(//+\\|/\\*+\\)\\s *")
+ (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
(setq-local comment-end "")
(setq-local fill-paragraph-function #'js-fill-paragraph)
(setq-local normal-auto-fill-function #'js-do-auto-fill)
diff --git a/lisp/textmodes/mhtml-mode.el b/lisp/textmodes/mhtml-mode.el
index 1ae07c0a30..c5970cbcd1 100644
--- a/lisp/textmodes/mhtml-mode.el
+++ b/lisp/textmodes/mhtml-mode.el
@@ -73,15 +73,18 @@ mhtml-tag-relative-indent
(defconst mhtml--crucial-variable-prefix
(regexp-opt '("comment-" "uncomment-" "electric-indent-"
- "smie-" "forward-sexp-function" "completion-" "major-mode"))
+ "smie-" "forward-sexp-function" "completion-" "major-mode"
+ "adaptive-fill-" "fill-" "auto-fill-function"))
"Regexp matching the prefix of \"crucial\" buffer-locals we want to capture.")
(defconst mhtml--variable-prefix
(regexp-opt '("font-lock-" "indent-line-function"))
"Regexp matching the prefix of buffer-locals we want to capture.")
-(defun mhtml--construct-submode (mode &rest args)
- "A wrapper for make-mhtml--submode that computes the buffer-local variables."
+(defun mhtml--construct-submode (mode crucial-localized localized &rest args)
+ "A wrapper for make-mhtml--submode that computes the buffer-local variables.
+CRUCIAL-LOCALIZED and LOCALIZED are lists of symbols which must
+be considered crucial-local and local variables respectively."
(let ((captured-locals nil)
(crucial-captured-locals nil)
(submode (apply #'make-mhtml--submode args)))
@@ -94,6 +97,16 @@ mhtml--construct-submode
(unless (variable-binding-locus 'font-lock-fontify-region-function)
(setq-local font-lock-fontify-region-function
#'font-lock-default-fontify-region))
+ ;; Get the values from global variables which might become buffer local.
+ (dolist (iter crucial-localized)
+ (let ((sym (if (symbolp iter) iter (car iter)))
+ (val (symbol-value (if (symbolp iter) iter (cdr iter)))))
+ (push (cons sym val) crucial-captured-locals)))
+ (dolist (iter localized)
+ (let ((sym (if (symbolp iter) iter (car iter)))
+ (val (symbol-value (if (symbolp iter) iter (cdr iter)))))
+ (push (cons sym val) captured-locals)))
+
(dolist (iter (buffer-local-variables))
(when (string-match mhtml--crucial-variable-prefix
(symbol-name (car iter)))
@@ -119,6 +132,8 @@ mhtml--mark-crucial-buffer-locals
(defconst mhtml--css-submode
(mhtml--construct-submode 'css-mode
+ '((auto-fill-function . normal-auto-fill-function))
+ nil
:name "CSS"
:end-tag "</style>"
:syntax-table css-mode-syntax-table
@@ -127,6 +142,8 @@ mhtml--css-submode
(defconst mhtml--js-submode
(mhtml--construct-submode 'js-mode
+ '((auto-fill-function . normal-auto-fill-function))
+ nil
:name "JS"
:end-tag "</script>"
:syntax-table js-mode-syntax-table
@@ -202,12 +219,16 @@ mhtml--stashed-crucial-variables
(defun mhtml--stash-crucial-variables ()
(setq mhtml--stashed-crucial-variables
(mapcar (lambda (sym)
- (cons sym (buffer-local-value sym (current-buffer))))
+ (if (boundp sym)
+ (cons sym (buffer-local-value sym (current-buffer)))
+ sym))
mhtml--crucial-variables)))
(defun mhtml--map-in-crucial-variables (alist)
(dolist (item alist)
- (set (car item) (cdr item))))
+ (if (symbolp item)
+ (makunbound item)
+ (set (car item) (cdr item)))))
(defun mhtml--pre-command ()
(let ((submode (get-text-property (point) 'mhtml-submode)))
@@ -255,17 +276,14 @@ mhtml--syntax-propertize
sgml-syntax-propertize-rules))
(defun mhtml-syntax-propertize (start end)
- ;; First remove our special settings from the affected text. They
- ;; will be re-applied as needed.
- (remove-list-of-text-properties start end
- '(syntax-table local-map mhtml-submode))
- (goto-char start)
- ;; Be sure to look back one character, because START won't yet have
- ;; been propertized.
- (unless (bobp)
- (let ((submode (get-text-property (1- (point)) 'mhtml-submode)))
- (if submode
- (mhtml--syntax-propertize-submode submode end))))
+ (let ((submode (get-text-property start 'mhtml-submode)))
+ ;; First remove our special settings from the affected text. They
+ ;; will be re-applied as needed.
+ (remove-list-of-text-properties start end
+ '(syntax-table local-map mhtml-submode))
+ (goto-char start)
+ (if submode
+ (mhtml--syntax-propertize-submode submode end)))
(sgml-syntax-propertize (point) end mhtml--syntax-propertize))
(defun mhtml-indent-line ()
> -- Simen
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2020-06-21 16:55 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <874krbaqg3.fsf@simenheg@gmail.com>
[not found] ` <mailman.1991.1592327403.2541.bug-gnu-emacs@gnu.org>
2020-06-20 17:18 ` bug#41897: 28.0.50; JavaScript comment filling with mhtml-mode Alan Mackenzie
2020-06-20 18:27 ` Simen Heggestøyl
[not found] ` <87d05ta8z9.fsf@simenheg@gmail.com>
2020-06-21 16:55 ` Alan Mackenzie [this message]
2020-06-22 19:17 ` Alan Mackenzie
2020-06-23 0:02 ` Dmitry Gutov
2020-06-23 8:36 ` Alan Mackenzie
2020-06-23 14:23 ` Dmitry Gutov
2020-06-23 16:28 ` Alan Mackenzie
2020-06-23 17:59 ` Dmitry Gutov
2020-06-23 19:17 ` Alan Mackenzie
2020-06-23 23:11 ` Dmitry Gutov
2020-06-24 17:43 ` Alan Mackenzie
2020-06-24 18:28 ` Dmitry Gutov
2020-06-25 16:33 ` Alan Mackenzie
2020-06-25 16:48 ` Dmitry Gutov
2020-06-25 18:07 ` Alan Mackenzie
2020-06-25 18:19 ` Dmitry Gutov
2020-06-25 19:13 ` Alan Mackenzie
2020-06-25 19:28 ` Dmitry Gutov
2020-06-25 20:11 ` Alan Mackenzie
2020-06-25 21:20 ` Dmitry Gutov
2020-06-27 11:06 ` Alan Mackenzie
2020-06-28 0:18 ` Dmitry Gutov
2020-06-25 20:53 ` Tom Tromey
2020-06-25 21:14 ` Dmitry Gutov
2020-06-26 16:31 ` Alan Mackenzie
2020-06-25 20:49 ` Tom Tromey
2020-06-26 16:46 ` Alan Mackenzie
2020-07-04 13:13 ` Alan Mackenzie
2020-06-16 17:08 Simen Heggestøyl
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=20200621165513.GA10667@ACM \
--to=acm@muc.de \
--cc=41897@debbugs.gnu.org \
--cc=simenheg@runbox.com \
/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).