Subject: bug#37934: closed (Re: bug#76759: [PATCH] 31.0.50; makefile-mode: incorrectly highlights make-instructions as make targets)

From: [email-masked] (GNU bug Tracking System)
Date: Mon, 10 Mar 2025 02:17:06 +0000

Your bug report

#76759: makefile colors messed up by ://

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 [email-masked].

-- 
76759: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=76759
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#76759: [PATCH] 31.0.50; makefile-mode: incorrectly highlights make-instructions as make targets
From: Stefan Monnier <[email-masked]>
To: Jostein Kjønigsen <[email-masked]>
Cc: "Dr. Arne Babenhauserheide" <[email-masked]>, "Ergus via Emacs development discussions." <[email-masked]>, Mauro Aranda <[email-masked]>, [email-masked]
Date: Sun, 09 Mar 2025 22:08:04 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

> 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

Subject: makefile colors messed up by ://
From: 積丹尼 Dan Jacobson <[email-masked]>
To: [email-masked]
Date: Sat, 26 Oct 2019 19:45:37 +0800
List-Id: <debbugs-submit.debbugs.gnu.org>

$ cat makefile
x:
	echo This line is the correct color.
	echo This line is not. Because it contains the string file:// in it.
$ emacs -nw -Q makefile
emacs-version "26.3"