unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "João Távora" <joaotavora@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel <emacs-devel@gnu.org>, Dmitry Gutov <dgutov@yandex.ru>
Subject: Re: [Emacs-diffs] master b0e318d 2/2: Score flex-style completions according to match tightness
Date: Wed, 20 Mar 2019 21:00:53 +0000	[thread overview]
Message-ID: <m1sgvh2rcq.fsf@gmail.com> (raw)
In-Reply-To: <jwv8sx9rbuv.fsf-monnier+emacs@gnu.org> (Stefan Monnier's message of "Wed, 20 Mar 2019 08:09:51 -0400")

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> FWIW, I think if basic is fast enough and flex is 2x slower, then flex
> is likely fast enough as well (or the contrapositive: if flex is too
> slow and basic is only 2x faster, then basic is also too slow).

Hmmm, slightly confused, but I think we're currently in the
"contrapositive" side (at least given the UI problems that I describe
below).  Anyway, this is orthogonal, but I do think that flex can be
made faster so that it is only, say 1.2x, slower than basic in the worst
case. I'd say it's worth a shot.  Depending on the "basic"
implementation, it could even be faster.

>>> It's worth a try. But if filtering will happen right away after the
>>> user has stopped typing, that might mean higher CPU usage and lower
>>> battery life on a laptop. Just something to be on a lookout for.
>> You're absolutely right.  And anyway I noticed icomplete _already_ has a
>> while-no-input there, so that technique has already been tried.
>
> Not really: the while-no-input was added long after the rest of the code
> was written and was mostly designed for the case where the completion
> data takes a *very* long time to get, the main purpose being to be able
> to enable icomplete for *all* completion tables rather than only for
> those we know to be fast enough.

I don't understand: while-no-input _is_ there, at least it is doing that
which I was going to attempt.  Or do you have some better use of it in
mind that I am not aware of?

Anyway, with the current approach, the problem seems to be that
throw-on-input is not being checked often enough.  I.e in this block:

          (let* (...
                 (text (while-no-input
                         (icomplete-completions
                          field-string
                          (icomplete--completion-table)
                          (icomplete--completion-predicate)
                          (if (window-minibuffer-p)
                              (not minibuffer-completion-confirm)))))
                 (buffer-undo-list t)
                 deactivate-mark)
	    ;; Do nothing if while-no-input was aborted.
            (when (stringp text) ... ))
            
text will often be t, meaning the call _was_ interrupted by
while-no-input, but icomplete-completions was still allowed to run to
completion (and that takes about one or two seconds with empty input).

If somehow while-no-input were able to detect interruptions at a more
finer grained level, I think icomplete-completions would be interrupted
earlier.  A (dumb) way to fix this is by simply adding a call to
input-pending-p to one of the critical sections:

diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index c5d7148..37d1d91 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -3049,7 +3049,9 @@ completion-pcm--all-completions
 	  compl
 	(let ((poss ()))
 	  (dolist (c compl)
-	    (when (string-match-p regex c) (push c poss)))
+	    (when (string-match-p regex c)
+              (input-pending-p)
+              (push c poss)))
 	  (nreverse poss))))))
 
 (defvar flex-score-match-tightness 100
 
If one tries C-h f <some-char> after evaluating this, <some-char>
shows almost immediately after the user typed it.  Now, this is quite
ugly and it still doesn't fix the C-h f RET delay for some reason (but
that shouldn't be very hard to fix, hopefully)

Furthermore, I think the problem pointed to by Dmitry regarding power
consumption is mostly unrelated to this, and targeted effectively by the
existing icomplete-compute-delay variable, which menas battery-wary
users should just set that to a higher value.

João



  reply	other threads:[~2019-03-20 21:00 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20190213212413.868.40960@vcs0.savannah.gnu.org>
     [not found] ` <20190213212414.D6F4C209C6@vcs0.savannah.gnu.org>
2019-02-14 12:38   ` master e4896fc 1/2: Add a new 'flex' completion style Robert Pluim
2019-02-14 13:50     ` João Távora
2019-02-14 14:37       ` Eli Zaretskii
2019-02-14 14:40         ` João Távora
2019-02-14 14:47       ` Robert Pluim
2019-02-14 14:50         ` João Távora
2019-02-14 15:12           ` Robert Pluim
2019-02-14 15:22           ` Drew Adams
2019-02-14 14:29     ` Eli Zaretskii
2019-02-14 14:39       ` João Távora
     [not found] ` <20190213212415.148B9209D7@vcs0.savannah.gnu.org>
2019-03-16  1:13   ` [Emacs-diffs] master b0e318d 2/2: Score flex-style completions according to match tightness Dmitry Gutov
2019-03-16 13:02     ` João Távora
2019-03-16 13:19       ` Stefan Monnier
2019-03-16 14:25         ` João Távora
2019-03-17 18:06         ` Dmitry Gutov
2019-03-17 19:22           ` João Távora
2019-03-17 20:32             ` Dmitry Gutov
2019-03-17 21:46               ` João Távora
2019-03-18 14:26                 ` Dmitry Gutov
2019-03-18 14:42                   ` Dmitry Gutov
2019-03-18 14:49                     ` Stefan Monnier
2019-03-18 14:52                       ` Dmitry Gutov
2019-03-18 16:20                         ` Stefan Monnier
2019-03-18 15:13                       ` Who uses Icomplete-mode? " João Távora
2019-03-18 16:44                         ` Stefan Monnier
2019-03-18 21:08                         ` Who uses Icomplete-mode? Juri Linkov
2019-03-18 14:54                     ` [Emacs-diffs] master b0e318d 2/2: Score flex-style completions according to match tightness João Távora
2019-03-18 14:51                   ` João Távora
2019-03-18 17:18                     ` Dmitry Gutov
2019-03-20  9:59                       ` João Távora
2019-03-20 12:09                         ` Stefan Monnier
2019-03-20 21:00                           ` João Távora [this message]
2019-03-20 21:58                             ` Dmitry Gutov
2019-03-20 23:25                               ` João Távora
2019-03-21  1:14                                 ` Stefan Monnier
2019-03-21  1:20                                 ` Dmitry Gutov
2019-03-21  1:08                             ` Stefan Monnier
2019-03-17 17:51       ` Dmitry Gutov
2019-03-17 19:09         ` João Távora
2019-03-17 20:22           ` Dmitry Gutov
2019-03-17 21:27             ` João Távora
2019-03-18  0:38               ` Dmitry Gutov

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=m1sgvh2rcq.fsf@gmail.com \
    --to=joaotavora@gmail.com \
    --cc=dgutov@yandex.ru \
    --cc=emacs-devel@gnu.org \
    --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).