GNU bug report logs - #77054
Completion highlighting applied outside completion-lazy-hilit-fn

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: João Guerra <joca.bt@HIDDEN>; dated Sun, 16 Mar 2025 15:28:01 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 21 Mar 2025 12:42:13 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 21 08:42:13 2025
Received: from localhost ([127.0.0.1]:36189 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tvbhU-0003sw-IN
	for submit <at> debbugs.gnu.org; Fri, 21 Mar 2025 08:42:13 -0400
Received: from mail-oi1-x233.google.com ([2607:f8b0:4864:20::233]:42158)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <joaotavora@HIDDEN>)
 id 1tvbhR-0003s7-W7
 for 77054 <at> debbugs.gnu.org; Fri, 21 Mar 2025 08:42:10 -0400
Received: by mail-oi1-x233.google.com with SMTP id
 5614622812f47-3f6a92f2328so1030115b6e.0
 for <77054 <at> debbugs.gnu.org>; Fri, 21 Mar 2025 05:42:09 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742560924; x=1743165724; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=fytvHgbOlUBWnEdVAhf2EXJ5XSLUYo5AZrVUuJ6nvtA=;
 b=Uo5zVFnt08YeC56NWU6OqANRDsLRevcrNXqI79Je28PQGs5McyFJ7p6ON4DEgdnd8i
 naoMT6mQGXL4CnPusO6mlTRgckwIhwxoza7YBwjF/A/23Ci9EVn4NmYlrZXOq4sF634n
 Ue7xx/GtYiTftHTkfwEDtOPrHfhNE+bWi78FE2uGInDNazQ+hFYEMMPCZ2LaqTe4Uahf
 gE/DByU2F4tYuT8X1/8CkfSMfwMS9sAkMcKt7kCR0H0LJIf0kdKCxvNT6XxIbB4DQ3l/
 LSP+3y9dk7ESmw+dhfJJiVmWbF3jtwWfyWuwfAT/Vj0w7rJlRHDrgz3Q/pocmjROI54V
 y1+w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742560924; x=1743165724;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=fytvHgbOlUBWnEdVAhf2EXJ5XSLUYo5AZrVUuJ6nvtA=;
 b=DChfRxI9z7kviaU3v3bKO7cO3BoXWi/9gV0o3pWbOwA1b4wq47INDLJbp/5agpWfZe
 1YCMN5zmUhPAr3PThmCm64U4pFC46IF32goH1OJU+2x6r4UTJakGLqwgD7mkw8v8qket
 9ve56L7hgT/2S0z7mkC+tMhxLCzZXipFNo3W8ZvsMtX9tFkbss2Roy+gNqD4JRM+AomP
 O+yWMMMfV97zrGcuxkdOJgmEeOhafoaEwp+np2dQetpEOil9M788tQpxczJCji7hiy3V
 rgfYS4FIrIYec5qkEHBPlvzfIR6lyHTedJgF+FV61VJ6GoqgM/aafTSJdBFC/LgrSmrj
 KKXg==
X-Forwarded-Encrypted: i=1;
 AJvYcCVwlhbV1/Rf8wAUQ4dzkiw3XkrQIFEh05Sf+f4taU7GfuUwnzmX7VhwiIYOPRXnVK2+Jgt6tQ==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YzqOZaBpscvZDsHmdQOaQLes3UJtDmKzzOKWZLTTbX1tqoGEIhD
 /qRCVr6t9/nthRl/L9MOfxt8K4+MkL2LWGfbjrKLD8hMAk/PDOKXmUuVEdYx+36gk390bMTTU6R
 gIGorIXDuE84tIlrvpziwi8ssOm0=
X-Gm-Gg: ASbGncssipFq8DBCaL5Wry3jxKl2xrTw1EgpN8vpnKKQGrmLjTc7drXawpr/Jiyejgf
 VGXFjd9Ke1sn89wCIOwY6GKzTe1KYzdszsnAvB3eGIM3CMgEJMcNiyRIcX5GlWih0KbVUOqFseC
 MpW7H0vJZpUoUEm35TLsalrl858g==
X-Google-Smtp-Source: AGHT+IEogOFn4SQylbNgmzCFT5/T5PD7O0Iw1Jrkpv3h1y12FQQvZ6R5NFTg30RblARMPkTqyst8fNnAoa2A0AWhYKU=
X-Received: by 2002:a05:6808:309b:b0:3f9:aeb6:6e92 with SMTP id
 5614622812f47-3feb45dc68fmr5261882b6e.9.1742560923988; Fri, 21 Mar 2025
 05:42:03 -0700 (PDT)
MIME-Version: 1.0
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
 <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
 <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
 <861puropw5.fsf@HIDDEN>
 <CALDnm50aE6xbioLANVSX=pKqn+6hiJe9KbQD7c_wvJPsvKvFyg@HIDDEN>
 <d5e3cc56-bc70-4c44-bd8d-35d0727c9afe@HIDDEN>
 <CALDnm50JbSnpFY9DNmDMOAS=wCxMA=bFhoP1rkDVzeJfnEvRTg@HIDDEN>
 <CAGiBfP2FXqhaxe7H3fOFOoU=09z=6S6tKK_u_RtkqskEqv+QnQ@HIDDEN>
In-Reply-To: <CAGiBfP2FXqhaxe7H3fOFOoU=09z=6S6tKK_u_RtkqskEqv+QnQ@HIDDEN>
From: =?UTF-8?B?Sm/Do28gVMOhdm9yYQ==?= <joaotavora@HIDDEN>
Date: Fri, 21 Mar 2025 12:41:55 +0000
X-Gm-Features: AQ5f1Jq2YsUcBcjHxH8NutzD_jQUHGoTouVcHsJuld2pC6eeRJ2RUOR-ZadXq9c
Message-ID: <CALDnm51h=SqJ_uweJZdiQToJ=uZoKj_S=kZUvb2Kb8vgxt0NFA@HIDDEN>
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
To: =?UTF-8?B?Sm/Do28gR3VlcnJh?= <joca.bt@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000dfc13f0630d9945e"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77054
Cc: Dmitry Gutov <dmitry@HIDDEN>, Eli Zaretskii <eliz@HIDDEN>,
 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--000000000000dfc13f0630d9945e
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, Mar 21, 2025, 11:10 Jo=C3=A3o Guerra <joca.bt@HIDDEN> wrote:

> . Having the completion style
> remove all prior fontification sounds a bit extreme for an interface.
> For me, it makes more sense to be additive, but I don't know what
> Emacs' vision is on this topic.
>

It's up to the style. If you like it additive keep it additive, else do
what Eli suggests.

`completion--twq-all` is doing fontification. This function doesn't
> look like it's part of the completion frontend nor of the completion
> style. Why is it doing fontification? Should it be doing
> fontification?
>

It's part of the table. It does what it has done probably for many years.
If you want to change that behavior for everyone, go ahead, but IME you'll
eventually bother lots of people using simpler setups. If your style is
bothered by it, remove it there just like Eli suggests. In lazy and in
non-lazy situations. IOW the lazy optimization has nothing to do with this.

And if for some reason you're worrying about performance, don't. The lazy
optimization is largely about avoiding premature upfront string
allocations, not propertization. And it more than likely doesn't matter for
file tables anyway which are small compared to symbol obarrays, for
instance.

--000000000000dfc13f0630d9945e
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"auto"><div dir=3D"auto">On Fri, Mar 21, 2025, 11:10 Jo=C3=A3o G=
uerra &lt;<a href=3D"mailto:joca.bt@HIDDEN" target=3D"_blank" rel=3D"nor=
eferrer">joca.bt@HIDDEN</a>&gt; wrote:</div><div class=3D"gmail_quote" d=
ir=3D"auto"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0=
.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">. Having the =
completion style<br>
remove all prior fontification sounds a bit extreme for an interface.<br>
For me, it makes more sense to be additive, but I don&#39;t know what<br>
Emacs&#39; vision is on this topic.<br></blockquote></div><div dir=3D"auto"=
><br></div><div dir=3D"auto">It&#39;s up to the style. If you like it addit=
ive keep it additive, else do what Eli suggests.</div><div dir=3D"auto"><br=
></div><div class=3D"gmail_quote" dir=3D"auto"><blockquote class=3D"gmail_q=
uote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,2=
04);padding-left:1ex">
`completion--twq-all` is doing fontification. This function doesn&#39;t<br>
look like it&#39;s part of the completion frontend nor of the completion<br=
>
style. Why is it doing fontification? Should it be doing<br>
fontification?<br></blockquote></div><div dir=3D"auto"><br></div><div dir=
=3D"auto">It&#39;s part of the table. It does what it has done probably for=
 many years. If you want to change that behavior for everyone, go ahead, bu=
t IME you&#39;ll eventually bother lots of people using simpler setups. If =
your style is bothered by it, remove it there just like Eli suggests. In la=
zy and in non-lazy situations. IOW the lazy optimization has nothing to do =
with this.=C2=A0</div><div dir=3D"auto"><br></div><div dir=3D"auto">And if =
for some reason you&#39;re worrying about performance, don&#39;t. The lazy =
optimization is largely about avoiding premature upfront string allocations=
, not propertization. And it more than likely doesn&#39;t matter for file t=
ables anyway which are small compared to symbol obarrays, for instance.</di=
v></div>

--000000000000dfc13f0630d9945e--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 21 Mar 2025 11:10:29 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 21 07:10:29 2025
Received: from localhost ([127.0.0.1]:35691 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tvaGi-0001ee-LC
	for submit <at> debbugs.gnu.org; Fri, 21 Mar 2025 07:10:29 -0400
Received: from mail-il1-x12a.google.com ([2607:f8b0:4864:20::12a]:46127)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <joca.bt@HIDDEN>) id 1tvaGe-0001cy-IR
 for 77054 <at> debbugs.gnu.org; Fri, 21 Mar 2025 07:10:25 -0400
Received: by mail-il1-x12a.google.com with SMTP id
 e9e14a558f8ab-3cf82bd380bso18939725ab.0
 for <77054 <at> debbugs.gnu.org>; Fri, 21 Mar 2025 04:10:24 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742555418; x=1743160218; darn=debbugs.gnu.org;
 h=content-transfer-encoding:cc:subject:message-id:date:from
 :in-reply-to:references:mime-version:from:to:cc:subject:date
 :message-id:reply-to;
 bh=WC1efwuQLcf5xUwhGaYffGJnCZhUlgZXKYstfTQAbqE=;
 b=HK8QVKOH5OXCuXQ+4g7YC9tALVujKT9BMCB3X7PI/oypEFfvEeiYFrSXNsfGhgcYal
 EYlU7WnXdLG90mF2yr0I8E4wZ8pdLl6sWzMxc9A3EzdCRslGXKaB9X6eN+SiEqnSmAoK
 OF5TpOl7BX4cQl0EU/YEv2m1exT2kmjaVayV2QwSrfDf/h7yz7l1HiICAJwx23Zqn2Vk
 D3FgXjtmRXWmvcnB3HwXn4qlwxFr1VKJMfxAdYr70Kll1JNLcaK2Iwnw8P18X0XGZnGo
 DkUZYuh6qp0QaYyhD7GIJ41KtqzwIgC+kXT3sep2hLAwv1OK1aweCabEMvmBuVa7uFfb
 DtWg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742555418; x=1743160218;
 h=content-transfer-encoding:cc:subject:message-id:date:from
 :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc
 :subject:date:message-id:reply-to;
 bh=WC1efwuQLcf5xUwhGaYffGJnCZhUlgZXKYstfTQAbqE=;
 b=TNDdE91/O2rSyhg8cIKnqa66lzL7RVWbTq+lSS0X41INCB2ODdJD7wux01kYx50v7e
 ezTJoVATgnhvxH2e268b8NvrTaF2hPWPmXRirmFjdt6k3R5mAYXvq8+GfM/QgJR4aoQh
 hGhlqIqW5AuYcNRj6wTDtpLPpo6nub3qOC3DYfrg4VjBLozpmMRV9JEVlOBegj9kZZ1A
 0TAa23qFY2gRqHQJEOVhGsT1MpGCHDZ6DFNSngUNNPENnshGqXXFClc+nurTYAh4wPVR
 DrmbLM3shA0a2nJ7aOTfZt2re5iHIpIEyCtNmOo6KdimgdC2/fPsBkNA94Ia+5er2aw8
 puaQ==
X-Forwarded-Encrypted: i=1;
 AJvYcCWogzT1iVxB3cMtckyqAW6wGldsje0YQNr/HLCTg616v73tzQNG1e1/+XHG8PSWlw2bgWP4TQ==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yy+Jtsc/d4ziZjdWuys89twvY/QghSYaZLJpnmqM8XY1hKoZs0W
 bjAub5cRBq5YsVzNVdQd/7Yq/Z+t6EuSQ7XxOLYMszo/5L0paiPgPl5LgymERScS4JZ/BMzRi5v
 M/J1Tq7IOsbZcYCg9tQLB+SdilII=
X-Gm-Gg: ASbGncu47mkYfaeLsa3PVTjMCtCJfNHu4hd14o6OZeLJdVz7Eo1o3D3tVYgTABZ9KZ+
 nhTspS8Gth4ajUpTwM2Snxm3H0RDdSuM/WuIz+Zh+O/Q4mHzntkvvDtLli/tAIyDIO8l386r+Dg
 egiJEPOv9tzqFJA0FNsHGaT4fo
X-Received: by 2002:a05:6e02:b49:b0:3d2:b66b:94cd with SMTP id
 e9e14a558f8ab-3d59612be1amt41652415ab.3.1742555418418; Fri, 21 Mar 2025
 04:10:18 -0700 (PDT)
MIME-Version: 1.0
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
 <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
 <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
 <861puropw5.fsf@HIDDEN>
 <CALDnm50aE6xbioLANVSX=pKqn+6hiJe9KbQD7c_wvJPsvKvFyg@HIDDEN>
 <d5e3cc56-bc70-4c44-bd8d-35d0727c9afe@HIDDEN>
 <CALDnm50JbSnpFY9DNmDMOAS=wCxMA=bFhoP1rkDVzeJfnEvRTg@HIDDEN>
In-Reply-To: <CALDnm50JbSnpFY9DNmDMOAS=wCxMA=bFhoP1rkDVzeJfnEvRTg@HIDDEN>
From: =?UTF-8?B?Sm/Do28gR3VlcnJh?= <joca.bt@HIDDEN>
Date: Fri, 21 Mar 2025 12:09:31 +0100
X-Gm-Features: AQ5f1JpMGNk86PNWAX5lfxzq2bMfM7jS8P7kexxOEoNApmo1qk-3NWU-TKYQtCI
Message-ID: <CAGiBfP2FXqhaxe7H3fOFOoU=09z=6S6tKK_u_RtkqskEqv+QnQ@HIDDEN>
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 4.3 (++++)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 Content preview:  > The "should destructively propertize" part tells me that
 the function should take care of removing the face properties present in
 the input string where it doesn't want those fontifications. By cont [...]
 Content analysis details:   (4.3 points, 10.0 required)
 pts rule name              description
 ---- ---------------------- --------------------------------------------------
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
 no trust [2607:f8b0:4864:20:0:0:0:12a listed in]
 [list.dnswl.org]
 -0.0 SPF_PASS               SPF: sender matches SPF record
 1.0 FORGED_GMAIL_RCVD      'From' gmail.com does not match 'Received'
 headers
 0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
 provider (joca.bt[at]gmail.com)
 0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
 1.2 MISSING_HEADERS        Missing To: header
 2.1 MALFORMED_FREEMAIL     Bad headers on message from free email
 service
X-Debbugs-Envelope-To: 77054
Cc: Dmitry Gutov <dmitry@HIDDEN>, Eli Zaretskii <eliz@HIDDEN>,
 =?UTF-8?B?Sm/Do28gVMOhdm9yYQ==?= <joaotavora@HIDDEN>, 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 3.3 (+++)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 
 Content preview:  > The "should destructively propertize" part tells me that
    the function should take care of removing the face properties present in
   the input string where it doesn't want those fontifications. By cont [...]
    
 
 Content analysis details:   (3.3 points, 10.0 required)
 
  pts rule name              description
 ---- ---------------------- --------------------------------------------------
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
                              no trust
                             [2607:f8b0:4864:20:0:0:0:12a listed in]
                             [list.dnswl.org]
 -0.0 SPF_PASS               SPF: sender matches SPF record
  1.0 FORGED_GMAIL_RCVD      'From' gmail.com does not match 'Received'
                             headers
  0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
                             provider (joca.bt[at]gmail.com)
  0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
  1.2 MISSING_HEADERS        Missing To: header
  2.1 MALFORMED_FREEMAIL     Bad headers on message from free email
                             service
 -1.0 MAILING_LIST_MULTI     Multiple indicators imply a widely-seen list
                             manager

> The "should destructively propertize" part tells me that the function sho=
uld take care of removing the face properties present in the input string w=
here it doesn't want those fontifications.  By contrast, your function call=
s add-text-properties, which only adds the face properties to a single char=
acter, but does nothing with the face properties of the rest of the string.

I read "should destructively propertize" as "mutate the string to
avoid using more memory / efficiency reasons".

While I understand this argument, I could see this behaviour being
problematic in certain situations. For example, a frontend may decide
to do some fontification on top of completion-lazy-hilit-fn (e.g. to
highlight the current candidate differently). While there's an obvious
workaround - the frontend doing their fontification after calling
completion-lazy-hilit-fn - I'm not sure whether it could cause
restrictions in more complex scenarios. Having the completion style
remove all prior fontification sounds a bit extreme for an interface.
For me, it makes more sense to be additive, but I don't know what
Emacs' vision is on this topic.

> can Emacs perform additional fontification (outside the completion fronte=
nd and style)?
> I believe the answer is YES

I believe this is problematic. I would like to understand in which
situations does it make sense for Emacs to do fontification outside
the completion frontend and completion style. These are the two main
drivers when completing, and are the ones responsible for the user
interface. Having other parts of the code chime in on fontification,
which is basically user interface, seems to break that division.

`completion--twq-all` is doing fontification. This function doesn't
look like it's part of the completion frontend nor of the completion
style. Why is it doing fontification? Should it be doing
fontification?

> To clarify: this doesn't happen with any of the built-in styles, right?
> To look at this another way - like Joao said, if this happens it might be=
 a problem even without lazy highlighting. Does it occur then?

The reported issue is caused by the fontification applied by
`completion--twq-all` and it happens even without lazy highlighting
(it's just easier to spot when using lazy highlighting because the
expectation is that no fontification will happen prior to it). I would
say that the reason it hasn't been noticed before is that its
behaviour mostly matches the behaviour of the builtin completion
styles, so it won't be noticeable because they're fontifiying the same
characters with the same faces.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 20 Mar 2025 19:03:06 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Mar 20 15:03:06 2025
Received: from localhost ([127.0.0.1]:58972 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tvLAY-00012f-3Y
	for submit <at> debbugs.gnu.org; Thu, 20 Mar 2025 15:03:06 -0400
Received: from mail-oi1-x235.google.com ([2607:f8b0:4864:20::235]:43199)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <joaotavora@HIDDEN>)
 id 1tvLAU-00011Q-S7
 for 77054 <at> debbugs.gnu.org; Thu, 20 Mar 2025 15:03:04 -0400
Received: by mail-oi1-x235.google.com with SMTP id
 5614622812f47-3fa0eb29cebso1366040b6e.0
 for <77054 <at> debbugs.gnu.org>; Thu, 20 Mar 2025 12:03:02 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742497377; x=1743102177; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=WKGju4xruVXiuJ52Lv+IiTKxSfd9PIR7toCbOCWCIec=;
 b=gHPd/0AHAe4ZyM2cDfO2O/xmH0nDfqycKu5O8n0gR9nDmA0bIJz2GtzLTmfAcMa2Om
 l0CfYmg9pQO1WBOJHfI+AXXlDhWQNqmzTrhanBZla+AtU5hohsS29vnFCqsc5vGmuPdN
 l5I1fU0G7vARzX/mOawxQUa8dQ0m1iwMQhrFwBXHl/spQN4aVdvNPVVPCA7ICqUhn0z5
 giUacYg1YpqFfSyi19hXAbutLwn4BgAM1g3bzEoakyHIR1uZLtolJtARVnrwgrvTgwz2
 G1ajmS+G35pScT8yNwkQ7Ek8bdo16uHeqNJXb1oKYivJnWxH0IhuHo8bAqTbNJYJvnpp
 aOHg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742497377; x=1743102177;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=WKGju4xruVXiuJ52Lv+IiTKxSfd9PIR7toCbOCWCIec=;
 b=tAuQtFm96cvTcPmXZN7X9H2yMzi3gncSYDBaqEfYLXHp+ajYvf9w4yyLeYOiXHGsA2
 IAx2D7XX9SNxjcHHbl9cEhmllsqKgdulzE6YJ1nmnLukzeVl6hTPjXIhC84DaY0Iudzf
 tAzNSJaEkxTT4OfKnZ8JbDARV01pPFgsc2SEShx2MklSLzg+xUfeYgRiPtyzfZOiB+/Q
 OkeAAj4ueLHYnCSaPlfRo9WuaSO2vHf5cwLVSLGGS9PHhk0dTohEH4lHWTek8PzfCfjY
 WHv+rbmzjNIPj1KOR20Gd8oC+eXiakC/KJQKlslde8UbtzpfgICvemsIwnBJr1hGVHO4
 XwUA==
X-Forwarded-Encrypted: i=1;
 AJvYcCUB0JoXeuwKzrIk76mr+mekw2ywwucY8jw1H18yxeOOH8nsnS9feo6U8EGPcdx+PzqaavS0hQ==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YxCXKmxk7x9r/gb2UudlbkpoBf3lVmBtgpAFzSSKVvQbtHwkETo
 X7QWYoi80XinfKFWtQylFIxDDgZt/Kl/PrOHqwoQw6Ws/yqxJVZZISsGTry9Tl8r6Pt26CfIb8Q
 GdLqBnHa6nwgZBHHE6u5Fm8elsIs=
X-Gm-Gg: ASbGncu43Dt87CDmDWHYIclLtg09fjJnB/N0TyC5edjIhpk/ur8wpRBKCpNr60G+Pjh
 +/MNy4F+e/LvqZq1vzbO2NSAEofrTQ/lleXeTnmY0avcY0aYy3T5a11lSa1yabLl90CfQPghoh9
 blO6EuThGsmyOt4kk2dw+s42gGPHFX+KLoOzq2
X-Google-Smtp-Source: AGHT+IFru0kYBdjF0nudopxxFsegrnCxpGmweMJ3bHdf2vnPY2buIF72ak/skyJ2YixS+lWfd2UXruMYGbd8RJ9fTI0=
X-Received: by 2002:a05:6808:2f1a:b0:3f8:18a3:b1cc with SMTP id
 5614622812f47-3febee9509fmr535795b6e.12.1742497376821; Thu, 20 Mar 2025
 12:02:56 -0700 (PDT)
MIME-Version: 1.0
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
 <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
 <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
 <861puropw5.fsf@HIDDEN>
 <CALDnm50aE6xbioLANVSX=pKqn+6hiJe9KbQD7c_wvJPsvKvFyg@HIDDEN>
 <d5e3cc56-bc70-4c44-bd8d-35d0727c9afe@HIDDEN>
In-Reply-To: <d5e3cc56-bc70-4c44-bd8d-35d0727c9afe@HIDDEN>
From: =?UTF-8?B?Sm/Do28gVMOhdm9yYQ==?= <joaotavora@HIDDEN>
Date: Thu, 20 Mar 2025 19:02:47 +0000
X-Gm-Features: AQ5f1Jrp7guVi8nzRwMKUroqTAoi3qmDsLT7A-htxsNADEqzB1ZPjUI8sjQE_Bw
Message-ID: <CALDnm50JbSnpFY9DNmDMOAS=wCxMA=bFhoP1rkDVzeJfnEvRTg@HIDDEN>
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
To: Dmitry Gutov <dmitry@HIDDEN>
Content-Type: multipart/alternative; boundary="0000000000002aea630630cac92a"
X-Spam-Score: 0.7 (/)
X-Debbugs-Envelope-To: 77054
Cc: Eli Zaretskii <eliz@HIDDEN>,
 =?UTF-8?B?Sm/Do28gR3VlcnJh?= <joca.bt@HIDDEN>, 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.3 (/)

--0000000000002aea630630cac92a
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Mar 20, 2025, 17:26 Dmitry Gutov <dmitry@HIDDEN> wrote:

> On 20/03/2025 19:11, Jo=C3=A3o T=C3=A1vora wrote:
> > The function may do this and it's passed a fresh string to destroy at
> > will I think, but it may not matter if later parts of the machinery add
> > these properties. It could come from the table's sorting for example.
> > There's little the style can do about that.
> >
> > Furthermore, as I've been trying to explain, lazy highlighting as I
> > implemented is completely orthogonal. It's just a mechanism to allow
> > front ends to delay fontification to the last possible moment when they
> > actually display stuff to the user. Styles are not supposed to set it t=
o
> > anything that fontifies differently/specially because styles don't know
> > in general what frontend is driving them. IOW, whatever problem the OP
> > is experiencing would likely be there if lazy highlighting were turned
> > off (by the frontend or the style, or both).
>
> Styles are indeed not supposed to alter it - they're supposed to obey it
> instead.
>

Exactly. Well, they're _encouraged_ to obey it by setting the fn. But they
don't have to. Afair many styles don't, likely because that wouldn't bring
much speed. Flex does it because by its nature it can match a lot of stuff.

But completion-lazy-hilit does have something to do with not altering
> the original string: that's the whole definition of
> completion-lazy-hilit: if on, do copy-sequence first.
>

Yup.

Completion tables might alter the strings inside their sorting, but they
> own those string so that seems fine. Completion style's sorting should
> avoid that. This was a large part of the discussion we had at the time,
> and one result is that the sorter inside
> completion--flex-adjust-metadata does not alter the strings.
>

All true!

Jo=C3=A3o

--0000000000002aea630630cac92a
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"auto"><div dir=3D"auto"><br></div><div dir=3D"auto">On Thu, Mar=
 20, 2025, 17:26 Dmitry Gutov &lt;<a href=3D"mailto:dmitry@HIDDEN">dmitr=
y@HIDDEN</a>&gt; wrote:</div><div class=3D"gmail_quote gmail_quote_conta=
iner" dir=3D"auto"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0p=
x 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 20/=
03/2025 19:11, Jo=C3=A3o T=C3=A1vora wrote:<br>
&gt; The function may do this and it&#39;s passed a fresh string to destroy=
 at <br>
&gt; will I think, but it may not matter if later parts of the machinery ad=
d <br>
&gt; these properties. It could come from the table&#39;s sorting for examp=
le. <br>
&gt; There&#39;s little the style can do about that.<br>
&gt; <br>
&gt; Furthermore, as I&#39;ve been trying to explain, lazy highlighting as =
I <br>
&gt; implemented is completely orthogonal. It&#39;s just a mechanism to all=
ow <br>
&gt; front ends to delay fontification to the last possible moment when the=
y <br>
&gt; actually display stuff to the user. Styles are not supposed to set it =
to <br>
&gt; anything that fontifies differently/specially because styles don&#39;t=
 know <br>
&gt; in general what frontend is driving them. IOW, whatever problem the OP=
 <br>
&gt; is experiencing would likely be there if lazy highlighting were turned=
 <br>
&gt; off (by the frontend or the style, or both).<br>
<br>
Styles are indeed not supposed to alter it - they&#39;re supposed to obey i=
t <br>
instead.<br></blockquote></div><div dir=3D"auto"><br></div><div dir=3D"auto=
">Exactly. Well, they&#39;re _encouraged_ to obey it by setting the fn. But=
 they don&#39;t have to. Afair many styles don&#39;t, likely because that w=
ouldn&#39;t bring much speed. Flex does it because by its nature it can mat=
ch a lot of stuff.</div><div dir=3D"auto"><br></div><div class=3D"gmail_quo=
te gmail_quote_container" dir=3D"auto"><blockquote class=3D"gmail_quote" st=
yle=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padd=
ing-left:1ex">
But completion-lazy-hilit does have something to do with not altering <br>
the original string: that&#39;s the whole definition of <br>
completion-lazy-hilit: if on, do copy-sequence first.<br></blockquote></div=
><div dir=3D"auto"><br></div><div dir=3D"auto">Yup.</div><div dir=3D"auto">=
<br></div><div class=3D"gmail_quote gmail_quote_container" dir=3D"auto"><bl=
ockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-lef=
t:1px solid rgb(204,204,204);padding-left:1ex">
Completion tables might alter the strings inside their sorting, but they <b=
r>
own those string so that seems fine. Completion style&#39;s sorting should =
<br>
avoid that. This was a large part of the discussion we had at the time, <br=
>
and one result is that the sorter inside <br>
completion--flex-adjust-metadata does not alter the strings.<br></blockquot=
e></div><div dir=3D"auto"><br></div><div dir=3D"auto">All true!</div><div d=
ir=3D"auto"><br></div><div class=3D"gmail_quote gmail_quote_container" dir=
=3D"auto"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8=
ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
</blockquote></div><div data-smartmail=3D"gmail_signature">Jo=C3=A3o</div><=
/div>

--0000000000002aea630630cac92a--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 20 Mar 2025 17:34:10 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Mar 20 13:34:10 2025
Received: from localhost ([127.0.0.1]:58816 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tvJmT-0005Ny-TV
	for submit <at> debbugs.gnu.org; Thu, 20 Mar 2025 13:34:10 -0400
Received: from fout-a2-smtp.messagingengine.com ([103.168.172.145]:40683)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <dmitry@HIDDEN>) id 1tvJmQ-0005NN-QV
 for 77054 <at> debbugs.gnu.org; Thu, 20 Mar 2025 13:34:07 -0400
Received: from phl-compute-13.internal (phl-compute-13.phl.internal
 [10.202.2.53])
 by mailfout.phl.internal (Postfix) with ESMTP id 3583913833F2;
 Thu, 20 Mar 2025 13:34:01 -0400 (EDT)
Received: from phl-mailfrontend-02 ([10.202.2.163])
 by phl-compute-13.internal (MEProxy); Thu, 20 Mar 2025 13:34:01 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gutov.dev; h=cc
 :content-transfer-encoding:content-type:content-type:date:date
 :from:from:in-reply-to:in-reply-to:message-id:mime-version
 :references:reply-to:subject:subject:to:to; s=fm3; t=1742492041;
 x=1742578441; bh=ZrXKF6v3906PEhCOokLEYUNsHpq7J0g931JASW7EaMg=; b=
 MT6VOL97jTFCjYglfhhMHCIwoU7g515GA8KE9JA/ScWG+r7gM1cDTFKgkyPl+HHW
 rToPrRM2WiLpVzhJKRscA6EdqKDS+9hj1rXO9gdhRATU4K6erbPlh11iDYxdYo3m
 0Y+EhIhfhPGSY+DNMPWy0xJDKux2j1iukDH1V4KkoaOhnc/gep/DE9Qt1s7LmeGB
 GEgBwyHijOOzq4Ju5JUH5u17iJWC9ypsW1eLe4iJmMylQjfhQZ4RGcvOL8QMJ2Vr
 MRYE6fHenZER/surgk/+hMosUpg26JZx6tEAg0+Hm8FjYA0Rn947pfsCUdNtLDV2
 fqmkPyyzho5r977OEEh8Yw==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
 messagingengine.com; h=cc:content-transfer-encoding:content-type
 :content-type:date:date:feedback-id:feedback-id:from:from
 :in-reply-to:in-reply-to:message-id:mime-version:references
 :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender
 :x-me-sender:x-sasl-enc; s=fm1; t=1742492041; x=1742578441; bh=Z
 rXKF6v3906PEhCOokLEYUNsHpq7J0g931JASW7EaMg=; b=hXNjHBzEAKgxdBR0L
 yRKQTbdeCN37krqVmvJPcdz2qYIuJMmczb8CJVlMEaLc+395VnVTqs1s0Tb4YF3/
 JydWBnHNxD6piE+TINqPpuMYgszVJV9RUOaNg9jEeoHR0iZL2S3wpTx2cmOdfjx8
 Lqq8eQqs9fuJy33OUeCfafnONcD2oM9Q/Baz9rQ9/Lg9J/hW5LF6brj7x+nv4zz2
 zvRQXHtfBzw0HduRARYM8GQVVQhX9QhzvOw6d5zFBtitd+ZbNeAegnPUjIRmEJfO
 QEmDYb1waCKLCR1TEVEIG5LUtRZyDNjJXzmt+CaiDGSlDP/jdpxvOhA7foMvF0lW
 k1wZA==
X-ME-Sender: <xms:iVHcZ157uVM9RrXKwazAHttjHTeHsRtm6efRo4NR9l6L05Yge6D6xQ>
 <xme:iVHcZy4XbtFVJieEU22Bx6kS53w-bOHmJrf75FvweFBRXBJu7aJ9U7g5R9IWDwrC8
 U5xz1vDbbUpeuJNs7Q>
X-ME-Received: <xmr:iVHcZ8eKe04MWjmwVHJwhWcapvN3SWfZEWMwC8fQu68QOuSsh3M4HkpAUVOthz7Fnq7U>
X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgddugeekkedvucetufdoteggodetrf
 dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv
 pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucenucfjughrpefkff
 ggfgfuvfhfhfgjtgfgsehtkeertddtvdejnecuhfhrohhmpeffmhhithhrhicuifhuthho
 vhcuoegumhhithhrhiesghhuthhovhdruggvvheqnecuggftrfgrthhtvghrnhepheekfe
 dtveetkeehheffkedtffevfeffieellefhgfeguefhtdekfeeuveeiudfgnecuffhomhgr
 ihhnpehgihhthhhusgdrtghomhenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh
 epmhgrihhlfhhrohhmpegumhhithhrhiesghhuthhovhdruggvvhdpnhgspghrtghpthht
 ohepvddpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepjhhotggrrdgsthesghhmrg
 hilhdrtghomhdprhgtphhtthhopeejjedtheegseguvggssghughhsrdhgnhhurdhorhhg
X-ME-Proxy: <xmx:iVHcZ-JMoC8JQwj9LG6Mb8cqTX6zJnxllZhFJfYtCbPH-qmt8TipcQ>
 <xmx:iVHcZ5KM72R4GEUKCKLwNKnAclU-vZT9f1XUqYDFCMF5RHgQ-Zys_g>
 <xmx:iVHcZ3yiyOU-qLTtGRydxoObVxVc99bCNTc7YQHsrFIF2fBPDSGe3g>
 <xmx:iVHcZ1IoVt1AriiHljwW4JH3kwxuWbwIdt2qO4PMYYnEgiNBsogOHw>
 <xmx:iVHcZwXaFIesNbGPfmOTHjtCxmYaKQSYWxgKW9c5TY2UhlIFLsdbiceA>
Feedback-ID: i07de48aa:Fastmail
Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu,
 20 Mar 2025 13:34:00 -0400 (EDT)
Message-ID: <81a20c8f-001a-4d6a-9c20-ee8f2ce97387@HIDDEN>
Date: Thu, 20 Mar 2025 19:33:58 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
To: =?UTF-8?Q?Jo=C3=A3o_Guerra?= <joca.bt@HIDDEN>, 77054 <at> debbugs.gnu.org
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
Content-Language: en-US
From: Dmitry Gutov <dmitry@HIDDEN>
In-Reply-To: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77054
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Hi!

On 16/03/2025 17:27, João Guerra wrote:
> TL;DR: Emacs applies additional completion highlighting even when
> completion-lazy-hilit-fn is set, leading to incorrect behaviour with
> alternative completion styles and frontends.
> 
> I'm implementing a custom fuzzy completion style and encountering an
> issue where Emacs highlights parts of completions that it shouldn't.

To clarify: this doesn't happen with any of the built-in styles, right?

That might mean that the new style violates some of the assumptions - 
perhaps ones that are not too well documented.

> When completing files and buffers, but not commands, Emacs is
> highlighting prefixes in
> [completion--twq-all](https://github.com/emacs-mirror/emacs/blob/8ac894e2246f25d2a2a97d866b10e6e0b0fede5a/lisp/minibuffer.el#L677).
> This becomes more evident if I make my completion-lazy-hilit-fn not do
> any highlighting: completions are still highlighted when they
> shouldn't at all.

To look at this another way - like Joao said, if this happens it might 
be a problem even without lazy highlighting. Does it occur then?

If so, might be unrelated to your style as well.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 20 Mar 2025 17:27:10 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Mar 20 13:27:10 2025
Received: from localhost ([127.0.0.1]:58806 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tvJfi-000545-1E
	for submit <at> debbugs.gnu.org; Thu, 20 Mar 2025 13:27:10 -0400
Received: from fout-a1-smtp.messagingengine.com ([103.168.172.144]:54617)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <dmitry@HIDDEN>) id 1tvJfc-00053K-G6
 for 77054 <at> debbugs.gnu.org; Thu, 20 Mar 2025 13:27:08 -0400
Received: from phl-compute-01.internal (phl-compute-01.phl.internal
 [10.202.2.41])
 by mailfout.phl.internal (Postfix) with ESMTP id 4C9B61383667;
 Thu, 20 Mar 2025 13:26:59 -0400 (EDT)
Received: from phl-mailfrontend-02 ([10.202.2.163])
 by phl-compute-01.internal (MEProxy); Thu, 20 Mar 2025 13:26:59 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gutov.dev; h=cc
 :cc:content-transfer-encoding:content-type:content-type:date
 :date:from:from:in-reply-to:in-reply-to:message-id:mime-version
 :references:reply-to:subject:subject:to:to; s=fm3; t=1742491619;
 x=1742578019; bh=sIwWpnO6zck7wENG8+df4WgYqoEWZX28qMqxOlMRXD4=; b=
 tT3AZi/mCS0Qr5yxjp9QallO2Gv+CUYbczXTVPT47X7z73CPIerZVdmxUC3KYebv
 K49b/ViDoVVRl87ARGP4UOYbReWz2VHMtUgMhLD7ZilMkc6+b2xRmE0xpWqY4uPS
 KRoinP+um4QOaNx/5FYF3yNtbLs0oQjcAsX+7iA3WRXG6D46YdY7Q8OcFN53hcWr
 7bMYbmMzOx9cIdFl8eMxr7anFiix7H7S3JV5FDbNO5oEYVAmeNGKNI2IXGeNGOsx
 axYPQLYXEwy4/mtcCLLYzAgcEvUsvsK3MSZQNGOpEUelVkn8OdrRuHB4M422R9wQ
 xEKcbBepNQueTShjTzrMtw==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
 messagingengine.com; h=cc:cc:content-transfer-encoding
 :content-type:content-type:date:date:feedback-id:feedback-id
 :from:from:in-reply-to:in-reply-to:message-id:mime-version
 :references:reply-to:subject:subject:to:to:x-me-proxy
 :x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t=1742491619; x=
 1742578019; bh=sIwWpnO6zck7wENG8+df4WgYqoEWZX28qMqxOlMRXD4=; b=0
 KJsyQmix5y2bG6i1JoCovZ8GfRK+gJgIvwrC+c/DlBE67cuP3oVf0OTvEbmuhluX
 Mi/vEa2VN3ZSqfEsNBeQq7kTrrLQxQ568wBA7H/m6KjSs+2yudrbCNxIagfMMsfn
 X4BUaUaNcBG4KQFeOqZAshg69z1hlYyI4RlPmnUeIsh36aHUI+9SB7+ly3x5Ijwa
 davI3nGUZAG4iLKW/RV0lPVGoDlRBlydCzZIabkh5+bTWSvPYSegW8zferL+LELu
 Uc6c8GYZPMZDZogbxFa3FkuhuuOijX1sYv1XSSjobO+wgx1y8MgGH+H5ORafe4QM
 ZsA701k+MokOTlT/c4xVA==
X-ME-Sender: <xms:40_cZ91LGXac9AUoA4y-TgqmB67yq2I45btpOdFvvCx0fxfU1XGCJQ>
 <xme:40_cZ0H3n-DAtRMt7Sqlu6BDKPtu6FnxlfzLS66n01Yv9AwcEmXolMobPy1-Ho4g0
 cT_--LRfsBArqa3uRE>
X-ME-Received: <xmr:40_cZ94EjaHuheJW8DtSWLh8LdYWpHQVzgkay2yD4m4Of2qyQi9MXfjixTCZP-RC24Tt>
X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgddugeekkeduucetufdoteggodetrf
 dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv
 pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih
 gvnhhtshculddquddttddmnecujfgurhepkfffgggfuffvvehfhfgjtgfgsehtkeertddt
 vdejnecuhfhrohhmpeffmhhithhrhicuifhuthhovhcuoegumhhithhrhiesghhuthhovh
 druggvvheqnecuggftrfgrthhtvghrnhepgeelfeetkefghfdvhfdtgeevveevteetgeet
 veegtedthefhudekteehffeukeeknecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrg
 hmpehmrghilhhfrhhomhepughmihhtrhihsehguhhtohhvrdguvghvpdhnsggprhgtphht
 thhopeegpdhmohguvgepshhmthhpohhuthdprhgtphhtthhopehjohgrohhtrghvohhrrg
 esghhmrghilhdrtghomhdprhgtphhtthhopegvlhhiiiesghhnuhdrohhrghdprhgtphht
 thhopehjohgtrgdrsghtsehgmhgrihhlrdgtohhmpdhrtghpthhtohepjeejtdehgeesug
 gvsggsuhhgshdrghhnuhdrohhrgh
X-ME-Proxy: <xmx:40_cZ63y9cCsT8KtztyHOGJU1xBF-ypQRQFRI9q_CZ6rcLD6TR5Q3w>
 <xmx:40_cZwGGfxrOZ4AM_1s4sIdO761eY0CowKtKQS_PdwEQ6SqN9okDcg>
 <xmx:40_cZ7-Qg8KAsxtsiiU-urSht3hV_ymKfogzgogFviwSEkhXZIogtA>
 <xmx:40_cZ9nMwYqwBRfe9CFyK86zBLWfYBijN2QVpC1C1ycgNpD9_dWTuA>
 <xmx:40_cZ8i9hPgMAaGBqUxwgTw7pNCfHVsXMreZMg8mUY6L0u4msZ68dIM6>
Feedback-ID: i07de48aa:Fastmail
Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu,
 20 Mar 2025 13:26:57 -0400 (EDT)
Message-ID: <d5e3cc56-bc70-4c44-bd8d-35d0727c9afe@HIDDEN>
Date: Thu, 20 Mar 2025 19:26:55 +0200
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
To: =?UTF-8?B?Sm/Do28gVMOhdm9yYQ==?= <joaotavora@HIDDEN>,
 Eli Zaretskii <eliz@HIDDEN>
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
 <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
 <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
 <861puropw5.fsf@HIDDEN>
 <CALDnm50aE6xbioLANVSX=pKqn+6hiJe9KbQD7c_wvJPsvKvFyg@HIDDEN>
Content-Language: en-US
From: Dmitry Gutov <dmitry@HIDDEN>
In-Reply-To: <CALDnm50aE6xbioLANVSX=pKqn+6hiJe9KbQD7c_wvJPsvKvFyg@HIDDEN>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77054
Cc: =?UTF-8?Q?Jo=C3=A3o_Guerra?= <joca.bt@HIDDEN>, 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On 20/03/2025 19:11, João Távora wrote:
> The function may do this and it's passed a fresh string to destroy at 
> will I think, but it may not matter if later parts of the machinery add 
> these properties. It could come from the table's sorting for example. 
> There's little the style can do about that.
> 
> Furthermore, as I've been trying to explain, lazy highlighting as I 
> implemented is completely orthogonal. It's just a mechanism to allow 
> front ends to delay fontification to the last possible moment when they 
> actually display stuff to the user. Styles are not supposed to set it to 
> anything that fontifies differently/specially because styles don't know 
> in general what frontend is driving them. IOW, whatever problem the OP 
> is experiencing would likely be there if lazy highlighting were turned 
> off (by the frontend or the style, or both).

Styles are indeed not supposed to alter it - they're supposed to obey it 
instead.

But completion-lazy-hilit does have something to do with not altering 
the original string: that's the whole definition of 
completion-lazy-hilit: if on, do copy-sequence first.

Completion tables might alter the strings inside their sorting, but they 
own those string so that seems fine. Completion style's sorting should 
avoid that. This was a large part of the discussion we had at the time, 
and one result is that the sorter inside 
completion--flex-adjust-metadata does not alter the strings.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 20 Mar 2025 17:11:58 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Mar 20 13:11:58 2025
Received: from localhost ([127.0.0.1]:58733 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tvJQz-0004Ev-No
	for submit <at> debbugs.gnu.org; Thu, 20 Mar 2025 13:11:58 -0400
Received: from mail-oi1-x22e.google.com ([2607:f8b0:4864:20::22e]:50585)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <joaotavora@HIDDEN>)
 id 1tvJQt-0004EB-2F
 for 77054 <at> debbugs.gnu.org; Thu, 20 Mar 2025 13:11:55 -0400
Received: by mail-oi1-x22e.google.com with SMTP id
 5614622812f47-3feaedb39e9so298125b6e.1
 for <77054 <at> debbugs.gnu.org>; Thu, 20 Mar 2025 10:11:51 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742490705; x=1743095505; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=BSoSvPSWIFCN+EOyjhu5Z+/TGAq+deKO/FmfHI3oUSg=;
 b=ixMLq6J4WFZopkNLwcwj8qIu4Ggj0y5M+tLziNtieMb+pY2DNUkWpeheTuH6EqOZnl
 N/nawajlNpYSiE7uPL0faAg8h3JwpTOiJC1KPXUqsKMy1ReKjtslSHmspG+jgMPHAUCe
 3DMUzoESERQ97uELo8U7oHGHkEF+Mrs+vtx01lo0JncwLdEROnklq5vtJD1xFXqqYD9v
 zb+NbiJYODiU6PJbbFvTghzifkvIBXLWFDvkf+KnYZXamdzUF7BVKfrsAgSuTtBslUjm
 mvShbnVjNOcPQ6SLs/Pmbb1l3IznK5e/504ZOcWQDvXEMWhDkFpoLVuY/yH/hTatdpDD
 3jIw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742490705; x=1743095505;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=BSoSvPSWIFCN+EOyjhu5Z+/TGAq+deKO/FmfHI3oUSg=;
 b=K4AZ8J8aL2JZXMx5GVp7tYtd0TDPcB5yN2M+VJu8A3BGDeYu6idaboIwwoSO436CV9
 VzLMeRvNaOKlvuoi/X2aD40XiOqDUtAcAzq8CVwKfajkQXZPXsXKyKuOL/v7/VWfbD10
 2jUF9It7ywgks01jaa04rkYfgIzbPryX0kv8oYoSHOCbJ5mWa66f0arJuIlnzN6yCDLj
 R3VIcwMIVA44c+XmOfNZoLwtXc76jtt5UJSEXHp29NOJDIz+hWOjebcD9WsBFgsJzH4k
 BMKpE2EZNEWjy/Ue9ZtRg1O2asnQfMm+N8qrgbOCiPkDevNdA2WMS3cNBJvid2Rmn8KQ
 O/YQ==
X-Forwarded-Encrypted: i=1;
 AJvYcCV8Km0oioZ/1Qv8xUqASHlV790Pqo6zZsslC50UmWmEhP7wEoP3tqUA8D1mcFrUQd1WzORyqg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YyeuWHyQ5CfntgbzRBv8bjPqL5T188K2eH9OUTtxotEl8Og6BLX
 0e8qj/myJrrKzr29xbHZHI/W3HOq3k/MQYKpXLxvgN8Gqf0KdI2sWw3nKFArl1BaHs3V18wIwio
 NM0UNG78HK74ujXb6TPaVatVedSU=
X-Gm-Gg: ASbGncuVjKfSDMBnxc52n7PuzO96MABQf04fl3gO8z5St/I8kLISv7ZJPV0E/2J737i
 mF+whXJ6hIrwP+SvGmmMXFNT2qAjLPU/ZjzGBV1D9M2BTNgiyfcVQIP4VB7qXBnztG+LEfnjhh0
 kf7fey1RP5kqfH2vhR+W4v8q1B+g==
X-Google-Smtp-Source: AGHT+IFdirLhH1rf2KN9Z6cXSmPYez7eBizIfLnLpkArd/3BTOqG78JleSVofccn/f7CNMrTx8upqOvVZd6TNb3wd7Y=
X-Received: by 2002:aca:1017:0:b0:3fe:aedb:19ea with SMTP id
 5614622812f47-3feaedb1ad4mr4167914b6e.25.1742490705095; Thu, 20 Mar 2025
 10:11:45 -0700 (PDT)
MIME-Version: 1.0
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
 <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
 <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
 <861puropw5.fsf@HIDDEN>
In-Reply-To: <861puropw5.fsf@HIDDEN>
From: =?UTF-8?B?Sm/Do28gVMOhdm9yYQ==?= <joaotavora@HIDDEN>
Date: Thu, 20 Mar 2025 17:11:36 +0000
X-Gm-Features: AQ5f1JoAsyL1sq_mxfV4diAjlsEesY0nDUopjJqQ87pL9mH1-qLN6dsm3LBEk7I
Message-ID: <CALDnm50aE6xbioLANVSX=pKqn+6hiJe9KbQD7c_wvJPsvKvFyg@HIDDEN>
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
To: Eli Zaretskii <eliz@HIDDEN>
Content-Type: multipart/alternative; boundary="0000000000008077040630c93b65"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77054
Cc: =?UTF-8?B?Sm/Do28gR3VlcnJh?= <joca.bt@HIDDEN>, 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--0000000000008077040630c93b65
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Mar 20, 2025, 12:20 Eli Zaretskii <eliz@HIDDEN> wrote:

> >
> > If it helps, I can reframe this bug report as: if lazy highlighting is
> > enabled, can Emacs perform additional fontification (outside the
> > completion frontend and style)?
>
> I believe the answer is YES; if you would like to _replace_ the
> fontifications of the candidate, your function should remove the face
> text properties from all the characters of the string, before adding
> your fontifications.
>

The function may do this and it's passed a fresh string to destroy at will
I think, but it may not matter if later parts of the machinery add these
properties. It could come from the table's sorting for example. There's
little the style can do about that.

Furthermore, as I've been trying to explain, lazy highlighting as I
implemented is completely orthogonal. It's just a mechanism to allow front
ends to delay fontification to the last possible moment when they actually
display stuff to the user. Styles are not supposed to set it to anything
that fontifies differently/specially because styles don't know in general
what frontend is driving them. IOW, whatever problem the OP is experiencing
would likely be there if lazy highlighting were turned off (by the frontend
or the style, or both).

Jo=C3=A3o

--0000000000008077040630c93b65
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"auto"><div><div>On Thu, Mar 20, 2025, 12:20 Eli Zaretskii &lt;<=
a href=3D"mailto:eliz@HIDDEN">eliz@HIDDEN</a>&gt; wrote:</div><div class=
=3D"gmail_quote gmail_quote_container"><blockquote class=3D"gmail_quote" st=
yle=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padd=
ing-left:1ex">&gt;=C2=A0<br>
&gt; If it helps, I can reframe this bug report as: if lazy highlighting is=
<br>
&gt; enabled, can Emacs perform additional fontification (outside the<br>
&gt; completion frontend and style)?<br>
<br>
I believe the answer is YES; if you would like to _replace_ the<br>
fontifications of the candidate, your function should remove the face<br>
text properties from all the characters of the string, before adding<br>
your fontifications.<br></blockquote></div></div><div dir=3D"auto"><br></di=
v><div dir=3D"auto">The function may do this and it&#39;s passed a fresh st=
ring to destroy at will I think, but it may not matter if later parts of th=
e machinery add these properties. It could come from the table&#39;s sortin=
g for example. There&#39;s little the style can do about that.=C2=A0</div><=
div dir=3D"auto"><br></div><div dir=3D"auto">Furthermore, as I&#39;ve been =
trying to explain, lazy highlighting as I implemented is completely orthogo=
nal. It&#39;s just a mechanism to allow front ends to delay fontification t=
o the last possible moment when they actually display stuff to the user. St=
yles are not supposed to set it to anything that fontifies differently/spec=
ially because styles don&#39;t know in general what frontend is driving the=
m. IOW, whatever problem the OP is experiencing would likely be there if la=
zy highlighting were turned off (by the frontend or the style, or both).</d=
iv><div dir=3D"auto"><br></div><div dir=3D"auto">Jo=C3=A3o</div></div>

--0000000000008077040630c93b65--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 20 Mar 2025 12:20:12 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Mar 20 08:20:11 2025
Received: from localhost ([127.0.0.1]:55964 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tvEsc-0002ye-Om
	for submit <at> debbugs.gnu.org; Thu, 20 Mar 2025 08:20:11 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:55200)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1tvEsW-0002xv-Ie
 for 77054 <at> debbugs.gnu.org; Thu, 20 Mar 2025 08:20:07 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1tvEsR-0005ec-2d; Thu, 20 Mar 2025 08:19:59 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=WBjvHEYKfVfDQmibnAsc/TBik8csDJz6tB0kZ8tElP4=; b=cLp1ph1i/bGt1rmoVnl3
 fewzvFlwEV97MYAZOW1je6oBxT0SUGkzevgjOWe62ZlQvMzVWXPr8Sy0F5WlQvlo/fICbXr4Yf2FT
 kR+areTe5otIRLN8LuZBOHVIcqxkl84BsTUA9w4pyYCdLYoi3MyGxrT3xuokgCs4ZLhGZv5RpRzA0
 C9MZVCIo3ER7EsxFjdXlXLDKEkPIov/tlhQWrRKuAQ1Z/F9VFsTQm8dv2T+nP1pzJ4nhEBdTaACau
 bqNEk4kSgmUSylJ2hvWL/Anxhd70sSfOLqduoHftMqDb8GUmrGYAhdBJSKM1fV00wxG6I6an82kca
 QvxktU5VgdE8oA==;
Date: Thu, 20 Mar 2025 14:19:54 +0200
Message-Id: <861puropw5.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?Jo=C3=A3o?= Guerra <joca.bt@HIDDEN>
In-Reply-To: <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
 (message from =?utf-8?Q?Jo=C3=A3o?= Guerra on Wed, 19 Mar 2025 16:12:02
 +0100)
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
 <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
 <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 77054
Cc: joaotavora@HIDDEN, 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: João Guerra <joca.bt@HIDDEN>
> Date: Wed, 19 Mar 2025 16:12:02 +0100
> Cc: 77054 <at> debbugs.gnu.org
> 
> ```
> (setopt completion-styles '(flex)
>         file-name-shadow-properties `(invisible t
> ,@file-name-shadow-properties))
> (setq completion-lazy-hilit t)
> (defun completion--hilit-from-re (string regexp &optional point-idx)
>   "Bogus fontification that only fontifies the last character of STRING."
>   (message "lazy %s" completion-lazy-hilit)
>   (let ((last (1- (length string))))
>     (add-face-text-property last (1+ last) 'completions-common-part t string))
>   string)
> (icomplete-mode t)
> ```
> 
> See the attached picture for the outcome (if that doesn't work here's
> an alternative url
> https://drive.proton.me/urls/ZMMW1D9S2R#EXEwlTnWeCHy). You'll notice
> that my fontification function has run, fontifying the last character.
> However, additional characters are fontified, meaning there's
> fontification happening elsewhere (the culprit indicated in the
> original bug report). It could be the case that the frontend decided
> to do additional fontification, but that's not the case (except for
> the first candidate).
> 
> My expectation as a user or package maintainer is that no
> fontification will be performed by Emacs if I am using lazy
> highlighting. However, that's not the case in *specific* situations as
> I am trying to show in this bug report.
> 
> > At least according to the docstrings I wrote at the time, and which I suggest reading.
> 
> Neither docstring directly discusses whether additional fontification
> can be performed by Emacs when using lazy highlighting, so my
> assumption would be no.

The doc string says (in Emacs 30.1):

  completion-lazy-hilit-fn is a variable defined in ‘minibuffer.el’.

  Its value is nil

  Fontification function set by lazy-highlighting completions styles.
  When a given style wants to enable support for ‘completion-lazy-hilit’
  (which see), that style should set this variable to a function of one
  argument.  It will be called with each completion candidate, a string, to
  be displayed to the user, and should destructively propertize these
  strings with the ‘face’ property.

The "should destructively propertize" part tells me that the function
should take care of removing the face properties present in the input
string where it doesn't want those fontifications.  By contrast, your
function calls add-text-properties, which only adds the face
properties to a single character, but does nothing with the face
properties of the rest of the string.

> If it helps, I can reframe this bug report as: if lazy highlighting is
> enabled, can Emacs perform additional fontification (outside the
> completion frontend and style)?

I believe the answer is YES; if you would like to _replace_ the
fontifications of the candidate, your function should remove the face
text properties from all the characters of the string, before adding
your fontifications.

> If the answer is yes, can we consider changing that behaviour? As I
> believe it constraints what packages can do.

Actually, I think the existing behavior leaves the packages more
freedom, because they can retain any of the existing fontifications as
they see fit.  Don't you agree?

Or what am I missing?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 19 Mar 2025 20:41:25 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Mar 19 16:41:25 2025
Received: from localhost ([127.0.0.1]:53347 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tv0E9-0002mJ-58
	for submit <at> debbugs.gnu.org; Wed, 19 Mar 2025 16:41:25 -0400
Received: from mail-oo1-xc2f.google.com ([2607:f8b0:4864:20::c2f]:50665)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <joaotavora@HIDDEN>)
 id 1tv0E6-0002m3-PY
 for 77054 <at> debbugs.gnu.org; Wed, 19 Mar 2025 16:41:23 -0400
Received: by mail-oo1-xc2f.google.com with SMTP id
 006d021491bc7-60009c5dd51so7252eaf.1
 for <77054 <at> debbugs.gnu.org>; Wed, 19 Mar 2025 13:41:22 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742416877; x=1743021677; darn=debbugs.gnu.org;
 h=content-transfer-encoding:to:subject:message-id:date:from
 :in-reply-to:references:mime-version:from:to:cc:subject:date
 :message-id:reply-to;
 bh=Gb2rmMDf++zJdZwT6qrchR+eX1QwFWTJuY8JfYUfA3Q=;
 b=Z8dILVISGxrrlIJr2KppRLnjJ9VI4OooY8MNfSVZGqAFzugQH3wm2uMF8ugYINFsDM
 aMkzJzvDkeH+L7G4QlSNJISvtk7Ew2MQR8RjD5B9+JJK7rcp5dgPB9E7NUWrgEN6UQMy
 lldUfK4vHdYszt+cSEt+1+Z5ywZv8wj1HzN46tfugMoQ1+LZBBN2gZ46KNwbqcPXP75Q
 /w+vOVFCC+N9eVeLS+bHjnwH9JzJcOluq0TEM3pzkV6/LIqeOjx/8Fq+xiINRTtEUoZv
 TuIldvJHL46sNo053nKwAt5PKLIb1Y/Si5BGhel10WJvZwNiEYrYkYEMGEPRNAg7I83o
 dH2w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742416877; x=1743021677;
 h=content-transfer-encoding:to:subject:message-id:date:from
 :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc
 :subject:date:message-id:reply-to;
 bh=Gb2rmMDf++zJdZwT6qrchR+eX1QwFWTJuY8JfYUfA3Q=;
 b=HlAFvF5JsOOH4uww1thw7Fa+xvrTJEL7zqqrr3UOoXT0beNlxpdo3L1OKA+hHh/7yZ
 OvW3kuvmliAxmDLlJY6j7FheJBjwysygL7TzLq7SBkooCW8/FNaxAb54qyub4uJCP0KK
 SWgAOiE+7fyq02MsnES94oC1PdNQrjWZYJn+31OF7qOnh6/gokFjy7wJd1HrOMOgj+W0
 tzHL7E3AQTeL9o4boPBRf0n7byIbAgFPsknJbQdHaS5S4ULBV513QcMwIPVGXBlzMFwY
 jvNtok8P0EotpspNrYfXNCQOFkkF1C+yHkTRzF6NAMRblrrZYQ3v8MD2nNpyygJ1hRt5
 8OPg==
X-Forwarded-Encrypted: i=1;
 AJvYcCU3c/R8FKkJuuOpmQm81p9X3lWwlpG/Xyp6d7XqxPQV6JGWuHEhxouw2/haZJfluEkDFRb2ag==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YzbYXQmcV1hZgWBaczRqQziNjmBVoVUTfl1pHif8F+4tLSoE+3H
 k8Vm9M0L9rviE0E+QCFp7JR4eB5CFn0fkOHCJc/x+DV9XX7T7HAt3Rstdqg9XMEwpNWNMclYXsU
 GI5NEu8L76o3YcjD2wrI6G2ccY0s=
X-Gm-Gg: ASbGncuZSYUwJoIZ5inBXOGYfs01DdKzrtzPV+6BTqsq00Y9JgZTAJnqV4897P1DDJ/
 xuXBY1rvS4oE7fkiWfsEDC/zt8EHuOsB9TXshEcMhdNWJYM3xCrCa8CTi0/1O3T0xK0hR9xcZOE
 vcSf09jntPgrxLuGsZvMMCW/mdfA==
X-Google-Smtp-Source: AGHT+IE4pi38HVrE8+8unswaQKgij5jKUeIkIcCYx2G5JWHMV6HD+3wFgeX/K6HpPh/V+iGtVTruVV4AHdqTNFIYiHo=
X-Received: by 2002:a05:6820:54e:b0:5fe:9edb:eafe with SMTP id
 006d021491bc7-6021e3d993amr2838211eaf.5.1742416876698; Wed, 19 Mar 2025
 13:41:16 -0700 (PDT)
MIME-Version: 1.0
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
 <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
 <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
 <CALDnm52tW4Drnr_64DRTWzyqy2_NkZgf-i4SQ3KJa=5Mdi_-4w@HIDDEN>
In-Reply-To: <CALDnm52tW4Drnr_64DRTWzyqy2_NkZgf-i4SQ3KJa=5Mdi_-4w@HIDDEN>
From: =?UTF-8?B?Sm/Do28gVMOhdm9yYQ==?= <joaotavora@HIDDEN>
Date: Wed, 19 Mar 2025 20:41:32 +0000
X-Gm-Features: AQ5f1JpRzNRlKdsizyr465RTopI-MZKMld-WO_Wy6OqCF8UmuKDEQiFb-IGopdA
Message-ID: <CALDnm50f1MiXx_OZ8O7AqPDwsEzvSEZ9oRz9nre5P4udgV7WsQ@HIDDEN>
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
To: =?UTF-8?B?Sm/Do28gR3VlcnJh?= <joca.bt@HIDDEN>, 
 Eli Zaretskii <eliz@HIDDEN>, 77054 <at> debbugs.gnu.org
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77054
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Forgot to CC the bug tracker.  So just wanted to say again I'm sorry
to disappoint, and to clarify a possible misunderstanding.  "lazy" has
nothing to do with "what" is highlighted but merely "when". As far
as I can tell,that part is working fine,so whatever your problem is
And again, lazy highlighting only concerns a collaboration between
style and frontend.

toodle-oo!
Jo=C3=A3o



On Wed, Mar 19, 2025 at 3:14=E2=80=AFPM Jo=C3=A3o T=C3=A1vora <joaotavora@g=
mail.com> wrote:
>
> So, sorry to disappoint you Jo=C3=A3o, and best of luck!
>
> Jo=C3=A3o
>
> On Wed, Mar 19, 2025, 15:12 Jo=C3=A3o Guerra <joca.bt@HIDDEN> wrote:
>>
>> > AFAIK this feature has been in Emacs at least for a full major version=
 cycle (29) and had it failed in its basic mission we would have heard abou=
t it. I also remember testing it thoroughly.
>>
>> It feels a bit disappointing when the answer to a possible bug report
>> is something like "nobody has reported it so it must be working fine"
>> or "it worked on my machine".
>>
>> Anyway, here's a way to reproduce it in a less "complex" setup, only
>> using Emacs builtins.
>>
>> The flex style sets `completion-lazy-hilit-fn` in the middle of
>> `completion-pcm--hilit-commonality` to `completion--hilit-from-re`.
>> Let's override that just for demonstration purposes in a *hacky way*.
>>
>> ```
>> (setopt completion-styles '(flex)
>>         file-name-shadow-properties `(invisible t
>> ,@file-name-shadow-properties))
>> (setq completion-lazy-hilit t)
>> (defun completion--hilit-from-re (string regexp &optional point-idx)
>>   "Bogus fontification that only fontifies the last character of STRING.=
"
>>   (message "lazy %s" completion-lazy-hilit)
>>   (let ((last (1- (length string))))
>>     (add-face-text-property last (1+ last) 'completions-common-part t st=
ring))
>>   string)
>> (icomplete-mode t)
>> ```
>>
>> See the attached picture for the outcome (if that doesn't work here's
>> an alternative url
>> https://drive.proton.me/urls/ZMMW1D9S2R#EXEwlTnWeCHy). You'll notice
>> that my fontification function has run, fontifying the last character.
>> However, additional characters are fontified, meaning there's
>> fontification happening elsewhere (the culprit indicated in the
>> original bug report). It could be the case that the frontend decided
>> to do additional fontification, but that's not the case (except for
>> the first candidate).
>>
>> My expectation as a user or package maintainer is that no
>> fontification will be performed by Emacs if I am using lazy
>> highlighting. However, that's not the case in *specific* situations as
>> I am trying to show in this bug report.
>>
>> > At least according to the docstrings I wrote at the time, and which I =
suggest reading.
>>
>> Neither docstring directly discusses whether additional fontification
>> can be performed by Emacs when using lazy highlighting, so my
>> assumption would be no.
>>
>> If it helps, I can reframe this bug report as: if lazy highlighting is
>> enabled, can Emacs perform additional fontification (outside the
>> completion frontend and style)?
>>
>> If the answer is yes, can we consider changing that behaviour? As I
>> believe it constraints what packages can do.



--
Jo=C3=A3o T=C3=A1vora




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 19 Mar 2025 15:19:19 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Mar 19 11:19:19 2025
Received: from localhost ([127.0.0.1]:52322 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tuvCQ-0005ti-Kc
	for submit <at> debbugs.gnu.org; Wed, 19 Mar 2025 11:19:19 -0400
Received: from mail-io1-xd31.google.com ([2607:f8b0:4864:20::d31]:51490)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <joca.bt@HIDDEN>) id 1tuvCJ-0005rm-1D
 for 77054 <at> debbugs.gnu.org; Wed, 19 Mar 2025 11:19:13 -0400
Received: by mail-io1-xd31.google.com with SMTP id
 ca18e2360f4ac-85517db52a2so72724839f.3
 for <77054 <at> debbugs.gnu.org>; Wed, 19 Mar 2025 08:19:11 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742397544; x=1743002344; darn=debbugs.gnu.org;
 h=content-transfer-encoding:cc:to:subject:message-id:date:from
 :in-reply-to:references:mime-version:from:to:cc:subject:date
 :message-id:reply-to;
 bh=jw940Zur9UrLJFRJWtuwMT0avlJ87D28PRCPW+sToNg=;
 b=mU2RyTZJP6xrxPNR9RiHhs4O4FXV0jzfprJnGipHFfkfeWOYVuwu4CYyGLEfJURG+p
 htLxwvmVLl6MyKFOJWBVs4ylbK4hUJSSvJRz2Q3FdYIQtlxuapz01PlVhKJzrsZMd2bS
 G5WCdJzeBUxzkatwu+9Xhq3pzz02GctElE6LgtnBNq5dr1oVACFzv8+g6ZSbGZdnAqPL
 2kW5NdP+i42FySLs/l85DoGePoGXil+aJmr3iZl4RdMXK9297x8jm/QNrujukeaGVUdn
 LQcNV7jkrpExw+Bwcw0y7MUl1iDuIqFNJMjqM/NVUWhLUXIgc6d+JJPVlTXzHM47nWeR
 2HbA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742397544; x=1743002344;
 h=content-transfer-encoding:cc:to:subject:message-id:date:from
 :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc
 :subject:date:message-id:reply-to;
 bh=jw940Zur9UrLJFRJWtuwMT0avlJ87D28PRCPW+sToNg=;
 b=bDAFO1z2RSIfIZyQZln6p6mHuDhWqhmAs37hk59/kuyBmuyBXwFUsb88KA+X2qxnru
 GuyUYyEtL+51M8VjtfAyZnHzpM0Hh1W2O4irAcvRfj0mvNujMRIwqJfexMwmLfqEbW0t
 2kQneMUthAVrHiDg+P+7CrqhZNg+DXoSdToWWM/ULJciXityvXv3SKsw63cUFbNyyVM6
 AUX4HcetEKc3b6JQ2AUWT0G0Kke2B7+vDBwqodqaRvCBlKKy6gqxSG/sNx8dNRLQbRLI
 9XUWl8ONRYsDJuE3GjsXiVOnRAzv3egr82HKm2iiZvbQN3PImroh/mqFvAiYZ0LmPp+b
 CZ9Q==
X-Gm-Message-State: AOJu0YyzacUHj70tGrtiHH/h4Gsk75Y6ZGbo7LN4Ge9hW94EFihdictC
 4UxUL91b6bhRkl+mU+fpMY1Xv67rF/R1viCRmDURuLoQaq/jgoD8gbinMLb+9r7e6jPZuS7tfPC
 I3fB7XZWpdyfpHGABsp4v4RahXLk=
X-Gm-Gg: ASbGncvP2UGmNDCsJzB4TY7wu+oEuuJqXiTy7dvbBXACdyph9dKPSXfvphvGNWY7hUk
 pbGUfEOWkPTS/iARE+KFoQIVLBwPiaQqAGbOnGJ4BrEOfqemTK1Tft+xaJojlsOj4msTFaXB1VF
 S9FUZwPmezxA8qpHsE1S2oAFqD
X-Google-Smtp-Source: AGHT+IGMdg+V0zyKB95nhbj+fWNfIerzr50lrfJkbF5zZ7EEiQf+kHjXgO64fk1SiB5WJL3q8+8iI+YwLt0dqBv7GZs=
X-Received: by 2002:a05:6e02:378a:b0:3d3:f27a:9101 with SMTP id
 e9e14a558f8ab-3d586b22049mr30334765ab.1.1742397544599; Wed, 19 Mar 2025
 08:19:04 -0700 (PDT)
MIME-Version: 1.0
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
 <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
 <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
 <CALDnm52tW4Drnr_64DRTWzyqy2_NkZgf-i4SQ3KJa=5Mdi_-4w@HIDDEN>
In-Reply-To: <CALDnm52tW4Drnr_64DRTWzyqy2_NkZgf-i4SQ3KJa=5Mdi_-4w@HIDDEN>
From: =?UTF-8?B?Sm/Do28gR3VlcnJh?= <joca.bt@HIDDEN>
Date: Wed, 19 Mar 2025 16:18:18 +0100
X-Gm-Features: AQ5f1Jqg606jamCgUSB4ADhTjRsNLNoXXqkWoXeN35VYonqrqrBXuF69ktzIcuM
Message-ID: <CAGiBfP1rfaB47jtPerLzx9SJp8k1v3yTvOOqqc9dagu1SYx8-Q@HIDDEN>
Subject: Fwd: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
To: Eli Zaretskii <eliz@HIDDEN>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77054
Cc: 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Eli, is this how we want Emacs maintainers to behave?

---------- Forwarded message ---------
From: Jo=C3=A3o T=C3=A1vora <joaotavora@HIDDEN>
Date: Wed, 19 Mar 2025 at 16:14
Subject: Re: bug#77054: Completion highlighting applied outside
completion-lazy-hilit-fn
To: Jo=C3=A3o Guerra <joca.bt@HIDDEN>

So, sorry to disappoint you Jo=C3=A3o, and best of luck!

Jo=C3=A3o

On Wed, Mar 19, 2025, 15:12 Jo=C3=A3o Guerra <joca.bt@HIDDEN> wrote:
>
> > AFAIK this feature has been in Emacs at least for a full major version =
cycle (29) and had it failed in its basic mission we would have heard about=
 it. I also remember testing it thoroughly.
>
> It feels a bit disappointing when the answer to a possible bug report
> is something like "nobody has reported it so it must be working fine"
> or "it worked on my machine".
>
> Anyway, here's a way to reproduce it in a less "complex" setup, only
> using Emacs builtins.
>
> The flex style sets `completion-lazy-hilit-fn` in the middle of
> `completion-pcm--hilit-commonality` to `completion--hilit-from-re`.
> Let's override that just for demonstration purposes in a *hacky way*.
>
> ```
> (setopt completion-styles '(flex)
>         file-name-shadow-properties `(invisible t
> ,@file-name-shadow-properties))
> (setq completion-lazy-hilit t)
> (defun completion--hilit-from-re (string regexp &optional point-idx)
>   "Bogus fontification that only fontifies the last character of STRING."
>   (message "lazy %s" completion-lazy-hilit)
>   (let ((last (1- (length string))))
>     (add-face-text-property last (1+ last) 'completions-common-part t str=
ing))
>   string)
> (icomplete-mode t)
> ```
>
> See the attached picture for the outcome (if that doesn't work here's
> an alternative url
> https://drive.proton.me/urls/ZMMW1D9S2R#EXEwlTnWeCHy). You'll notice
> that my fontification function has run, fontifying the last character.
> However, additional characters are fontified, meaning there's
> fontification happening elsewhere (the culprit indicated in the
> original bug report). It could be the case that the frontend decided
> to do additional fontification, but that's not the case (except for
> the first candidate).
>
> My expectation as a user or package maintainer is that no
> fontification will be performed by Emacs if I am using lazy
> highlighting. However, that's not the case in *specific* situations as
> I am trying to show in this bug report.
>
> > At least according to the docstrings I wrote at the time, and which I s=
uggest reading.
>
> Neither docstring directly discusses whether additional fontification
> can be performed by Emacs when using lazy highlighting, so my
> assumption would be no.
>
> If it helps, I can reframe this bug report as: if lazy highlighting is
> enabled, can Emacs perform additional fontification (outside the
> completion frontend and style)?
>
> If the answer is yes, can we consider changing that behaviour? As I
> believe it constraints what packages can do.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 19 Mar 2025 15:13:12 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Mar 19 11:13:12 2025
Received: from localhost ([127.0.0.1]:52277 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tuv6T-0004zD-LJ
	for submit <at> debbugs.gnu.org; Wed, 19 Mar 2025 11:13:12 -0400
Received: from mail-io1-xd35.google.com ([2607:f8b0:4864:20::d35]:50214)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <joca.bt@HIDDEN>) id 1tuv6G-0004vv-B2
 for 77054 <at> debbugs.gnu.org; Wed, 19 Mar 2025 11:12:58 -0400
Received: by mail-io1-xd35.google.com with SMTP id
 ca18e2360f4ac-85e15dc8035so18135039f.0
 for <77054 <at> debbugs.gnu.org>; Wed, 19 Mar 2025 08:12:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742397170; x=1743001970; darn=debbugs.gnu.org;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:from:to:cc:subject:date:message-id:reply-to;
 bh=dIlsek0EUD+e8VzVFFCIpfGhxVe5gWVFwUtx5F+Q33k=;
 b=JQp6wwVtAV4AoLCuA20OTvq3puVYccyqrOzqwShhAAu7A1LdG9uB91PPyV6tbzybvK
 wxY34NBj37ZW/1V1q8MGSlW/JR2Vd9IYCGg6/pHUgIEm+4KsZguKw7ffYWap+9qhFQsd
 vPvy5M/TOycEpejFYbAJT03Je0D7h+4kqnHElaRpE5JygMjqLjlSZR/eW4W4/W574OfW
 hN+UFDnn8TAA3kWNqQ43Qsx3Mbi7/us/0txng6Y15rU/1Zp88Ikinh+q0puOPNv8EGie
 stFdpOwSeOIdofTUTwOxX0H2Nzr1IFyNqFGCaymz158lnGTluAemYTsIweVs3zgXXZVs
 W6JA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742397170; x=1743001970;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=dIlsek0EUD+e8VzVFFCIpfGhxVe5gWVFwUtx5F+Q33k=;
 b=SvOXyknjhxdbykypLLKiVSbiTFNB/4A6i2yvBlvD0pKA9u/eOIauqCU86DVDg+RNi/
 MvNXdza6hUybMOdklA4Q8GpnVM/XfY34sF8NIdlO/7Dy61NcZiJ33NS5tGGfV0qSZxHs
 28C3cnJeoAYVkDP/sN1FmFdXLiNgHJEB6CH221H+lS/S+igu9hbszwvPC9lfNWi89U9l
 t65/3dZlsNNTorunCF5jELkoOvh6OIw2FZUzQp27kfSMFdQGlwV1kL+pr3/A0//Kiar7
 HumpznF4sxbGmXjTBC0LaV+OAD6L+d5hqPxUVG0kkKVsgBbh4bA7iT91G7uQyrGObmoE
 yxAw==
X-Gm-Message-State: AOJu0YxcFh3lLi6aLxnEP4GxJOxEnCEAWbR3ofzcWfmV85ZvTqiGqmr6
 jksO2IL9SuUFH9+ypPhDqs8d/cCOinFabq4XI/qV/43fN6d/d0ovyQIqK3wceLEJbAoRlTduqvD
 es2J/lo1TyXUNHFN5d9+A1mAP+teMUk8N
X-Gm-Gg: ASbGncvlxHlDX7yyOEnFh7rRYFxDhqdfouKJMdNgXxBUqk0O6KqLzKHw9mRFo8r0QOp
 k4qTbSPz67Qsn2Drb8DpXv9dd5+lbuMy2EayhFFRjYDI0gW4mVBe916zdvj3c22VECcwLaRtjnV
 1qu/0s0BWq7b1b3E93CrvNVWJW
X-Google-Smtp-Source: AGHT+IGlelkxGOEx3syKxqqew3UJgVTiUBVyKo8f4bJXTJL1FRRp8wz6AwzjqRGSX7DWfvoZ+r5VuWyGjSJQuZrpZGo=
X-Received: by 2002:a5d:928f:0:b0:85e:181e:1bd3 with SMTP id
 ca18e2360f4ac-85e181e1d5cmr163705939f.1.1742397169193; Wed, 19 Mar 2025
 08:12:49 -0700 (PDT)
MIME-Version: 1.0
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
 <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
In-Reply-To: <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
From: =?UTF-8?B?Sm/Do28gR3VlcnJh?= <joca.bt@HIDDEN>
Date: Wed, 19 Mar 2025 16:12:02 +0100
X-Gm-Features: AQ5f1JrKbiZgn3LX5GQ3nTtpnywLbmv6x1LgToFFVAEtgzhyJzKhtJCypTUOhGU
Message-ID: <CAGiBfP1s0exbPYvcVVysj5JwZGRU75PJ=fdWbzA6PbYwWTTfzg@HIDDEN>
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
To: =?UTF-8?B?Sm/Do28gVMOhdm9yYQ==?= <joaotavora@HIDDEN>, 
 Eli Zaretskii <eliz@HIDDEN>
Content-Type: multipart/mixed; boundary="0000000000005404590630b3740f"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77054
Cc: 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--0000000000005404590630b3740f
Content-Type: text/plain; charset="UTF-8"

> AFAIK this feature has been in Emacs at least for a full major version cycle (29) and had it failed in its basic mission we would have heard about it. I also remember testing it thoroughly.

It feels a bit disappointing when the answer to a possible bug report
is something like "nobody has reported it so it must be working fine"
or "it worked on my machine".

Anyway, here's a way to reproduce it in a less "complex" setup, only
using Emacs builtins.

The flex style sets `completion-lazy-hilit-fn` in the middle of
`completion-pcm--hilit-commonality` to `completion--hilit-from-re`.
Let's override that just for demonstration purposes in a *hacky way*.

```
(setopt completion-styles '(flex)
        file-name-shadow-properties `(invisible t
,@file-name-shadow-properties))
(setq completion-lazy-hilit t)
(defun completion--hilit-from-re (string regexp &optional point-idx)
  "Bogus fontification that only fontifies the last character of STRING."
  (message "lazy %s" completion-lazy-hilit)
  (let ((last (1- (length string))))
    (add-face-text-property last (1+ last) 'completions-common-part t string))
  string)
(icomplete-mode t)
```

See the attached picture for the outcome (if that doesn't work here's
an alternative url
https://drive.proton.me/urls/ZMMW1D9S2R#EXEwlTnWeCHy). You'll notice
that my fontification function has run, fontifying the last character.
However, additional characters are fontified, meaning there's
fontification happening elsewhere (the culprit indicated in the
original bug report). It could be the case that the frontend decided
to do additional fontification, but that's not the case (except for
the first candidate).

My expectation as a user or package maintainer is that no
fontification will be performed by Emacs if I am using lazy
highlighting. However, that's not the case in *specific* situations as
I am trying to show in this bug report.

> At least according to the docstrings I wrote at the time, and which I suggest reading.

Neither docstring directly discusses whether additional fontification
can be performed by Emacs when using lazy highlighting, so my
assumption would be no.

If it helps, I can reframe this bug report as: if lazy highlighting is
enabled, can Emacs perform additional fontification (outside the
completion frontend and style)?

If the answer is yes, can we consider changing that behaviour? As I
believe it constraints what packages can do.

--0000000000005404590630b3740f
Content-Type: image/png; name="77054.png"
Content-Disposition: attachment; filename="77054.png"
Content-Transfer-Encoding: base64
Content-ID: <f_m8g1cu8s0>
X-Attachment-Id: f_m8g1cu8s0

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
t1LcZWS5RobvRfd0YHFvVFd5fgHDXbhr/ezqERwZfoa3XXwaPX/LP4nN96fPUeJ+4In1DX/+jbwf
Hf655fDPNz9zfs7mkov8Dwz3epDHNSJ8Lf43SE5Ox/+u8J/63wMuJ78faVPrd0eL+/TXiirb79sY
yvLf/T/pP/zOv64sm1YLtYpuPd8DU9zffvst1QX+l37pHfTii7tpz55H6cSJ4/TEEw/S1NTn6Utf
+gzdddeoyhlnnE5///ffplde/j795PUfqfzoH35Ae158gZ584nEa/fSNNd8PgiAIgiDIQk/d4h4n
6yzp+k8dfQ7dEqbXV+dK6NbtWn5J5mNY3HlZJQ6PYefZ5fkaPA631nDduCXf7CGQdTk5Le56jXYp
5FLO48L3xdHPSl6rUWmltHNs4i67v2cJn0eLe6d0lefwsxxdvUxFCruZPZ/7F0ret29ZqdKoz6DR
98PRz5Z/1vnZ85Jmt956a2W+iWa1tnP4vGlb3PmeebgMz2Cuw9813s7fF72N/85/8rZGiLtsadf5
X/+Xf0b/y//rnypx554hvNoFh4cNcbTQP/XUU5V9vI1fRPG2ThD3N9/4R/rFL35Ov/RLv0TPPjtJ
3/zmFH3ve9wF/l66777bVCv81772BRWW+507ZlRL+z/88DWV1159mV595fv03ef/nkY+dX3N94Mg
CIIgCLLQU7e4S1FPCh+vhVhHL+GmW5Fr+SWZj2FxZ2HgXHPNNRWRqDX8izu3kPN4aR7rzmPiOTye
Xl4/Llw3s2Vdt5rXEv0LPP/ibbZqNjJS2lsh7/yMeE4BTiO7yvO5OqGrvBn9PLW8y+esW+Vfmv5P
9O3pv1Jp1PNvxv3o8PNl4WJR53Xd9aR1tTz3tNHibo5xN8e5d0KL+47xLSqyxf2f/7P/J/2zf/r/
6OoW93/8xVE68rOf0nvfezaNjd1MmzffTDt38tr0d9LWrSN0//330HPPfUvl3HP/kMa3P6TGtr98
6KAKSzv/eeilObpty6dqvh8EQRAEQZCFHoh7TCDuEPd6BMcViHvjAnGvTXTr+R5A3BEEQRAEQVqf
jhJ3c6k4ec2kaHFnYeBwl3b+5Y9F0JRx/XctibboLtta2lk+eGIrHjfPueqqqyLXj4sWd91VvtaY
8t8scZcSKSPLNyr8jPRz5/vjMdP85WT5toVfzuguxXIfh6WNh0zwd4pfeNT6vapHcJKiJV0/V/M5
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
quXm5qZpzWAfeZP7Ip+xEvBenkVcz0w9R9Ob19BAL79kcAt9orgrEedZ5UdoP7/A0cXm5mjz4CAN
jES7smcX9z7K8TJo+/nzrVxAvYywTlqXESXTffnwrPJzczSzhp9ZnlaPnwh1jfdnlR+h/aFZ7lna
V9DASHRW+aaKu9rEs8qPhJdPm5ujLUF95POR19BErlULQVf4oVX8/Q/PdG+bVV6NoR8YoT3G95KX
2uMVA/p6xfj5ENnEfW7LWbSMZ6nfo1/QzNHMlrXqu8UvGeoVbj7/aXz+F/1Z08Pnr0Polbgvpd7l
q+ihvebPNXeVP80+aR3vveUsOm3pED1k1ueWdWqcfD6yJBzTGeJez6zyWA4O4l4XFamSOxTVZc10
lJyVjfHRka7IceuyB9tCNpu1fBaMc9jiqHu2+9Xj4s1z+zIsl0XSRNYFD8pbfLhmlLhG7sN+gVT1
CVYgMJ+dv1us4+542ZKlPqkxxrCHzx8Veb94Pnbdbtd49sjzsazj7hesjmFXoi7q4/Jstfxb0vNX
p2fBjNa7Un8psgZcHxZ1XZaff1huLahW9/jzZkKdL35cf1jG/bHp5j2rNdlnT1XXnM+PVn9B1i3u
s1NiXHyehkbdLwgYXmIu/Hyk/DcGfknA0mlvZQ7WKrc8Fz9DzuOYJLHOjOr6nvB5hWScBZTvr3qM
WpNdfV56LXFjsjzd4n4g+LyMdan9z8t9H7zEXGTtd5ZDWVBRVmusu6S+1aiXGaE16XnddCHnBlnW
cff3j6jlv5S4q89vyG/FZ3EPJkNTS7HNVsewl1jU+SVKpT6WddzV8cbYXktWW5Z489dNF/e7mmXe
PXRCvTio1CdYCz0kw34Lepr6SA/Juo67fy49s7zfMs/Lnul72aRb0XWL+75JWjPoL++ny6zelH5u
gyRYFvmlR3X+AH6eQs5F+bTruPv7N9HeE/z94ZcEfA88q/s8nWQR1+tVm+Hyx+epzDJdKX8iVH71
eLUlPes67vr5b1czy/st80uMe9+4N50QRzDGsJdY1Jfotdld67j7y9YtNb5zvEY5L1M3tiJYg335
Rno7kDV/sjzL8wriFn1+cXAWrajUJ1gLfa/8jtaO/fzRl2iZ0C3uL07S2sra6v7zXLVx3NHzw2fm
lrNoxdL4+viCH/M8H3qLQk6ulofri5QLH/NmcEx1HXd/n55Zfo5uOfs0Y715sS573DruEdHX+LPO
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
XrzfjfvcD17nkfh+ixH75u2vfw/z38d9sK7RleVziS3fb372q8CPJRfqpcnbXuTzX94s5sVzFqvL
lJKnno+2JY+Qb25nObenz595pPEUkXnv456Xf+COfLeEzfXf/vlQ/sfybPrCoUPp6OnmafkiIrNm
24v79mRQ+uKUaxERkd3LbNPl90SmjPCLSAuZNIVeRGTO7NHiPpxmf+Rc5esiIiK7lWLUPU8zbxiB
2zNR3EX2XPJMgKXjX97a1ehFREL2bHEXERFpP4NR9xNTri7fehR3kb0Vo+0iss1R3EVERPZxiovV
hfN744XcREREZH9HcRcRERERERHZw6kt7r/3e78nIiIiIiIiInskleL+f//3fxMDALDfHTp0qOYW
Ys358MMP4yoAuAXEPhzzySefpP/93/9N//M//7OjeeGFFxR3AODWorgDMIvYh2MUdwCAHaK4AzCL
2IdjFHcAgB2iuAMwi9iHYw5wcX8v9RZ+mBZ678UHtl1/5UZayK+1cCOt9OOjW9dfezd1i/WOciN1
uz9P9S8x2/vd3NZhpix/UPVXummhuxK/zC7I+75T/IHaTSvvfBIfPpD6K8up011JnxzYt7uWTi12
Uufk1fTxAXiP/Ut3pcXli+njg/BmGhTvsdMZlsVj6eLbH6f4bseXWUgLJ6+kjw/uN/EWXEunlxaH
v88G++ejmu+ZuuJ+7GtvlZZdT4/fvZQWh7fb23pxv5ZOH1pKi6PXeejl9GHN9pDS+uNn0t3lz27h
WDp27GR6+a2PKr+nr585nA4tLqSFY4+lNz6s/pwMrKfH7zmclsZumfhQuvy7j9LHcdEDYT09ce9t
6dDY+30wvfS7D3fk/a4/cW+67dTL6bcf7sTaadf1dO4zt6WlB7+bfvPBwf181598M336cKl/ffFX
6de/q/42iX04Zk8X97VeubQ2p7cW33Y2W5HdPvn1trG493+eunl9a+/HRxrM/36LEj/H8gdHP610
Fxq+b9gda6nXuVWKez+tLHdS7+onDX/w7ay1U520vPJO5Y/RJvMuP3CQins/XbprMfWufjznPtge
104tpuWVt3d8PxalvJc/r9leaN7l96trp5fSXRffSh/N+Tb7j9+dlk7NWdyvnk6HlkoHRobZenHf
tP743enQqStzFPd88OBQWuwcS19786Md//5rdO3xdM/SUjr58pvpox36Xlt//J7a/Z7z0OUPKp+9
4l5HcZ/F9XOvp3su/ib97qP4CJtujeJeVpT40wewuA9MLsQr3abivtsmb+e8dqNU78Zr7ElrvbSw
0GuYucDuuIWK+9qp1On00js79EfoNPMW8XmXP3CunUqLnV56u6Xmori361Yt7sXyyxfTmx81FdPd
MSrVxx57c+Ztn8+1dObwobS4cCw9dvnDHfo5u57O3JZf4yAX97Lr6exth9OS4l6huFNHcVfct2Q3
XmPvGYy2d7frg2KLbpXiPhht7+YiHB/aJfMW8XmXP1gGo+3LF3e+ODdR3Nt1Sxf3vPy8b3yb7V5x
fyhd/uCjHfq9rLhvN8Wdg2SW4v6Zz3xm7N+FX/7yl/u0uK+9mxa6Py89Pm72c7iHU8sXfpi6K++H
88lvpN5K0xT199Na78bYuefd3nupH7dzi/KBiHgqwGbeTfEYxezvt2q24v5+WumF1+i+m9amvM+d
Ou//pm37aHs/rfS64394dXvj+6e/krrDx7q9ldTrjv73WurnAjv8/8XzSk8rnrrWS71ud+P5o3X0
J72Bfl5neZu6xWut9OoPWKyt9MbXn7djpVdcA6D6K2Ve/bTWi9s/fN83Vdzz8wd/8OZS/M5aLy1v
TNnrpl5jUe6nlVPLlc/ratiOXLY3zn3sXkxxM8ceX+ilq01lZobR9rVLp0rbPtj/V1d6w3Pi4/P6
6dKp5dJr5+07Wdn+7NLYNlbTvThezuddPutfWk6d8lTJxqnyw6n0w/W8s5bf86iwdNPJmnUX+sP3
O3qNbjddvPpOeidfM6D4WjddfHv8FIRrxf7cLEPdvH8u9lJneWV66ZxhtL1p/Yt5/ZXnhe0v3sPJ
dOWd6mkT+YDB2HIhx7b5YMK8RXyW5fvXTqdTy93U7Wx+Lx07eTG9XfP9meWSPDqvu5qT6crG6O/g
gMrGsmPnko+fZ54L8Vb206XSOeZ1KYr2hPXeKsV9/dqZdPfY92o+N7ybOp2T6eUPYxFeT9fO3J3u
Gv7sF8sfO5YeuvJWevuT8DNw7Uy6Z+yc85hj6bE3b2KEfP3xdM+hpQnrz9Pky9PzG6a+fzBLEZ+1
uK+n62fuSXfH/fPym+mtj6u/I4pnXD+b7rm7fv9fvunSvJ6un61uz4MTtmdg/xb360/8JN1z6Idp
cfj37Z13vpsuf+3ddPiun6ffVkrV++mJs2+kQ0ulv4fvfDe99MYnle/LJ+57PR1ajH/Db+bOr25P
mb/+xLl0z+HN61rceeeD6fJjvXTb3RfT+7+Lv0fW05Pn7k2HlxY3v6fvfDB9940PKts/cv3JCev/
bVz/5OV/E5Zff/Jz6VOHS9syw1T59VeeTPfdczgt5lNXiu2/M33l8o3we+uVYur9ofz6X/lRunH1
bLqv+HnMz7kzffErN9LvPmx4w3NZT08+fF86fKi8P7+YvnPjdxP/rci2Utxzcnk/cMW9bJZims+j
73bzRd82y2h/LZ9fXjeS/35aycuu5KK++bVc5Bfy17expM6y7dG8z5m+/ODgRnFgovS+mvfPpvIB
iHxgZG/Y7tH2tdQbFdGx/TMo6nH/rPUGP3i94httsC35/3dXBgsWj8cn9fuVkr6WL6y3UC35heLA
RDetjB85KMrz4LXGV1a8ZjccCCiK/+Dr1V8p88jvsVu8v83VD7elOBhxM8V9II8Od/O68sGG4bry
/s9FuHpO+Vo61emkbu9qeid8XrmIxeWLdTceANgs5Y2lfYbR9vwanXxgoLwf+mvp1HKnOGAwXtxL
2/9OefFLtds/Mu8I+rzLjxQlvih28ZFNa3k0efh5jQ42bG5/nKKb98Ny6l0t7b9c5Jc7xToWakpk
Hq3O+3OsKPavFfszfz0uP276aHvz+gdfHy/u19KpxcXUPXll7PPtX7uUlhc7qXel/hz6fT3iXvP7
6lpxgbteqYRvyuu8q/Jemz6Hpq8P5IMAyytbK+1lRtybl7925lBaGv3BXEku1qVz46cV5WOPpTfL
54vfasU9b8/hCduTz6cPMwKun71tcK59XLbIsfTYG9Xz82e2/kS69/ChCdvz1cr2bNqd4n7Pypvp
gy2/warrZ19Ph5f/M91445PN38Xr76Wz976elrr/GYr7e+nsp15Pyw/+Kr3xVtpYfv36L9K9h19P
J1/6JNUdU9jJEffr5z6dblv+avrxG6ULKq5fT+fuvS0tdb8Sivv1dO7Tt6XlB7+b3nhz89+e9etP
pntvO5xOfvf9FDvzYP1fST9+48P69YciPm35WNzLihJ/6vLE4v7Kuc+le3qX042x78P19Mq5+9I9
F2+k34Yy/sq5z6R77rozdbsPpcs3Bj8bRfG/7XB66Ds3+5m8kh7+zKfSXV/8Trrx5ub+L9b/qbz+
X09c/yzFPWZU5H/961/vh+IejlZtc3FvHMkOz81fayqhgxHmg1XcJz5eXDzv3caR650acc8j0IPR
2zyqOueKt3m0vbgyfSzaI8Uo+/hr5ZJcLs6V5+ftm/FK9/UX18sHErqN+zu+/uhrte9hbTjiG78+
h/z+4uuNDK4svz3FvVMz4l1cxb23NlaM6r5WejAth5HxicuPHp90pfhZRtvz9veuVteRn7s8PuI+
KsaVZQcPVrZ/ZN4iPu/yI7MW9zwydDUsVPfcouTXbke/dCG88QeLYl1XLvNI+rQR91lG26etv/Tc
iUW3fyndtdhL79S81r4u7g0u3bWUeldnueDZ5HKerp1OS4u99PZH4Y+7vD+XltPFt6oHB+aluDct
fy2dKa5YHy5et36tuCL+Uueh0oh7Lr2H0lInjx6H0fX19XTt9N1pabF+OvzMU+VnKuJ1RXYrU+Wv
jz2nuVqMTCvuo4MCx4qDBWOj2euDUfhDxf55o1RUczkenptfLujr19MTxb7Or7XV0pwvNHc4HZqw
PYfzZ/LV8vaU7ePi3vtVqvTJ6z9Jn7pnfMR9/Yk30m2napYtHvxFuu+2d9Mbv60ePN/x4t77bno/
lt3r59Kn7xkfcV9/8r6iGFeWHTyY7vvUqfTG+x+MHyiatv664t6w/GfuqY64l00t7q9MWsd6evJz
n06nLv8mfVDaz7m433boi+m7v/kglXd/fq1Pn76cfnMTH8pgHS/Vr2P9yfS5T59ON379u8r3w8gs
xT0X9dH0+PLo+z4p7js84l5TxqvPfX/KVPjtmSo/Un396eZ9zrTlp10/YNrj2648mtwfjljn0eL8
XopR7ubSmm3vaHtTed4UH4/FeduL+xzPL6tOlY8j9lvRH06Fj18fqU6VL4pwzR9f5eRR5bG1NIyK
15Xu4srua9V/WEcqj+fy3F0ZTpMfjJ4Xo+PDBaaNpk97fKQ6Vb6bVsqjzEN5pLlpVD1renzeIj7v
8iN15TtqKuPV5+ap9acqBX9kc/nq49Wp7IPp9TWLjplYGEtmXf+0K9M3PX4rF/drp+9Ky/k1Ghes
L/bFlPtefWme114p7rlI53IbHyvnoZebR6DnLe75ivLLF9+s3f6B0VXn82sfS8ceOplO9i6mq/nU
lZpp72PTcZsSR92L7b4Fivv1M+m28vTapoyNug/K9WAGwOb+v3Ll7eIA4Gzvo8H1szNuT9Oo+/4s
7ll1qvyN9LXLv0nx2GCe+n7qcv2oetb0+KzFff2J+9KnpnwGD9aNilemyt+ZHrv8RuVn58n7crGt
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
wr/8y7+kV155pfjCtWvXKhu0p4s7t6xpxf0g8PMSTLs43S2k7hx35rO9xf3mKe4AsLfEPhyz08V9
1NGvX7+ecmdf+Nd//deiwY9G3f/pn/6pslGKO3uN4n4LUtw3KO43b08V93zqwOJi6jWMxgMAuy/2
4ZidLO7//M//XPTznL//+79PubMXxT03+L/+678uivu3v/3tlKfPxw2DvaK/ls+3nz4FngNGcS/0
1/J916dPUWefyBfxW+ykYyddUR4A9pLYh2N2qrjngfTcy3P+6q/+Kr3++uvp3/7t39JC/o9c3HNe
ffXVorjn5GnzeV694k7bKvdb7/aU9lvM4F7p498HTVeXP2gq92fvnlTaAQB2WCzqMdtd3PP15vK0
+NFg+ve+972itOeevlHc86h7/mJObvV5wT//8z8v8tprrxVD9T/72c/Sr3/96/h+AAAA4ECJRT3m
Zov7L37xi/T2228XXTt37lH/zl08X00+3wou9/Pc1f/93/89LeT/GE2Xzw/kBf7u7/4ura2tFU/8
1re+lf7sz/4sPfvssxt55plnJubpp5/e9Tz11FNbzje/+c19lW984xu7nj/90z/d9fzJn/zJvsrX
v/71fZU//uM/3vX80R/90S2RP/zDPxQRkS0k/j7d64n/zu1G4r/nez3x76W9nvj36G4k/t29G4n9
Yq8n9rd5EnvjbiT245hyt85dO3fu3L3z/dr/9m//dqO0544+VtzL0+XzQrn157n1+Ul5iP673/1u
cWL8aOWrq6uVF9+uxDc9a+IHtFuJ31R7OfEHdrcSfznNmviLdK8n/kMl1cQ/PuZJ/GNJqol/AIuI
3Ezi75iDmvjvzTyJ/85JNfHvpb2e+PforIl//+5W4t/7ezmxR+1WYm+cNbGnbldylx716tyxv/Od
7xSd+2/+5m+KDp67eO7ko36eu/qPfvSj9P8DQaQvgDYsUqMAAAAASUVORK5CYII=
--0000000000005404590630b3740f--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 18 Mar 2025 22:32:42 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 18 18:32:41 2025
Received: from localhost ([127.0.0.1]:43698 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tufUH-0007zf-GV
	for submit <at> debbugs.gnu.org; Tue, 18 Mar 2025 18:32:41 -0400
Received: from mail-oo1-xc31.google.com ([2607:f8b0:4864:20::c31]:50347)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <joaotavora@HIDDEN>)
 id 1tufUC-0007y7-Qh
 for 77054 <at> debbugs.gnu.org; Tue, 18 Mar 2025 18:32:38 -0400
Received: by mail-oo1-xc31.google.com with SMTP id
 006d021491bc7-5fe944a4243so1432592eaf.0
 for <77054 <at> debbugs.gnu.org>; Tue, 18 Mar 2025 15:32:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742337151; x=1742941951; darn=debbugs.gnu.org;
 h=content-transfer-encoding:cc:to:subject:message-id:date:from
 :in-reply-to:references:mime-version:from:to:cc:subject:date
 :message-id:reply-to;
 bh=gXmmKS5g0tB3iBKOlGSVVoE4QcUtF273WtL3vpxxGKo=;
 b=QxGgN/9Bo/us0y02v5bx+DM8oW1+H3Ica491FaMK9ZxEhO1QpvG16sSXb5jI7k8jM3
 N11nIs9UHC+SOO7T3XiFu4NB6BJ69whOxvA0FK5VArc8tmk39JlngS37PsQG6giBxIx/
 +iFRzipqbGpS5R9myuSZs6WUCxkVTI7zzQNcoswEHBGTvckQCyVkx54yRGPLg3vQH5Pl
 vwfD6mnLRhbZHj/4dBMYgQ/Af/xE6e4y9bH5Ia8qOXeKrt8Aiw/yvgELAmpS6fLYz6gk
 RHdd+FAWF6UrvBH3AOX5mNWYud4Bm9Jn9/RFW9r78Fx3fBoXFNISHDY5IMzeyp7f+ITO
 KEDQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742337151; x=1742941951;
 h=content-transfer-encoding:cc:to:subject:message-id:date:from
 :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc
 :subject:date:message-id:reply-to;
 bh=gXmmKS5g0tB3iBKOlGSVVoE4QcUtF273WtL3vpxxGKo=;
 b=PtLbMlKXJf5uRWuIMrzAejdAqVj1LmljEEvkVS+wAAcWo1wqfruv/Vfb48y1TTAKe2
 d9DrZdj5lltKioiuGZpyYe1UmsClpdmLmuZKkXX89c+hL3gpYDYxvWHwsu1A3RhqPIP/
 apkmJAVL5rMLhSjM4FOJni8An4z3iU4jBXzqh/xtKy8FDn3axIaYRUtD18Sqpkd2hahI
 PrcyOZagm1HLGuu8RQdm8cdjBkxVIH0T2IpDOYK+Nffz9fU/aK6FP4Lt02EyMsX3xeRz
 Q3r7YU4agtK9/6a6NsyahD832cJQPZ5GUWQ63JqWHn/h64KESFMw+j7KtUq3vItj1Ws2
 IbOQ==
X-Forwarded-Encrypted: i=1;
 AJvYcCWIXx+RXSCESyf+162WLY69bSUMjodQf3tFwC/23nsovWLZn6S156n1TifMhNpxCaOweeXeAg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yye5W3csUcWJy+50cAECf9jrPrZGbhI3pRyJioC3XXcik1dkuQg
 8aTTwDQT5RYAcpJlJXZa17eAOouIm4iHKblBwKcjTkwKUYE4aWVRNNGwkv6tbQt/2swyxkYCRa+
 g5/9nXRSivLjss/qjsFgUx9OhXRY=
X-Gm-Gg: ASbGnctX0jBxlo1sjpmQe3Kp9UeKCJ3RzWnH09QS54D4gxLdXZDFGYQtuMWGDrkfDXY
 k58UkyaFqpNj4Mjr6e3c7WHEfhgz96sd03OyvfA4Wo17z2l32o9/3fJpCIvimqhFkp4XOVJN/GP
 iD7Maf6ixAVscyDhgTt1DrQUtE
X-Google-Smtp-Source: AGHT+IGcJkIgITDtxHKSDMKev3sKm1Z2dEzoY0ToM0Paow0UnasIDOkm1Mh+JGiER+rcqmuqEmJ6h1mqM4OamsdUnuQ=
X-Received: by 2002:a05:6820:1ad4:b0:602:1c33:176b with SMTP id
 006d021491bc7-6021e3bace8mr277442eaf.3.1742337150776; Tue, 18 Mar 2025
 15:32:30 -0700 (PDT)
MIME-Version: 1.0
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 <868qp5t1kj.fsf@HIDDEN>
In-Reply-To: <868qp5t1kj.fsf@HIDDEN>
From: =?UTF-8?B?Sm/Do28gVMOhdm9yYQ==?= <joaotavora@HIDDEN>
Date: Tue, 18 Mar 2025 22:32:47 +0000
X-Gm-Features: AQ5f1JrLxktE_gfLcD1Aj01rKreNn2jcoHzjatjo21dOgzSgpHgcSYapCACbCxw
Message-ID: <CALDnm535E6xK9xen6VGkH51jwsRs06xgJNHFXQyLo5xBW+tGMw@HIDDEN>
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
To: Eli Zaretskii <eliz@HIDDEN>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77054
Cc: =?UTF-8?B?Sm/Do28gR3VlcnJh?= <joca.bt@HIDDEN>, 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On Sun, Mar 16, 2025 at 3:52=E2=80=AFPM Eli Zaretskii <eliz@HIDDEN> wrote:

> > Steps to reproduce (Emacs 30.1):
> > - emacs -Q
> > - Load:
> >     - https://github.com/minad/vertico/
> >     - https://github.com/lewang/flx/
> >     - https://gist.github.com/joca-bt/356ba1201c4fe842144e19ee1c723c28/
> > - Eval:
> >    - (vertico-mode t)
> >    - (setopt completion-styles '(flx))
>
> Thank you for your report.
>
> Adding Jo=C3=A3o T=C3=A1vora, the original author of this feature, to the
> discussion.

Hi (and hi Jo=C3=A3o! nice to hear from you and know you're still an Emacs
user)

Anyway, this was about 1,5 years agora and I'm afraid I don't have
the  details in my mental cache nor do I have the time to test this
complex setup.  AFAIK this feature has been in Emacs at least for
a full major version cycle (29) and had it failed in its basic mission
we would have heard about it.  I also remember testing it thoroughly.

It's important to note that completion-lazy-highlight-fn is not the only
variable involved in this scheme.  There is another:
completion-lazy-hilit.  I don't see it mentioned in this report. Both
need to be set for lazy highlighting to take place and actually save work.

completion-lazy-hilit is to be set by the frontend: (that would be vertico?=
)
while c-lazy-hilit-fn is set by the style.  At least according to the
docstrings
I wrote at the time, and which I suggest reading.

HTH,
Jo=C3=A3o




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at 77054 <at> debbugs.gnu.org:


Received: (at 77054) by debbugs.gnu.org; 16 Mar 2025 15:53:00 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 16 11:52:59 2025
Received: from localhost ([127.0.0.1]:50427 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ttqIL-0004LR-7l
	for submit <at> debbugs.gnu.org; Sun, 16 Mar 2025 11:52:59 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:43620)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1ttqIH-0004Je-95
 for 77054 <at> debbugs.gnu.org; Sun, 16 Mar 2025 11:52:54 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1ttqIB-0006md-VA; Sun, 16 Mar 2025 11:52:47 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=7DCNKFIVHBPWEzJCsRn6kO3bmHZTMtfacZbFhwn6MCA=; b=savaosPPaUw14paKiyqc
 /vGfaBsole0yLiQpQoi1bCeZhlbDeqUQ+Fo45WhrOSh3vpOR+ASp5VIZQQJdvLZ/tiFhBpyyrf1Jw
 7Py+vy/XP80FJGXuBMpw0F3Ak1Xe3gadbFbdypcWAmRykZLdUKfJQyld4ypD7JxIQDmK0DmawAzHe
 1kCv9LQaU5rjaELYfEZTIdreDrJ3udZPhztYNT5yIpMjtQ2FGN3usSLbmkC6RZHgM+wVu6mOUBDaj
 aHcfbRKM0A9Y5re97y43sTZNdfI9ERMdRSKb9nH4chqsZpM6lOLIGCRTjBlsziGZvFpgPOnUlyOG6
 VKwBBtszd99g7Q==;
Date: Sun, 16 Mar 2025 17:52:44 +0200
Message-Id: <868qp5t1kj.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?Jo=C3=A3o?= Guerra <joca.bt@HIDDEN>, =?utf-8?B?Sm/Do28g?=
 =?utf-8?B?VMOhdm9yYQ==?= <joaotavora@HIDDEN>
In-Reply-To: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
 (message from =?utf-8?Q?Jo=C3=A3o?= Guerra on Sun, 16 Mar 2025 16:27:00
 +0100)
Subject: Re: bug#77054: Completion highlighting applied outside
 completion-lazy-hilit-fn
References: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 77054
Cc: 77054 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: João Guerra <joca.bt@HIDDEN>
> Date: Sun, 16 Mar 2025 16:27:00 +0100
> 
> TL;DR: Emacs applies additional completion highlighting even when
> completion-lazy-hilit-fn is set, leading to incorrect behaviour with
> alternative completion styles and frontends.
> 
> I'm implementing a custom fuzzy completion style and encountering an
> issue where Emacs highlights parts of completions that it shouldn't.
> 
> For example, given the following directory structure:
> 
> ```
> <dir>/
>   ...
>   set-editing.el
>   ...
> ```
> 
> and the input pattern `set`, my completion style produces three
> possible matches for `set-editing.el`:
> 
> ```
> 1 set-editing.el
>   ^^^
> 2 set-editing.el
>   ^^     ^
> 3 set-editing.el
>   ^   ^  ^
> ```
> 
> Each match has a different score. In this case, match #3 has the
> highest score and should be the one being highlighted.
> 
> Completion styles can bind completion-lazy-hilit-fn to control
> highlighting. However, Emacs is still applying additional highlighting
> outside completion-lazy-hilit-fn, resulting in the following
> highlights:
> 
> ```
> set-editing.el
> ^^^ ^   ^
> ```
> 
> When completing files and buffers, but not commands, Emacs is
> highlighting prefixes in
> [completion--twq-all](https://github.com/emacs-mirror/emacs/blob/8ac894e2246f25d2a2a97d866b10e6e0b0fede5a/lisp/minibuffer.el#L677).
> This becomes more evident if I make my completion-lazy-hilit-fn not do
> any highlighting: completions are still highlighted when they
> shouldn't at all.
> 
> Expected behavior: when lazy highlighting is enabled, Emacs shouldn't
> apply any additional highlighting. While the current behavior works
> for the default completion style (i.e. completions buffer), it easily
> break as soon as users employ alternative styles or frontends.
> 
> Steps to reproduce (Emacs 30.1):
> - emacs -Q
> - Load:
>     - https://github.com/minad/vertico/
>     - https://github.com/lewang/flx/
>     - https://gist.github.com/joca-bt/356ba1201c4fe842144e19ee1c723c28/
> - Eval:
>    - (vertico-mode t)
>    - (setopt completion-styles '(flx))

Thank you for your report.

Adding João Távora, the original author of this feature, to the
discussion.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 16 Mar 2025 15:27:58 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 16 11:27:58 2025
Received: from localhost ([127.0.0.1]:50385 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ttpu9-0000h4-Va
	for submit <at> debbugs.gnu.org; Sun, 16 Mar 2025 11:27:58 -0400
Received: from lists.gnu.org ([2001:470:142::17]:52738)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <joca.bt@HIDDEN>) id 1ttpu7-0000g0-0V
 for submit <at> debbugs.gnu.org; Sun, 16 Mar 2025 11:27:55 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <joca.bt@HIDDEN>) id 1ttpu0-00053b-LR
 for bug-gnu-emacs@HIDDEN; Sun, 16 Mar 2025 11:27:48 -0400
Received: from mail-io1-xd33.google.com ([2607:f8b0:4864:20::d33])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <joca.bt@HIDDEN>) id 1ttpty-0003Wu-R0
 for bug-gnu-emacs@HIDDEN; Sun, 16 Mar 2025 11:27:48 -0400
Received: by mail-io1-xd33.google.com with SMTP id
 ca18e2360f4ac-85b3f92c8f8so286920139f.1
 for <bug-gnu-emacs@HIDDEN>; Sun, 16 Mar 2025 08:27:45 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742138864; x=1742743664; darn=gnu.org;
 h=to:subject:message-id:date:from:mime-version:from:to:cc:subject
 :date:message-id:reply-to;
 bh=Q15QewKGPnh0puN7QAyyiRN84JTJiAvIdm6dW27UaaM=;
 b=buImDz61HOD68fexOH3mCCGVsUNWgtTdbSPbb/US/7iHttgLIYwpUjf5STP6z25OIq
 EJ8rcxXGtC2qz9KZvuyd6u2IkUWzERKwyJSDIx8WQQ5VP9SfIcjPg8rCtx+VEwPC2j24
 H8Y3IutR5NH97OGIO1goZoK+SH2krN2UWlypNN8xiNrv75XqKj+qU9y+tGHtszkYs6KO
 yghbasifqm0z5liOxNNSjMN+rl9sRHvG+HIJZMw7/NF8IR1En/rGEhC1wkgOn9NaGPnu
 /Y6nkgK9eCK42YhRrzfYjMIOnFrBQc51k4uuMF+3a+ji/csiMfkHrCs4zVdUZ0C0fvuM
 KL1w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742138864; x=1742743664;
 h=to:subject:message-id:date:from:mime-version:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=Q15QewKGPnh0puN7QAyyiRN84JTJiAvIdm6dW27UaaM=;
 b=Pmb1BE7OwHkstc61rlr7BIhEIV2lYtbl/0CUfrS+XD7K6CZ/6nXrr1ZvqdR4Wu9FC/
 grAuqCdjqodRaSZl9htg7JV55+lfZEjYT9T7zdTcp0lCYyQZ+NvF+EBdpYU+tqfLhSMH
 iqx1SZNQLfIVdf00jEq+JU3PL33gxzu/7+b155v96tZvhWJxHEh//T+9xPMSrTlatMKy
 DWO9kHWmHN2avZMNvOfcvBxdy4QYPQu4XFlBm9wBFqVuJv0md5avZRN7Cfzku+M8jC/D
 WNlakV6I8IPcEiyW9gciO/kHrpsbk7fn0rL2BwuIXd1Is/qEnzcAJ7Gw2XFnhgxoG/6Y
 k8sQ==
X-Gm-Message-State: AOJu0YzXFgIL5n0uKbZiv6MQchxBd7Uv9QsOqzFLE8Puk96lFTLYu4xs
 gr74ST+XpKpf/0qhXXSYhD04uBWpSaGWQ+S/JyO0TOyGq2bD/IdWEtuKstdpLdR1Jfqp5zlhwi3
 BB68YS7OaElm2/QtfmZDDvhLO+PbbxW7f
X-Gm-Gg: ASbGncvMSOGa+HgytxR602LmPDC1qiAg8A1fRXfa+VUh8hC7RKyxPTGtpxrlx7AAm0o
 L2BLcnP/Zcf6vI5Vbgh7fpZWiqzkhufKaiHpiLsLIiZOLPU1r4H35m8ohCEk8DBLFjRLU+19T2T
 B2vgxVsRS5lkSU8JPVkU0Imb+p
X-Google-Smtp-Source: AGHT+IEHmxVfrOHs6K+UvCuZqOffMJk21X3KTbClAvUbRLBFhnevhc6q756qUY6sWKFH7MisrbTLuHjYovUJ9h/b9Qc=
X-Received: by 2002:a05:6e02:1848:b0:3d0:4c9c:965f with SMTP id
 e9e14a558f8ab-3d483a774d1mr124993405ab.20.1742138864035; Sun, 16 Mar 2025
 08:27:44 -0700 (PDT)
MIME-Version: 1.0
From: =?UTF-8?B?Sm/Do28gR3VlcnJh?= <joca.bt@HIDDEN>
Date: Sun, 16 Mar 2025 16:27:00 +0100
X-Gm-Features: AQ5f1JoWkgMqtduytOg_hXx5bXxuOuWiSSVm2EScsOV699VPOw8jyV0hWdbFejk
Message-ID: <CAGiBfP0mDdeC=-ke_06kpvq5amod1urXK8n6LaawWVgppEWY_A@HIDDEN>
Subject: Completion highlighting applied outside completion-lazy-hilit-fn
To: bug-gnu-emacs@HIDDEN
Content-Type: text/plain; charset="UTF-8"
Received-SPF: pass client-ip=2607:f8b0:4864:20::d33;
 envelope-from=joca.bt@HIDDEN; helo=mail-io1-xd33.google.com
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,
 RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
 SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.0 (/)

TL;DR: Emacs applies additional completion highlighting even when
completion-lazy-hilit-fn is set, leading to incorrect behaviour with
alternative completion styles and frontends.

I'm implementing a custom fuzzy completion style and encountering an
issue where Emacs highlights parts of completions that it shouldn't.

For example, given the following directory structure:

```
<dir>/
  ...
  set-editing.el
  ...
```

and the input pattern `set`, my completion style produces three
possible matches for `set-editing.el`:

```
1 set-editing.el
  ^^^
2 set-editing.el
  ^^     ^
3 set-editing.el
  ^   ^  ^
```

Each match has a different score. In this case, match #3 has the
highest score and should be the one being highlighted.

Completion styles can bind completion-lazy-hilit-fn to control
highlighting. However, Emacs is still applying additional highlighting
outside completion-lazy-hilit-fn, resulting in the following
highlights:

```
set-editing.el
^^^ ^   ^
```

When completing files and buffers, but not commands, Emacs is
highlighting prefixes in
[completion--twq-all](https://github.com/emacs-mirror/emacs/blob/8ac894e2246f25d2a2a97d866b10e6e0b0fede5a/lisp/minibuffer.el#L677).
This becomes more evident if I make my completion-lazy-hilit-fn not do
any highlighting: completions are still highlighted when they
shouldn't at all.

Expected behavior: when lazy highlighting is enabled, Emacs shouldn't
apply any additional highlighting. While the current behavior works
for the default completion style (i.e. completions buffer), it easily
break as soon as users employ alternative styles or frontends.

Steps to reproduce (Emacs 30.1):
- emacs -Q
- Load:
    - https://github.com/minad/vertico/
    - https://github.com/lewang/flx/
    - https://gist.github.com/joca-bt/356ba1201c4fe842144e19ee1c723c28/
- Eval:
   - (vertico-mode t)
   - (setopt completion-styles '(flx))




Acknowledgement sent to João Guerra <joca.bt@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#77054; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Fri, 21 Mar 2025 12:45:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.