[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#74307: 30.0.92; emacs-lisp font-locking word regexp
From: |
Juri Linkov |
Subject: |
bug#74307: 30.0.92; emacs-lisp font-locking word regexp |
Date: |
Thu, 05 Dec 2024 09:20:16 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/31.0.50 (x86_64-pc-linux-gnu) |
>> (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 \\
- bug#74307: 30.0.92; emacs-lisp font-locking word regexp,
Juri Linkov <=