From: Dario Gjorgjevski <dario.gjorgjevski@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: 42149@debbugs.gnu.org, "João Távora" <joaotavora@gmail.com>
Subject: bug#42149: Substring and flex completion ignore implicit trailing ‘any’
Date: Mon, 28 Dec 2020 11:17:40 +0100 [thread overview]
Message-ID: <fv2zojim8m8caj.fsf@gmail.com> (raw)
In-Reply-To: <jwvim8nhrs5.fsf-monnier+emacs@gnu.org> (Stefan Monnier's message of "Sun, 27 Dec 2020 16:45:07 -0500")
Hi Stefan,
> Thanks very much for your patch.
> It looks good to me, but I think it's important we find a fix with which
> João agrees.
Thanks likewise!
>> Furthermore, ‘completions-first-difference’ and
>> ‘completions-common-part’ would sometimes overlap depending on the
>> position of point within the query string.
>
> Could you point us at the corresponding test?
That would be the test
;; Point is at beginning, but `completions-first-difference' is
;; moved after it
(should (equal
(get-text-property
1 'face
(car (completion-pcm-all-completions
"f" '("few" "many") nil 0)))
'completions-first-difference))
You can replace pcm with flex or substring, it doesn’t matter.
>> The former is fixed by correcting the part of
>> ‘completion-pcm--hilit-commonality’ responsible for looping over the
>> holes in the query string.
>
> Is that done by treating the "leftover" from the string as if there was
> an additional match? That would correspond to the "implicit any"
> that terminates every pattern.
I believe the simplest way to summarize the issue with the current
implementation is that it assumes the regex match is of the form
<hole><match><hole><match>...<hole>
(Where the <hole>s might be of length 0.) However, the trailing <hole>
is not there and therefore the score is not updated correctly.
Furthermore, it does nothing to actually ensure these assumptions in the
presence of wildcards in the query string.
>> The latter is fixed by explicitly moving
>> the position of ‘completions-first-difference’ in case an overlap with
>> ‘completions-common-part’ is detected.
>
> Did you (by any chance) figure out how/why the two end up overlapping?
> The fix you're using looks pretty "hackish" and introduces a non-trivial
> data flow for `pos`. Before using such an ad-hoc solution it'd be best
> to understand where the problem comes from (it might still be the
> better answer in the end, but it's hard to judge).
`completions-first-difference' is put at the first position after point
in the query string. However, the part of the query string *after*
point might actually match there. I don’t see an easier solution.
>> (completion-pcm--optimize-pattern): Turn multiple consecutive
>> occurrences of ‘any’ into just a single one.
>
> This is good (consecutive `any` can introduce serious performance bugs
> because of our backtracing regexp matcher).
> Other than improving performance, have you found other effects?
Yes, the presence of multiple consecutive wildcards invalidates the
aforementioned assumption of completion-pcm--hilit-commonality that the
match is of the form
<hole><match><hole><match>...<hole>
>> +(defun completion-pcm--count-leading-holes (pattern)
>> + "Count the number of leading holes in PATTERN."
>> + (length (seq-take-while #'symbolp pattern)))
>
> `seq-take-while` is not defined at this stage.
> [...]
> - Mark `seq-take-while` with a `;;;###autoload` cookie so it'll be
> loaded on demand.
> [...]
Good catch, this should indeed be done.
Best regards,
Dario
--
$ keyserver=hkps://hkps.pool.sks-keyservers.net
$ keyid=744A4F0B4F1C9371
$ gpg --keyserver $keyserver --search-keys $keyid
next prev parent reply other threads:[~2020-12-28 10:17 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-01 10:40 bug#42149: Substring and flex completion ignore implicit trailing ‘any’ Dario Gjorgjevski
2020-07-01 10:58 ` João Távora
2020-07-01 11:03 ` João Távora
2020-07-01 11:10 ` Dario Gjorgjevski
2020-09-08 9:05 ` Dario Gjorgjevski
2020-09-08 9:30 ` João Távora
2020-09-08 9:44 ` Dario Gjorgjevski
2020-09-08 10:08 ` João Távora
2020-09-08 11:12 ` Dario Gjorgjevski
2020-09-08 11:22 ` João Távora
2020-09-08 11:30 ` Dario Gjorgjevski
2020-09-08 11:32 ` João Távora
2020-09-09 10:17 ` Dario Gjorgjevski
2020-09-09 11:38 ` Dario Gjorgjevski
2020-09-09 13:13 ` Stefan Monnier
2020-09-10 11:26 ` Dario Gjorgjevski
2020-10-14 8:22 ` Dario Gjorgjevski
2020-10-14 8:39 ` João Távora
2020-10-14 9:01 ` Dario Gjorgjevski
2020-10-15 14:25 ` Dario Gjorgjevski
2020-11-20 20:39 ` Dario Gjorgjevski
2020-11-20 21:27 ` João Távora
2020-11-25 0:01 ` João Távora
2020-11-25 8:22 ` Dario Gjorgjevski
2020-11-25 12:22 ` João Távora
2020-11-25 13:27 ` Dario Gjorgjevski
2020-12-23 9:41 ` Dario Gjorgjevski
2020-12-27 20:08 ` João Távora
2020-12-27 20:23 ` João Távora
2020-12-27 21:20 ` Stefan Monnier
2020-12-28 9:30 ` João Távora
2020-12-28 16:03 ` Stefan Monnier
2020-12-28 16:58 ` João Távora
2020-12-28 16:07 ` Stefan Monnier
2020-12-28 17:04 ` João Távora
2020-12-27 21:45 ` Stefan Monnier
2020-12-28 9:38 ` João Távora
2020-12-28 10:22 ` Dario Gjorgjevski
2020-12-28 11:34 ` João Távora
2020-12-28 11:48 ` Dario Gjorgjevski
2020-12-28 12:57 ` João Távora
2020-12-28 10:17 ` Dario Gjorgjevski [this message]
2020-12-28 16:26 ` Stefan Monnier
2020-12-28 17:16 ` João Távora
2020-12-28 19:48 ` Dario Gjorgjevski
2020-12-28 20:00 ` Stefan Monnier
2020-12-28 23:20 ` João Távora
2020-12-29 13:27 ` João Távora
2021-05-13 9:24 ` Lars Ingebrigtsen
2021-05-13 14:31 ` João Távora
2021-05-13 15:41 ` Dario Gjorgjevski
2021-05-13 16:04 ` João Távora
2021-05-16 13:51 ` Lars Ingebrigtsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fv2zojim8m8caj.fsf@gmail.com \
--to=dario.gjorgjevski@gmail.com \
--cc=42149@debbugs.gnu.org \
--cc=joaotavora@gmail.com \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).