我已经在不同的悬而未决的问题有这个问题在这里。我希望相同大小的不同字体具有相同的高度,但是事实并非如此,因此,我将展示我的临时方法来解决此问题。
撇开重音,仅关注普通字符,仅显示某些字体会忽略其他字体中存在的整个字符块,就需要使用不同的字体来显示所有不同的字符。要确保不常见的字符(例如“ 𝚫”)至少具有一种字体,请安装诸如Symbola之类的字体,并在unicode-fonts程序包的自述文件中查看字体列表。
如果安装软件包unicode-fonts
和许多好的字体,则应该支持所有字符,但是某些字符在emacs中显示的高度错误。
假设摩纳哥的高度不正确,但是Symbola似乎具有正确的数学符号高度(例如SUBSET OF或EQUAL TO⊆;请使用C-x 8 RET或insert-char
测试不同的字符。)。就我而言,不使用摩纳哥,Noto Sans Symbols和Apple Symbols就足够了。对我来说,一种不错的字体是DejaVu Sans Mono。
第一件事是您可以unicode-fonts
通过将Monaco添加到其中来禁止使用它unicode-fonts-skip-fonts
;接下来选择的任何字体都可能具有正确的高度。另外,您可以通过修改的条目来告诉unicode-fonts
将特定字体用于Unicode块(例如Mathematical Operators;这是所有块的列表)unicode-fonts-block-font-mapping
。
第二个问题是,您可以使用手动轻松地对一组非常精确的字符进行此操作set-fontset-font
。如果Symbola是数学符号的好字体(在这种情况下,范围是0x2100..0x23ff
),则应使用以下命令:
(set-fontset-font t '(#x2100 . #x23ff)
;; this should throw an error if there is no such font
(font-xlfd-name (find-font (font-spec :family "Symbola"))))
我需要改变自己的其他范围分别为2000..206f
,27c0..27ff
,2900..2bff
,1d400..1d7ff
。
最后,无需手动搜索配置错误的字符。假设unicode-fonts
已安装,以下函数将生成一个所有高度不正确的字符的列表:
(defun debug-unicode-heights (&optional block-name)
"Find all characters in a given block that have incorrect heights.
BLOCK-NAME can be anything that
`unicode-fonts-debug-insert-block' accepts, such as `'all-math',
or a string naming a Unicode block."
(interactive "sBlock name:")
(unless block-name (setq block-name 'all-math))
(let ((buffer (generate-new-buffer (format "debug-unicode-heights:%s" block-name)))
expected-height
bad-characters)
(pop-to-buffer buffer)
(with-current-buffer buffer
(unicode-fonts-debug-insert-block block-name)
(goto-char (point-min))
(setq expected-height (line-pixel-height))
;; (message "Expected height %d" expected-height)
(while (< (point) (point-max))
(if (or (= (line-pixel-height) expected-height)
;; Some characters are invalid, they have no name
;; (their name is just their hex code), and their
;; heights do not matter to us.
(looking-at-p "^.[^\"]*\"#"))
(delete-region (line-beginning-position)
(1+ (line-end-position)))
(push (char-after (line-beginning-position)) bad-characters)
(forward-line))))
;; (display-message-or-buffer buffer)
(apply #'string (reverse bad-characters))))
例如:
M-: (debug-unicode-heights 'all-math)
然后
M-: (debug-unicode-heights 'all-greek)
将显示所有错误的数学符号。然后,您可以检查与它们一起显示的字体并进行更改。
我有OS X 10.9.5,所以我的字体设置可能与您的不同。无需安装unicode-fonts
;set-fontset-font
只要发现emacs的默认选项效果不佳,就可以完全手动指定首选字体。
PS:还有一种选择:当字体始终太大/太小时,您可以添加一个条目face-font-rescale-alist
来告诉emacs始终将该字体的大小乘以0.95的系数,例如:
(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)
当我尝试此操作时,它并不是很正常(我的错误报告在这里),但这也是一种可行的方法。