GNU bug report logs - #68042
30.0.50; `face-font' returns nil after adding remap relative for fontset

Previous Next

Package: emacs;

Reported by: Hanwen Guo <g.hanwen <at> outlook.com>

Date: Tue, 26 Dec 2023 16:57:02 UTC

Severity: normal

Tags: moreinfo, notabug

Found in version 30.0.50

Done: Stefan Kangas <stefankangas <at> gmail.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 68042 in the body.
You can then email your comments to 68042 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#68042; Package emacs. (Tue, 26 Dec 2023 16:57:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Hanwen Guo <g.hanwen <at> outlook.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Tue, 26 Dec 2023 16:57:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Hanwen Guo <g.hanwen <at> outlook.com>
To: "bug-gnu-emacs <at> gnu.org" <bug-gnu-emacs <at> gnu.org>
Subject: 30.0.50; `face-font' returns nil after adding remap relative for
 fontset
Date: Tue, 26 Dec 2023 11:47:22 +0000
Providing the `:fontset' or `:font' face attribute in the `SPEC'
argument of `face-remap-add-relative' with `FACE' argument being
`'default' will make the `face-font' function return nil.

The following Emacs Lisp code can reproduce this behavior under 'emacs
-Q'.

(create-fontset-from-fontset-spec
 (font-xlfd-name
  (font-spec :family "Source Serif"
             :registry "fontset-variable pitch regular")))

(set-face-attribute 'variable-pitch nil
                    :family "Source Serif"
                    :fontset "fontset-variable pitch regular")

(let ((var-pitch (face-attribute 'variable-pitch :family))
      (var-fontset (face-attribute 'variable-pitch :fontset)))
  (setq mixed-pitch-variable-cookie
        (face-remap-add-relative 'default :family var-pitch :fontset var-fontset)))

(face-font 'default) ;; nil

(face-remap-remove-relative mixed-pitch-variable-cookie)

(face-font 'default) ;; non-nil


In GNU Emacs 30.0.50 (build 1, x86_64-w64-mingw32) of 2023-12-11 built
 on MASELLUM-G14
Repository revision: 9434ad25ce2747864e0bcf5665f65eb65a079178
Repository branch: master
Windowing system distributor 'Microsoft Corp.', version 10.0.22631
System Description: Microsoft Windows 10 Pro (v10.0.2009.22631.2861)

Configured using:
 'configure --with-mailutils --without-pop --with-json
 --with-tree-sitter --with-sqlite3 --with-xpm --with-jpeg --with-tiff
 --with-gif --with-png --with-rsvg --with-webp --with-modules
 --without-dbus --without-compress-install --with-native-compilation=aot
 'CFLAGS=-O2 -fno-optimize-sibling-calls''

Configured features:
ACL GIF GMP GNUTLS HARFBUZZ JPEG JSON LCMS2 LIBXML2 MODULES NATIVE_COMP
NOTIFY W32NOTIFY PDUMPER PNG RSVG SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XPM ZLIB

Important settings:
  value of $LANG: CHS
  locale-coding-system: cp65001

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  minibuffer-regexp-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message mailcap yank-media puny dired
dired-loaddefs rfc822 mml mml-sec password-cache epa derived epg rfc6068
epg-config gnus-util text-property-search mm-decode mm-bodies mm-encode
mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047
rfc2045 ietf-drums mm-util mail-prsvr mail-utils face-remap comp-run
bytecomp byte-compile comp-common rx time-date subr-x cl-loaddefs cl-lib
china-util rmc iso-transl tooltip cconv eldoc paren electric uniquify
ediff-hook vc-hooks lisp-float-type elisp-mode mwheel dos-w32 ls-lisp
disp-table term/w32-win w32-win w32-vars term/common-win tool-bar dnd
fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow
isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax
font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads w32notify w32 lcms2 multi-tty
move-toolbar make-network-process native-compile emacs)

Memory information:
((conses 16 64497 9228) (symbols 48 6044 0) (strings 32 17178 1453)
 (string-bytes 1 484111) (vectors 16 13625)
 (vector-slots 8 351812 11898) (floats 8 45 37) (intervals 56 347 19)
 (buffers 992 10))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#68042; Package emacs. (Tue, 26 Dec 2023 17:50:01 GMT) Full text and rfc822 format available.

Message #8 received at 68042 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Hanwen Guo <g.hanwen <at> outlook.com>
Cc: 68042 <at> debbugs.gnu.org
Subject: Re: bug#68042: 30.0.50;
 `face-font' returns nil after adding remap relative for fontset
Date: Tue, 26 Dec 2023 19:49:09 +0200
tags 68042 notabug
thanks

> From: Hanwen Guo <g.hanwen <at> outlook.com>
> Date: Tue, 26 Dec 2023 11:47:22 +0000
> msip_labels: 
> 
> Providing the `:fontset' or `:font' face attribute in the `SPEC'
> argument of `face-remap-add-relative' with `FACE' argument being
> `'default' will make the `face-font' function return nil.
> 
> The following Emacs Lisp code can reproduce this behavior under 'emacs
> -Q'.
> 
> (create-fontset-from-fontset-spec
>  (font-xlfd-name
>   (font-spec :family "Source Serif"
>              :registry "fontset-variable pitch regular")))
> 
> (set-face-attribute 'variable-pitch nil
>                     :family "Source Serif"
>                     :fontset "fontset-variable pitch regular")
> 
> (let ((var-pitch (face-attribute 'variable-pitch :family))
>       (var-fontset (face-attribute 'variable-pitch :fontset)))
>   (setq mixed-pitch-variable-cookie
>         (face-remap-add-relative 'default :family var-pitch :fontset var-fontset)))
> 
> (face-font 'default) ;; nil
> 
> (face-remap-remove-relative mixed-pitch-variable-cookie)
> 
> (face-font 'default) ;; non-nil

Don't use :fontset as a face attribute; use :font instead.  The value
of :font can be a fontset, so you don't need to use the (obsolete and
not really supported) :fontset attribute.  The doc string of
set-face-attribute documents :font, not :fontset, and that is not an
accident.

If you replace all instances of :fontset above with :font, fac-font
will not return nil.

This is not a bug.




Added tag(s) notabug. Request was from Eli Zaretskii <eliz <at> gnu.org> to control <at> debbugs.gnu.org. (Tue, 26 Dec 2023 17:50:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#68042; Package emacs. (Wed, 27 Dec 2023 08:22:01 GMT) Full text and rfc822 format available.

Message #13 received at 68042 <at> debbugs.gnu.org (full text, mbox):

From: Hanwen Guo <g.hanwen <at> outlook.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: "68042 <at> debbugs.gnu.org" <68042 <at> debbugs.gnu.org>
Subject: Re: bug#68042: 30.0.50; `face-font' returns nil after adding remap
 relative for fontset
Date: Wed, 27 Dec 2023 06:43:46 +0000
[Message part 1 (text/plain, inline)]
> If you replace all instances of :fontset above with :font, fac-font
will not return nil.

Actually, if you pass the fontset through the `:font' attribute, only the ASCII font from the fontset is used. This applies to both `set-face-attribute' and `face-remap-add-relative'. AFAIU, I think when it comes to the face attributes, the fontset feature is more like a way to set different font for diferent character sets, making it able to "display the whole range of characters that Emacs supports" for a given face, since setting the `:family' attribute or assigning a single font to `:font' would suffice for setting font only for ASCII characters. So the case is, either the `:font' attribute needs to consider the full fontset, or the whole fontset feature is, as you said, "obsolete".

________________________________
From: Eli Zaretskii <eliz <at> gnu.org>
Sent: Wednesday, December 27, 2023 1:49
To: Hanwen Guo <g.hanwen <at> outlook.com>
Cc: 68042 <at> debbugs.gnu.org <68042 <at> debbugs.gnu.org>
Subject: Re: bug#68042: 30.0.50; `face-font' returns nil after adding remap relative for fontset

tags 68042 notabug
thanks

> From: Hanwen Guo <g.hanwen <at> outlook.com>
> Date: Tue, 26 Dec 2023 11:47:22 +0000
> msip_labels:
>
> Providing the `:fontset' or `:font' face attribute in the `SPEC'
> argument of `face-remap-add-relative' with `FACE' argument being
> `'default' will make the `face-font' function return nil.
>
> The following Emacs Lisp code can reproduce this behavior under 'emacs
> -Q'.
>
> (create-fontset-from-fontset-spec
>  (font-xlfd-name
>   (font-spec :family "Source Serif"
>              :registry "fontset-variable pitch regular")))
>
> (set-face-attribute 'variable-pitch nil
>                     :family "Source Serif"
>                     :fontset "fontset-variable pitch regular")
>
> (let ((var-pitch (face-attribute 'variable-pitch :family))
>       (var-fontset (face-attribute 'variable-pitch :fontset)))
>   (setq mixed-pitch-variable-cookie
>         (face-remap-add-relative 'default :family var-pitch :fontset var-fontset)))
>
> (face-font 'default) ;; nil
>
> (face-remap-remove-relative mixed-pitch-variable-cookie)
>
> (face-font 'default) ;; non-nil

Don't use :fontset as a face attribute; use :font instead.  The value
of :font can be a fontset, so you don't need to use the (obsolete and
not really supported) :fontset attribute.  The doc string of
set-face-attribute documents :font, not :fontset, and that is not an
accident.

If you replace all instances of :fontset above with :font, fac-font
will not return nil.

This is not a bug.
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#68042; Package emacs. (Wed, 27 Dec 2023 13:31:02 GMT) Full text and rfc822 format available.

Message #16 received at 68042 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Hanwen Guo <g.hanwen <at> outlook.com>
Cc: 68042 <at> debbugs.gnu.org
Subject: Re: bug#68042: 30.0.50; `face-font' returns nil after adding remap
 relative for fontset
Date: Wed, 27 Dec 2023 15:30:24 +0200
> From: Hanwen Guo <g.hanwen <at> outlook.com>
> CC: "68042 <at> debbugs.gnu.org" <68042 <at> debbugs.gnu.org>
> Date: Wed, 27 Dec 2023 06:43:46 +0000
> 
> > If you replace all instances of :fontset above with :font, face-font
> will not return nil.
> 
> Actually, if you pass the fontset through the `:font' attribute, only the ASCII font from the fontset is
> used.

Yes, because the faces that are exposed to Lisp are always the faces
used for characters supported by the "ASCII font" of a face.  For
other characters, Emacs creates internally a separate face, which is
not exposed to Lisp, and determines its font from the fontset in
effect, merging the other relevant face attributes to produce a face
as similar as possible to the one used for characters covered by the
"ASCII font".

> This applies to both `set-face-attribute' and `face-remap-add-relative'. AFAIU, I think when it
> comes to the face attributes, the fontset feature is more like a way to set different font for diferent
> character sets, making it able to "display the whole range of characters that Emacs supports" for a
> given face, since setting the `:family' attribute or assigning a single font to `:font' would suffice for
> setting font only for ASCII characters. So the case is, either the `:font' attribute needs to consider the
> full fontset, or the whole fontset feature is, as you said, "obsolete". 

Then please explain in more detail what you are trying to achieve, and
why.  The code snippet you presented makes it hard to guess, since it
defines a face with a special fontset, and then remaps the 'default'
face to that face.  Why would you need to do that, instead of simply
customizing the default-fontset or setting the :fontset attribute of
the 'default' face?

The technical reason for what you see is that face-remapping creates
an anonymous face with the specified attributes, and Emacs doesn't
support the :fontset attribute for anonymous faces.  But since I don't
really understand why you use face-remap-add-relative, I cannot tell
whether this is a problem or how to solve it for your needs.




Added tag(s) moreinfo. Request was from Stefan Kangas <stefankangas <at> gmail.com> to control <at> debbugs.gnu.org. (Wed, 10 Jan 2024 11:05:02 GMT) Full text and rfc822 format available.

Reply sent to Stefan Kangas <stefankangas <at> gmail.com>:
You have taken responsibility. (Sun, 09 Jun 2024 20:58:02 GMT) Full text and rfc822 format available.

Notification sent to Hanwen Guo <g.hanwen <at> outlook.com>:
bug acknowledged by developer. (Sun, 09 Jun 2024 20:58:02 GMT) Full text and rfc822 format available.

Message #23 received at 68042-done <at> debbugs.gnu.org (full text, mbox):

From: Stefan Kangas <stefankangas <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 68042-done <at> debbugs.gnu.org, Hanwen Guo <g.hanwen <at> outlook.com>
Subject: Re: bug#68042: 30.0.50; `face-font' returns nil after adding remap
 relative for fontset
Date: Sun, 9 Jun 2024 13:56:26 -0700
Eli Zaretskii <eliz <at> gnu.org> writes:

>> From: Hanwen Guo <g.hanwen <at> outlook.com>
>> CC: "68042 <at> debbugs.gnu.org" <68042 <at> debbugs.gnu.org>
>> Date: Wed, 27 Dec 2023 06:43:46 +0000
>>
>> > If you replace all instances of :fontset above with :font, face-font
>> will not return nil.
>>
>> Actually, if you pass the fontset through the `:font' attribute, only the ASCII font from the fontset is
>> used.
>
> Yes, because the faces that are exposed to Lisp are always the faces
> used for characters supported by the "ASCII font" of a face.  For
> other characters, Emacs creates internally a separate face, which is
> not exposed to Lisp, and determines its font from the fontset in
> effect, merging the other relevant face attributes to produce a face
> as similar as possible to the one used for characters covered by the
> "ASCII font".
>
>> This applies to both `set-face-attribute' and `face-remap-add-relative'. AFAIU, I think when it
>> comes to the face attributes, the fontset feature is more like a way to set different font for diferent
>> character sets, making it able to "display the whole range of characters that Emacs supports" for a
>> given face, since setting the `:family' attribute or assigning a single font to `:font' would suffice for
>> setting font only for ASCII characters. So the case is, either the `:font' attribute needs to consider the
>> full fontset, or the whole fontset feature is, as you said, "obsolete".
>
> Then please explain in more detail what you are trying to achieve, and
> why.  The code snippet you presented makes it hard to guess, since it
> defines a face with a special fontset, and then remaps the 'default'
> face to that face.  Why would you need to do that, instead of simply
> customizing the default-fontset or setting the :fontset attribute of
> the 'default' face?
>
> The technical reason for what you see is that face-remapping creates
> an anonymous face with the specified attributes, and Emacs doesn't
> support the :fontset attribute for anonymous faces.  But since I don't
> really understand why you use face-remap-add-relative, I cannot tell
> whether this is a problem or how to solve it for your needs.

More information was requested, but none was given within 23 weeks, so
I'm closing this bug.  If this is still an issue, please reply to this
email (use "Reply to all" in your email client) and we can reopen the
bug report.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Mon, 08 Jul 2024 11:24:10 GMT) Full text and rfc822 format available.

This bug report was last modified 18 days ago.

Previous Next


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