GNU bug report logs -
#74307
30.0.92; emacs-lisp font-locking word regexp
Previous Next
Reported by: Roland Winkler <winkler <at> gnu.org>
Date: Mon, 11 Nov 2024 06:30:02 UTC
Severity: normal
Merged with 74308
Found in version 30.0.92
Done: Eli Zaretskii <eliz <at> gnu.org>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
>> (setq foo "\\<foo\\>")
>>
>> The part "foo\\" of the string "\\<foo\\>" will get
>> font-lock-variable-name-face, which looks odd.
>>
>> I believe, this is due to a clause in lisp-mode.el that says
>>
>> ;; Words inside \\[], \\<>, \\{} or \\`' tend to be for
>> ;; `substitute-command-keys'.
>>
>> But this assumption is not always correct, in particular if ">" is
>> preceded by "\\", which happens when constructing regexps.
>
> I believe you are saying that in
>
> (,(rx "\\\\" (or (seq "<" (group-n 1 lisp-mode-symbol) ">")
> (seq "{" (group-n 1 lisp-mode-symbol) "}")))
> (1 font-lock-variable-name-face prepend))
>
> we should use something like the below instead?
>
> (,(rx "\\\\" (or (seq "<" (group-n 1 lisp-mode-symbol) (not "\\\\") ">")
> (seq "{" (group-n 1 lisp-mode-symbol) (not "\\\\") "}"))
The problem is that this removes highlighting from the last character
because it doesn't get into the group:
(rx (seq "[" (group-n 1 lisp-mode-symbol) (not "\\") "]"))
=> "\\[\\(?1:\\(?:\\w\\|\\s_\\|\\\\.\\)+\\)[^\\]]"
A possible solution is to move (not "\\") inside the group:
(rx (seq "[" (group-n 1 (seq lisp-mode-symbol (not "\\"))) "]"))
=> "\\[\\(?1:\\(?:\\w\\|\\s_\\|\\\\.\\)+[^\\]\\)]"
But this removes highlighting completely from the reported case of
(setq foo "\\<foo\\>"). However, I guess it should not have highlighting
anyway because this is an incorrect syntax of `substitute-command-keys'
that should match only \\[], \\<>, \\{} or \\`' without the second \\
This bug report was last modified 262 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.