From: Dmitry Gutov <dgutov@yandex.ru>
To: "João Távora" <joaotavora@gmail.com>
Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel@gnu.org
Subject: Re: BIKESHED: completion faces
Date: Tue, 5 Nov 2019 16:57:29 +0200 [thread overview]
Message-ID: <fea089e1-0d51-cb28-35fc-e49ebeb1301b@yandex.ru> (raw)
In-Reply-To: <87h83ipoi0.fsf@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3386 bytes --]
On 05.11.2019 13:10, João Távora wrote:
>> We agree, yes. Although I'm more in favor of changing the defaults,
>
> So are we all, but that's a non-starter. I'm sure everyone here thinks
> "their" settings should be the defaults.
The implication would be that trying to improve the defaults is useless
or hopeless. I disagree.
> So what you are proposing with the "do-nothing" approach amounts to a
> lose-lose.
Have you read my other idea, then?
>> as soon as the kinks are worked out (e.g. flex is a bit slow when
>> prefix is 1-2 chars).
>
> You have to think about this "slowness". A part of it might be
> discovering if the 1-2 chars are in the potential match. Another
> different part of it might be due to the fact that the set of matches is
> much greater when the pattern in short.
>
> The former part can be improved in flex, the latter can't: it's
> intrinsic to the technique.
All can be improved, just with varying degrees of difficulty. But there
are other techniques, like limiting the number of matches shown at a
time. One just has to make sure not to cache the result improperly.
> But in matching systems like icomplete-mode
> it isn't a problem (in terms of responsiveness) because icomplete-mode
> has a while-no-input trick in it. Perhaps so should company (presuming
> that's what you are using).
I'm trying it out with 'M-x completion-at-point'.
>> I disagree that it's a significant problem, though. Enabling 'flex' is
>> one line. Customizing the face is just another line.
>
> Isn't true for custom.el users. And it just doesn't make sense that to
> enable "good" flex matching you have to go touch two places. We're
> discussing usability, after all.
As you can imagine, IMHO this part "making sense" is less important than
the consistency in highlighting.
>>> This is better: I think this would lead you to my idea of a new
>>> `completion-relevant` face, which we would set to bold or something very
>>> prominent. For the 'prefix' the relevant part is the "next character"
>>> and for the 'flex' style is whatever has matched.
>>> completions-first-difference could then be made an alias of that new
>>> face.
>>
>> Hmm, I don't like this changing of terms, sorry. This way, the same
>> highlighting would be applied to two fairly different things.
>
> So is 'shadow' and 'bold' and many more. It all has to do with how you
> design the semantics, something that is our prerrogative.
I wouldn't use 'shadow' or 'bold' for the new face either. Nothing that
matches completions-common-part of completions-first-difference exactly.
> The current
> face semantics were designed for 'prefix', they just don't scale well
> for other pattern-matching strategies.
>
> What I'm proposing is no different from say, mode-line-emphasis, which
> lisp/man.el and lisp/vc/vc-dispatcher.el use in "two wildly different
> things".
Here's an example. When the input is one char, how will you figure out
what the highlighting in the *Completions* buffer means? Just by whether
the character under the face is the same one? It's not reliable.
> Of course, another way out, at the expense of yet another face, is to
> add completions-flex-emphasis or something like that.
I've tried to implement my idea, but somehow the added highlighting gets
eaten before the buffer is displayed. But the attached patch should
illustrate it anyway.
[-- Attachment #2: completions-nontrivial-common-part.diff --]
[-- Type: text/x-patch, Size: 4034 bytes --]
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 43dd277a2e..e272364b49 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -1649,10 +1649,8 @@ completion--insert-strings
nil))))
(setq first nil)
(if (not (consp str))
- (put-text-property (point) (progn (insert str) (point))
- 'mouse-face 'highlight)
- (put-text-property (point) (progn (insert (car str)) (point))
- 'mouse-face 'highlight)
+ (completion--insert-string str)
+ (completion--insert-string (car str))
(let ((beg (point))
(end (progn (insert (cadr str)) (point))))
(put-text-property beg end 'mouse-face nil)
@@ -1672,6 +1670,53 @@ completion--insert-strings
;; Round up to a whole number of columns.
(* colwidth (ceiling length colwidth))))))))))))
+(defun completion--insert-string (s)
+ (require 'text-property-search)
+ (let* ((beg (point))
+ (end (progn (insert s)
+ (point)))
+ (search-pred (lambda (expected value)
+ (or (eq expected value)
+ (and (listp value)
+ (memq expected value)))))
+ fdiff-match)
+ (put-text-property beg end 'mouse-face 'highlight)
+ (save-excursion
+ (save-restriction
+ (narrow-to-region beg end)
+ (goto-char beg)
+ (setq fdiff-match
+ (text-property-search-forward 'face 'completions-first-difference
+ search-pred))
+ (when fdiff-match
+ (let ((fdiff-pos (prop-match-beginning fdiff-match))
+ (prop-pos (point)))
+ (goto-char fdiff-pos)
+ (when (or
+ ;; There is a place before fdiff-pos without common part.
+ (catch 'found
+ (while (setq prop-pos
+ (previous-single-property-change prop-pos 'face
+ nil beg))
+ (when (= prop-pos beg)
+ (throw 'found nil))
+ (let ((value (get-text-property (1- prop-pos) 'face)))
+ (if (or (eq value 'completions-common-part)
+ (and (listp value)
+ (memq 'completions-common-part value)))
+ (setq prop-pos (1- prop-pos))
+ (throw 'found t)))))
+ ;; There is a place after fdiff-pos with common part.
+ (text-property-search-forward 'face 'completions-common-part
+ search-pred))
+ ;; FIXME: For some reason, this highlighting gets eaten
+ ;; before the buffer is displayed, somewhere.
+ ;; TODO: Highlight only the parts with -common-part.
+ (font-lock-prepend-text-property beg fdiff-pos
+ 'font-lock-face
+ 'completions-nontrivial-common-part)
+ )))))))
+
(defvar completion-common-substring nil)
(make-obsolete-variable 'completion-common-substring nil "23.1")
@@ -1691,6 +1736,10 @@ completions-common-part
"Face for the parts of completions which matched the pattern.
See also the face `completions-first-difference'.")
+(defface completions-nontrivial-common-part '((t (:background "white smoke")))
+ "Face for the parts of completions which matches the pattern nontrivially.
+Meaning that the match is a non-prefix one.")
+
(defun completion-hilit-commonality (completions prefix-len &optional base-size)
"Apply font-lock highlighting to a list of completions, COMPLETIONS.
PREFIX-LEN is an integer. BASE-SIZE is an integer or nil (meaning zero).
next prev parent reply other threads:[~2019-11-05 14:57 UTC|newest]
Thread overview: 169+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-27 1:58 BIKESHED: completion faces Stefan Monnier
2019-10-27 11:34 ` João Távora
2019-10-27 21:45 ` Juri Linkov
2019-10-28 0:43 ` João Távora
2019-10-28 22:29 ` Juri Linkov
2019-10-28 23:31 ` João Távora
2019-10-29 21:53 ` Juri Linkov
2019-10-29 22:09 ` Dmitry Gutov
2019-10-29 22:57 ` João Távora
2019-10-29 1:12 ` Stefan Monnier
2019-10-29 21:58 ` Juri Linkov
2019-10-29 22:59 ` João Távora
2019-10-29 23:11 ` Dmitry Gutov
2019-10-30 1:49 ` Stefan Monnier
2019-11-03 21:53 ` Dmitry Gutov
2019-11-03 23:30 ` Stefan Monnier
2019-11-04 16:30 ` Dmitry Gutov
2019-11-04 18:31 ` Stefan Monnier
2019-11-04 22:52 ` João Távora
2019-11-04 23:25 ` Dmitry Gutov
2019-11-05 11:10 ` João Távora
2019-11-05 14:57 ` Dmitry Gutov [this message]
2019-11-05 15:44 ` Stefan Monnier
2019-11-05 16:30 ` João Távora
2019-11-05 21:27 ` Juri Linkov
2019-11-05 23:06 ` Stefan Monnier
2019-11-05 22:01 ` Dmitry Gutov
2019-11-06 0:18 ` Stefan Monnier
2019-11-06 8:24 ` Dmitry Gutov
2019-11-06 13:42 ` VOTE: Changing completions-common-part face's default Stefan Monnier
2019-11-06 17:16 ` João Távora
2019-11-06 17:26 ` Dmitry Gutov
2019-11-06 18:10 ` João Távora
2019-11-06 22:20 ` Dmitry Gutov
2019-11-06 22:42 ` João Távora
2019-11-06 22:57 ` Dmitry Gutov
2019-11-06 23:14 ` Stefan Monnier
2019-11-07 8:09 ` Dmitry Gutov
2019-11-07 10:27 ` João Távora
2019-11-07 13:27 ` Yuri Khan
2019-11-07 13:52 ` João Távora
2019-11-07 14:41 ` Yuri Khan
2019-11-07 14:57 ` João Távora
2019-11-07 16:04 ` Stefan Monnier
2019-11-07 16:09 ` João Távora
2019-11-07 14:43 ` Dmitry Gutov
2019-11-07 14:54 ` João Távora
2019-11-07 14:33 ` Dmitry Gutov
2019-11-07 14:44 ` João Távora
2019-11-07 14:58 ` Dmitry Gutov
2019-11-07 15:54 ` João Távora
2019-11-07 16:57 ` Drew Adams
2019-11-08 23:38 ` Dmitry Gutov
2019-11-09 0:24 ` João Távora
2019-11-09 1:53 ` Drew Adams
2019-11-09 21:57 ` Juri Linkov
2019-11-09 22:17 ` João Távora
2019-11-09 7:30 ` Eli Zaretskii
2019-11-09 11:42 ` João Távora
2019-11-09 12:04 ` Eli Zaretskii
2019-11-09 13:22 ` João Távora
2019-11-09 16:44 ` Drew Adams
2019-11-07 15:08 ` Stefan Monnier
2019-11-08 10:15 ` Dmitry Gutov
2019-11-08 19:19 ` Stefan Monnier
2019-11-08 19:43 ` Eli Zaretskii
2019-11-08 21:42 ` Stefan Monnier
2019-11-09 6:52 ` Eli Zaretskii
2019-11-09 15:25 ` Stefan Monnier
2019-11-09 15:52 ` Eli Zaretskii
2019-11-09 16:17 ` Stefan Monnier
2019-11-08 20:11 ` Dmitry Gutov
2019-11-08 22:57 ` João Távora
2019-11-06 23:12 ` Stefan Monnier
2019-11-05 16:31 ` BIKESHED: completion faces João Távora
2019-11-05 22:22 ` Dmitry Gutov
2019-11-05 23:11 ` João Távora
2019-11-06 8:18 ` Dmitry Gutov
2019-11-06 8:53 ` João Távora
2019-11-06 15:16 ` Dmitry Gutov
2019-11-06 15:56 ` João Távora
2019-11-06 10:25 ` João Távora
2019-11-06 15:11 ` Dmitry Gutov
2019-11-06 15:31 ` João Távora
2019-11-06 15:43 ` Dmitry Gutov
2019-11-06 15:48 ` João Távora
2019-11-06 16:01 ` Dmitry Gutov
2019-11-06 16:20 ` Eli Zaretskii
2019-11-06 21:36 ` Juri Linkov
2019-11-07 14:25 ` Eli Zaretskii
2019-11-07 22:40 ` Juri Linkov
2019-11-08 6:43 ` Eli Zaretskii
2019-11-06 16:12 ` Eli Zaretskii
2019-11-06 16:14 ` João Távora
2019-11-06 0:24 ` Stefan Monnier
2019-11-05 18:36 ` Stefan Monnier
2019-11-05 18:51 ` Eli Zaretskii
2019-11-05 19:16 ` João Távora
2019-11-05 19:23 ` Eli Zaretskii
2019-11-05 21:43 ` João Távora
2019-11-06 16:03 ` Eli Zaretskii
2019-11-06 16:26 ` João Távora
2019-11-06 18:07 ` Eli Zaretskii
2019-11-06 18:14 ` João Távora
2019-11-06 18:29 ` Eli Zaretskii
2019-11-06 18:48 ` João Távora
2019-11-06 20:51 ` Ergus
2019-11-07 14:08 ` Eli Zaretskii
2019-11-07 14:28 ` João Távora
2019-11-07 14:47 ` Eli Zaretskii
2019-11-07 15:00 ` João Távora
2019-11-07 15:40 ` Eli Zaretskii
2019-11-07 16:00 ` João Távora
2019-11-07 17:39 ` Eli Zaretskii
2019-11-07 17:53 ` João Távora
2019-11-07 18:16 ` Eli Zaretskii
2019-11-07 18:37 ` João Távora
2019-11-07 21:07 ` Eli Zaretskii
2019-11-07 21:43 ` João Távora
2019-11-08 6:35 ` Eli Zaretskii
2019-11-08 10:15 ` João Távora
2019-11-08 14:02 ` Eli Zaretskii
2019-11-08 15:09 ` João Távora
2019-11-08 15:33 ` Eli Zaretskii
2019-11-08 16:01 ` João Távora
2019-11-08 16:16 ` Eli Zaretskii
2019-11-08 16:27 ` João Távora
2019-11-08 17:05 ` Eli Zaretskii
2019-11-08 17:21 ` João Távora
2019-11-08 19:06 ` Eli Zaretskii
2019-11-08 22:49 ` João Távora
2019-11-09 6:57 ` Eli Zaretskii
2019-11-09 11:20 ` João Távora
2019-11-09 11:51 ` Eli Zaretskii
2019-11-09 12:14 ` João Távora
2019-11-09 12:19 ` Eli Zaretskii
2019-11-09 13:29 ` João Távora
2019-11-09 13:52 ` João Távora
2019-11-09 15:31 ` Eli Zaretskii
2019-11-09 18:51 ` João Távora
2019-11-10 9:18 ` Dmitry Gutov
2019-11-14 9:45 ` Eli Zaretskii
2019-11-14 10:40 ` Dmitry Gutov
2019-11-14 14:16 ` Eli Zaretskii
2019-11-14 14:19 ` João Távora
2019-11-14 14:42 ` Eli Zaretskii
2019-11-14 14:49 ` João Távora
2019-11-16 20:10 ` Juri Linkov
2019-11-16 23:40 ` João Távora
2019-11-17 17:27 ` Eli Zaretskii
2019-11-17 17:47 ` João Távora
2019-11-08 12:58 ` Stefan Monnier
2019-11-08 13:08 ` João Távora
2019-11-08 14:07 ` Eli Zaretskii
2019-11-06 20:34 ` Drew Adams
2019-11-06 20:42 ` Eli Zaretskii
2019-11-05 21:40 ` Dmitry Gutov
2019-11-05 23:02 ` Stefan Monnier
2019-11-05 18:54 ` João Távora
2019-11-05 19:07 ` Stefan Monnier
2019-11-05 21:39 ` Dmitry Gutov
2019-11-05 21:54 ` João Távora
2019-11-05 21:55 ` Dmitry Gutov
2019-11-05 21:54 ` Dmitry Gutov
2019-11-05 21:58 ` João Távora
2019-11-05 22:03 ` Dmitry Gutov
2019-11-05 22:07 ` João Távora
[not found] <<jwvwocr7yt6.fsf-monnier+emacs@gnu.org>
[not found] ` <<b7e361ee-6fc4-b52e-3bd2-1f6862bbcf23@yandex.ru>
[not found] ` <<jwva79jyqrp.fsf-monnier+emacs@gnu.org>
[not found] ` <<4c5631d4-9dfd-04c6-c573-b83c67fcc2fa@yandex.ru>
[not found] ` <<jwvd0e8k0gi.fsf-monnier+emacs@gnu.org>
[not found] ` <<c6718807-b3fc-5bed-6a4b-b1ccc52649de@yandex.ru>
[not found] ` <<87pni7p83l.fsf@gmail.com>
[not found] ` <<fdec6d86-e1b9-19cb-18aa-ef835972f315@yandex.ru>
[not found] ` <<jwv8soub2u5.fsf-monnier+emacs@gnu.org>
[not found] ` <<83h83ignrz.fsf@gnu.org>
[not found] ` <<CALDnm50SjOOKOiZVmdNJc8zVsfZXbPQcBOYoeJe9MbO62Lartw@mail.gmail.com>
[not found] ` <<83ftj2gma8.fsf@gnu.org>
[not found] ` <<87zhhaxalt.fsf@gmail.com>
[not found] ` <<83bltpgffr.fsf@gnu.org>
[not found] ` <<CALDnm50YW0cjdN1Z7eJs6K-dXpfwp1VOe3NPi6WH+iF1oU1HmA@mail.gmail.com>
[not found] ` <<83tv7gg9oz.fsf@gnu.org>
[not found] ` <<7916c845-1ce2-4abd-937f-09036cd60bec@default>
[not found] ` <<83pni4g2iq.fsf@gnu.org>
2019-11-06 21:40 ` Drew Adams
2019-11-07 14:19 ` Eli Zaretskii
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fea089e1-0d51-cb28-35fc-e49ebeb1301b@yandex.ru \
--to=dgutov@yandex.ru \
--cc=emacs-devel@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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.