GNU bug report logs -
#76759
[PATCH] 31.0.50; makefile-mode: incorrectly highlights make-instructions as make targets
Previous Next
Reported by: Jostein Kjønigsen <jostein <at> secure.kjonigsen.net>
Date: Wed, 5 Mar 2025 09:34:02 UTC
Severity: normal
Tags: confirmed, patch
Merged with 17400,
33681,
33900,
35299,
36245,
37934,
45037,
46052,
46221,
48052
Found in version 26.1
Done: Stefan Monnier <monnier <at> iro.umontreal.ca>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your bug report
#76759: GNUmakefile mode colors fooled by colons in shell commands
which was filed against the emacs package, has been closed.
The explanation is attached below, along with your original report.
If you require more details, please reply to 33900 <at> debbugs.gnu.org.
--
76759: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=76759
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
> Any news on this one?
Looks OK, tho I think it's a bit more strict than necessary: the TABs we
need to avoid can be only at the beginning of the line, so not inside
the $(...).
So it's only one of the [^...] that needs the \t.
Here's what I did:
- Start from the current monster:
"^\\(\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[^({]\\|.[^\n$#})]+?[})]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#:=]\\)+?\\)\\(:\\)\\(?:[ \t]*$\\|[^=\n]\\(?:[^#\n]*?;[ \t]*\\(.+\\)\\)?\\)"
- Change the `\\(?:[^({]\\|.` to `\\(?:[^({]\\|[({]` because I think
the `.` was just an optimization. And since the two alternatives are
now mutually exclusive, swap them:
\\(?:[^({]\\|.[^\n$#})]+?[})]\\)
=>
\\(?:[({][^\n$#})]+?[})]\\|[^({]\\)
- Now the regexp has become:
"^\\(\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[({][^\n$#})]+?[})]\\|[^({]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#:=]\\)+?\\)\\(:\\)\\(?:[ \t]*$\\|[^=\n]\\(?:[^#\n]*?;[ \t]*\\(.+\\)\\)?\\)"
- Make the nested construction explicit, so it's a bit more manageable:
(letrec ((elems-re
(lambda (n &optional outer)
(if (< n 1)
"[^\n$#})]+?"
(concat "\\(?:\\$\\(?:"
"[({]" (funcall elems-re (- n 1)) "[})]"
"\\|[^({]\\)"
"\\|[^\n$#" (if outer ":=" ")}") "]\\)+?")))))
(concat
;; Allow for two nested levels $(v1:$(v2:$(v3:a=b)=c)=d)
"^\\(" (funcall elems-re 3 'outer)
"\\)\\(:\\)\\(?:[ \t]*$\\|[^=\n]\\(?:[^#\n]*?;[ \t]*\\(.+\\)\\)?\\)"))
- Disallow TABs in the outer case by replacing ":=" with "\t:=" (that's
one of the TABs you added in your version of the patch).
This is still not quite right, since AFAIK TABs are allowed to appear
outside of $(...) as long as they're not at BOL, but I think it's better
than what we've had so far (and the regexp still has several other
limitations anyway).
Pushed to `master`.
Stefan
[Message part 3 (message/rfc822, inline)]
$ cat Makefile
U=https://www.example.com//forum.php?mod=forumdisplay
all:new
if ! test -f old; then touch old; fi
diff old new > $T || :
if test -s $T; then cat $T; echo https://www.example.com/; fi
mv new old
$ emacs -q Makefile
See the weird colors caused by colons etc. on these lines?
1 U=https://www.example.com//forum.php?mod=forumdisplay
4 diff old new > $T || :
5 if test -s $T; then cat $T; echo https://www.example.com/; fi
emacs-version "26.1"
This bug report was last modified 72 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.