Subject: bug#74362: 31.0.50; Add completions for font names

From: Stefan Monnier <[email-masked]>
Date: Sat, 16 Nov 2024 10:12:21 -0500

>> > Also, the doc string of customize-face should be amended to say that
>> > it offers completion on fonts.
>> Hmm... the docstring currently doesn't describe the UI at all (and
>> I can't think of a reason why it should).  Similarly the manual doesn't
>> seem to describe any part of the UI of `customize-face`.
>> Apparently, we presume the UI is self-explanatory.  If we want to fix
>> that, I think it's beyond the scope of this patch submission.
> How about mentioning the completion in the help-echo of this field?

I don't understand why you'd want that, so I don't know how it should be
phrased.  Can you point to some other help-echo which states such
a thing, for inspiration?

> Btw, could set-face-font also benefit from this improvement?

AFAICT `set-face-font` already has its own completion.

> Btw^2: When we select a font, do we have to change the Foundry as
> well?  Or does Emacs disregard any non-matching foundries (if, for
> example, the selected Family is not available with the specified
> Foundry)?

I can't remember the last time I used the foundry attribute, so you're
asking the wrong guy, sorry.  In my corner of the world, font foundries
are simply never used (and the info I can find about foundries of
installed fonts on my system is weird/poor(?), with non-descript names
suggesting nobody else cares about them).

>> +        ;; Cache the list for a max of 60s.
>> +        (let ((time (float-time)))
>> +         (if (and lastlist (eq (selected-frame) lastframe)
>> +                  (> 60 (- time lasttime)))
> Maybe the 60 thing should be a defvar?

I doubt it's worth the trouble, but if you insist I'll do that.

>> --- a/lisp/cus-face.el
>> +++ b/lisp/cus-face.el
>> @@ -48,6 +48,7 @@ custom-declare-face
>>  (defconst custom-face-attributes
>>    `((:family
>>       (string :tag "Font Family"
>> +	     :completions custom-face--font-completion
>>  	     :help-echo "Font family or fontset alias name."))
>
> I'm curious: how come :foreground and :background don't need a
> :completions specifier, and yet they provide completion OOTB?

Because those use the `color` widget defined in `wid-edit.el`:

    (define-widget 'color 'editable-field
      "Choose a color name (with sample)."
      :format "%{%t%}: %v (%{sample%})\n"
      :value-create 'widget-color-value-create
      :size (1+ (apply #'max 13 ; Longest RGB hex string.
                       (mapcar #'length (defined-colors))))
      :tag "Color"
      :value "black"
      :completions (defined-colors)
      :sample-face-get 'widget-color-sample-face-get
      :notify 'widget-color-notify
      :match #'widget-color-match
      :validate #'widget-color-validate
      :action 'widget-color-action)

- Stefan