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.
我试图找到发生这种情况的主要原因:
当我 运行 describe-font
时,我似乎无法在我的系统中找到任何 semilight
字体(即 weight=55
) .唯一显示为 semilight
的字体是粗细为 75 的字体。
运行 x-select-font
列出 semilight
字体。
我不太确定这里发生了什么。 emacs 不应该显示这些 weight=55
的字体吗?如果是这样,想过为什么没有发生吗?
环境:
- GNU Emacs 27.2(构建 1,x86_64-redhat-linux-gnu,GTK+ 版本 3.24.29,cairo 版本
2021-04-27 的 1.17.4)
- 软呢帽 34
在深入了解了 fontconfig
对 OTF 文件的处理方式,以及 emacs 如何解析 fontconfig
给出的字体粗细后,我找到了真正的罪魁祸首。
这可能是 emacs 中的错误。那是因为通过比较 fontconfig
spec with how emacs understands font-weights,有一些差异。值得注意的是,其中之一涉及 semilight
字体粗细。
一种解决方法是使用 fontforge
,并将 OTF 字体粗细更改为 emacs 可以理解的内容。所以,例如:
- 将 Cascadia 代码 SemiLight.otf 的 OTF 字体粗细从 350(
fontconfig
的半亮)更改为 380(fontconfig
的书)
fontconfig
将根据 their table 将该值转换为 FC_WEIGHT_BOOK
(75)
- 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>
我想使用 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.
我试图找到发生这种情况的主要原因:
当我 运行
describe-font
时,我似乎无法在我的系统中找到任何semilight
字体(即weight=55
) .唯一显示为semilight
的字体是粗细为 75 的字体。运行
x-select-font
列出semilight
字体。
我不太确定这里发生了什么。 emacs 不应该显示这些 weight=55
的字体吗?如果是这样,想过为什么没有发生吗?
环境:
- GNU Emacs 27.2(构建 1,x86_64-redhat-linux-gnu,GTK+ 版本 3.24.29,cairo 版本 2021-04-27 的 1.17.4)
- 软呢帽 34
在深入了解了 fontconfig
对 OTF 文件的处理方式,以及 emacs 如何解析 fontconfig
给出的字体粗细后,我找到了真正的罪魁祸首。
这可能是 emacs 中的错误。那是因为通过比较 fontconfig
spec with how emacs understands font-weights,有一些差异。值得注意的是,其中之一涉及 semilight
字体粗细。
一种解决方法是使用 fontforge
,并将 OTF 字体粗细更改为 emacs 可以理解的内容。所以,例如:
- 将 Cascadia 代码 SemiLight.otf 的 OTF 字体粗细从 350(
fontconfig
的半亮)更改为 380(fontconfig
的书) fontconfig
将根据 their table 将该值转换为FC_WEIGHT_BOOK
(75)- 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>