Subject: Re: bug#24739: 25.1; conf-mode can't handle non escaped single quotes

From: "Michalis V." <[email-masked]>
Date: Sat, 21 Aug 2021 18:39:04 +0300

Lars Ingebrigtsen <[email-masked]> writes:

> Noam Postavsky <[email-masked]> writes:
>
>> Lars Ingebrigtsen <[email-masked]> writes:
>>
>>>> firstProperty=Hi I'm Diego
>>>> secondProperty=I have a stringquote style.
>>
>>> No font-lock-string-face in sight, and there's no mention of it in the
>>> file.  So is this some general font-lock thing that's configured
>>> somewhere else?  Anybody know how this stuff works?
>>
>> font-lock-string-face comes from font-lock-syntactic-face-function,
>> because ' has string delimiter syntax in conf-mode (see
>> conf-mode-syntax-table).
>
> Hm...  Oh!
>
>     (modify-syntax-entry ?\' "\"" table)
>
> I was searching for ?' and only found the entry in
> conf-toml-mode-syntax-table.  I'll remove that superfluous backslash.
>
>> I think it should be possible to make a syntax-propertize rule that
>> catches unmatched quotes and sets them to punctuation syntax.  We do
>> something similar in sgml-syntax-propertize.
>
> I see.

hi,

this conf-mode doesn't seem to follow the syntax-propertize structure so
it doesn't look very trivial to do something similar as in sgml mode
(at least as far as i managed to grasp the concept in there)..But the
conf-mode author(s) seem like they were aware of this font-locking
problem and had this workaround instead:

(defun conf-quote-normal (arg)
  "Set the syntax of \\=' and \" to punctuation.
With prefix ARG, only do it for \\=' if 1, or only for \" if 2.
This only affects the current buffer.  Some conf files use quotes
to delimit strings, while others allow quotes as simple parts of
the assigned value.  In those files font locking will be wrong,
and you can correct it with this command.  (Some files even do
both, i.e. quotes delimit strings, except when they are
unbalanced, but hey...)"
  (interactive "P")
  (let ((table (copy-syntax-table (syntax-table))))
    (when (or (not arg) (= (prefix-numeric-value arg) 1))
      (modify-syntax-entry ?\' "." table))
    (when (or (not arg) (= (prefix-numeric-value arg) 2))
      (modify-syntax-entry ?\" "." table))
    (set-syntax-table table)
    (font-lock-flush)))

which is bound to C-c C-q and it will temporarily fix the incorrect string
font-locking.. Any chance if it is sufficient for you Diego or do you think
a more permanent solution should be implemented instead?

thank you in advance,
Michalis