TL; DR:一种简单的可靠说法是:将Consolas用作默认字体,将FreeMono用于Consolas不支持的字符,将Symbola用作两者均不支持的字符?
由于我的主要编程字体未涵盖我需要的所有数学符号,因此我最初设置字体后备,如下所示:
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)
不幸的是,这也改变了我主要字体支持的某些字符的字体,因此我将其更改为
(set-fontset-font t 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)
如果我的理解是正确的,这应该确保Consolas无法处理的字符由FreeMono处理,除非FreeMono没有它们,在这种情况下,应使用Symbola显示它们。我的理解t
也与"fontset-default"
上述相同。
不幸的是,仍然有一些情况没有选择正确的字体。我发现更改为
(set-fontset-font t 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "Symbola") nil 'append)
效果更好,但并非总是如此:使用更改字体大小
(set-face-attribute 'default nil :height some-size)
由于创建了新的字体集,导致后备时间被忽略。
我目前的解决方案是
(set-fontset-font fontset 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font fontset 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font fontset 'unicode (font-spec :name "Symbola") nil 'append)
在每个字体集(fontset-list
)上更改每个字体大小之后。
设置字体后备的正确方法是什么?
注意:出于测试目的,这里有一些数学字符:ℕ𝓟⧺×≠≥≤±¬∨∧∃∀λ⟿⟹⊥⊤⊢
参考:有关字体集和修改字体集的 Emacs手册
fontset
以错误的方式思考。Emacs实际上并不会检查它显示的每个字符,不管字体是否知道如何显示。这将在计算上过于密集。因此,本身就没有“后备”机制。您应该设置默认字体,然后在特定范围内手动修改默认字体集以使用不同的字体显示。此过程是手动的,或者包装unicode
可以提供帮助。