Я вже мав цю проблему в іншому без відповіді питання тут . Я б очікував, що різні шрифти одного розміру мають однакову висоту, але це, мабуть, не так, тому я покажу свій спеціальний підхід до виправлення цього.
Не залишаючи акценти і зосереджуючись лише на звичайних символах, різні шрифти необхідні для відображення всіх різних символів просто тому, що деякі шрифти опускають цілі блоки символів, які є в інших шрифтах. Щоб переконатися, що нечасті символи (наприклад, "𝚫") мають принаймні один шрифт для них, встановіть такий шрифт, як Symbola, і перегляньте список шрифтів у readme пакету unicode-шрифтів .
Якщо ви встановите пакет unicode-fonts
і кілька хороших шрифтів, всі символи повинні бути підтримані, але деякі з них матимуть неправильні відображені висоти в emacs.
Припустимо, Монако має неправильні висоти, але, схоже, у Symbola є правильні висоти для математичних символів (наприклад, SUBSET OF OR EQUAL TO use; використання C-x 8 RETабо insert-char
тестування різних символів.) У моєму випадку недостатньо використовувати Monaco, Noto Sans Symbols та Apple Symbols; одним гарним шрифтом для мене був DejaVu Sans Mono.
Перше, що ви можете заборонити unicode-fonts
використовувати Монако, додавши його до unicode-fonts-skip-fonts
; той шрифт, який він вибере далі, може мати правильну висоту. Крім того, ви можете сказати unicode-fonts
використовувати певний шрифт для блоку Unicode (наприклад, математичні оператори; ось список усіх блоків ), змінивши запис 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)
показав би всі погані математичні символи. Потім можна вивчити, з яким шрифтом вони відображаються, та змінити його.
У мене ОС 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)
Коли я спробував це, він не дуже спрацював (мій звіт про помилку тут ), але це також можливий підхід.