Emacs 没有列出 semilight 字体?

Emacs not listing semilight fonts?

我想使用 semilight 字体。但是,出于某种原因,emacs 没有列出 semilight 字体。我错过了什么吗?

在我的 init.el 中,我有以下内容:

(set-face-attribute 'default nil :family "Cascadia Code" :weight 'semilight)

然而,当 运行ning describe-char 在任何字符上时,我知道它正在使用 -SAJA-Cascadia Code-light-normal-normal-*-13-*-*-*-m-0-iso10646-1,结果是来自 CascadiaCode-Regular.otf.

我试图找到发生这种情况的主要原因:

我不太确定这里发生了什么。 emacs 不应该显示这些 weight=55 的字体吗?如果是这样,想过为什么没有发生吗?


环境:

在深入了解了 fontconfig 对 OTF 文件的处理方式,以及 emacs 如何解析 fontconfig 给出的字体粗细后,我找到了真正的罪魁祸首。

这可能是 emacs 中的错误。那是因为通过比较 fontconfig spec with how emacs understands font-weights,有一些差异。值得注意的是,其中之一涉及 semilight 字体粗细。

一种解决方法是使用 fontforge,并将 OTF 字体粗细更改为 emacs 可以理解的内容。所以,例如:

  1. Cascadia 代码 SemiLight.otf 的 OTF 字体粗细从 350(fontconfig 的半亮)更改为 380(fontconfig的书)
  2. fontconfig 将根据 their table 将该值转换为 FC_WEIGHT_BOOK (75)
  3. emacs 会将其显示为 semilight

更改字体文件有点过于粗暴,而且无法维护,因为 Cascadia 相当新,而且经常发布。

可以在缓存重建期间将 semilight 权重值 (55) 替换为 book (75),这使得 Emacs 在分配 'semi-light 时愉快地显示 Cascadia SemiLight 变体作为一张脸的 :weight 属性。不幸的是,这个技巧只能通过缓存的字体描述来实现。字体配置很深奥。

将此配置文件放入 fc-cache 扫描的位置:每个用户,或放入 /etc/fonts/conf.d 供所有用户使用(通常;fc-conflist 会告诉它正在寻找哪些目录into; file 50-user.conf 通常包括主目录中的 .conf 文件)。影响缓存扫描的文件通常以 80 到 89 范围内的数字为前缀。我将此文件设为 /etc/fonts/conf.d/80-cascadia-semilight.conf;你可能有自己的喜好。

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>

  <description>Adjust weight of Cascadia fonts for Emacs</description>

  <match target="scan">
    <test target="font" name="family" ignore-blanks="true">
      <string>Cascadia Mono</string>
    </test>
    <test target="font" name="weight">
      <const>semilight</const>
    </test>
    <edit name="weight">
      <const>book</const>
    </edit>
  </match>

  <!-- Repeat the same match stanza for the other three fonts,
       Cascadia Mono PL, Cascadia Code and Cascadia Code PL. -->

</fontconfig>

或者获取lock, stock and barrel from this Gist.