J'ai déjà eu ce problème dans une autre question sans réponse ici . Je m'attendrais à ce que différentes polices de même taille aient les mêmes hauteurs, mais cela ne semble pas être le cas, je vais donc montrer mon approche ad hoc pour résoudre ce problème.
En laissant de côté les accents et en se concentrant uniquement sur les caractères simples, différentes polices sont nécessaires pour afficher tous les différents caractères simplement parce que certaines polices omettent des blocs entiers de caractères qui sont présents dans d'autres polices. Pour vous assurer que les caractères inhabituels (tels que "𝚫") ont au moins une police pour eux, installez une police telle que Symbola et consultez la liste des polices dans le fichier Lisez -moi du package unicode-fonts .
Si vous installez le package unicode-fonts
et un certain nombre de bonnes polices, tous les caractères doivent être pris en charge, mais certains auront des hauteurs affichées incorrectes dans emacs.
Supposons que Monaco ait des hauteurs incorrectes, mais Symbola semble avoir des hauteurs correctes pour les symboles mathématiques (tels que SOUS-ENSEMBLE OU ÉGAL À ⊆; utilisez C-x 8 RETou insert-char
pour tester différents caractères.). Dans mon cas, ne pas utiliser Monaco, Noto Sans Symbols et Apple Symbols était suffisant; une bonne police pour moi était DejaVu Sans Mono.
La première chose est que vous pouvez interdire unicode-fonts
d'utiliser Monaco en l'ajoutant à unicode-fonts-skip-fonts
; quelle que soit la police qu'il sélectionne ensuite peut avoir la bonne hauteur. Alternativement, vous pouvez dire unicode-fonts
d'utiliser une police spécifique pour un bloc Unicode (comme les opérateurs mathématiques; voici une liste de tous les blocs ) en modifiant une entrée de unicode-fonts-block-font-mapping
.
La seconde est que vous pouvez facilement le faire manuellement pour un ensemble de caractères très précis en utilisant set-fontset-font
. Si Symbola est une bonne police pour les symboles mathématiques (dans ce cas, la plage 0x2100..0x23ff
), ce qui suit devrait fonctionner:
(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"))))
D' autres gammes que je avais besoin de me modifier étaient 2000..206f
, 27c0..27ff
, 2900..2bff
, 1d400..1d7ff
.
Enfin, il n'est pas nécessaire de rechercher manuellement les caractères mal configurés. En supposant qu'il unicode-fonts
soit installé, la fonction suivante générera une liste de tous les caractères avec des hauteurs incorrectes:
(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))))
Par exemple:
M-: (debug-unicode-heights 'all-math)
et alors
M-: (debug-unicode-heights 'all-greek)
montrerait tous les mauvais symboles mathématiques. Vous pouvez ensuite examiner la police avec laquelle ils sont affichés et la modifier.
J'ai OS X 10.9.5, donc mes paramètres de police seraient probablement différents des vôtres. Il n'est pas nécessaire d'installer unicode-fonts
; il est possible de spécifier manuellement vos choix de police préférés entièrement set-fontset-font
chaque fois que vous constatez que les choix par défaut d'emacs ne fonctionnent pas bien.
PS Il existe une alternative: quand une police est toujours trop grande / petite, vous pouvez ajouter une entrée face-font-rescale-alist
pour dire à emacs de toujours multiplier la taille de cette police par un facteur de, disons, 0,95, comme ceci:
(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)
Quand j'ai essayé, cela n'a pas tout à fait fonctionné correctement (mon rapport de bogue est ici ), mais c'est également une approche possible.