Ho già avuto questo problema in un'altra domanda senza risposta qui . Mi aspetto che caratteri diversi della stessa dimensione abbiano le stesse altezze, ma questo non sembra essere il caso, quindi mostrerò il mio approccio ad hoc per risolvere questo problema.
Lasciando da parte gli accenti e concentrandosi solo su caratteri semplici, sono necessari caratteri diversi per visualizzare tutti i diversi personaggi semplicemente perché alcuni caratteri omettono interi blocchi di caratteri presenti in altri caratteri. Per assicurarsi che i caratteri non comuni (come "𝚫") abbiano almeno un carattere per loro, installare un carattere come Symbola e vedere l'elenco dei caratteri nel file Leggimi del pacchetto unicode-fonts .
Se installi il pacchetto unicode-fonts
e un certo numero di buoni caratteri, tutti i caratteri dovrebbero essere supportati, ma alcuni avranno altezze di visualizzazione errate in emacs.
Supponiamo che Monaco abbia altezze errate, ma Symbola sembra avere altezze corrette per i simboli matematici (come SUBSET OF OR EQUAL TO ⊆; usa C-x 8 RETo insert-char
per testare personaggi diversi). Nel mio caso, non usare Monaco, Noto Sans Symbols e Apple Symbols è stato sufficiente; un buon carattere per me era DejaVu Sans Mono.
La prima cosa è che puoi proibire unicode-fonts
di usare Monaco aggiungendolo a unicode-fonts-skip-fonts
; qualunque sia il carattere che seleziona dopo potrebbe avere la giusta altezza. In alternativa, puoi dire unicode-fonts
di usare un font specifico per un blocco Unicode (come Operatori matematici; ecco un elenco di tutti i blocchi ) modificando una voce di unicode-fonts-block-font-mapping
.
Il secondo è che puoi farlo facilmente manualmente per un set di caratteri molto preciso usando set-fontset-font
. Se Symbola è un buon carattere per simboli matematici (in questo caso l'intervallo 0x2100..0x23ff
), dovrebbe funzionare quanto segue:
(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"))))
Altri campi di cui avevo bisogno di modificare me erano 2000..206f
, 27c0..27ff
, 2900..2bff
, 1d400..1d7ff
.
Infine, non è necessario cercare manualmente caratteri errati. Supponendo che unicode-fonts
sia installato, la seguente funzione genererà un elenco di tutti i caratteri con altezze errate:
(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))))
Per esempio:
M-: (debug-unicode-heights 'all-math)
e poi
M-: (debug-unicode-heights 'all-greek)
mostrerebbe tutti i cattivi simboli matematici. È quindi possibile esaminare il tipo di carattere con cui vengono visualizzati e modificarlo.
Ho OS X 10.9.5, quindi le mie impostazioni dei caratteri sarebbero probabilmente diverse dalle tue. Non è necessario installare unicode-fonts
; è possibile specificare manualmente le tue scelte di carattere preferite interamente set-fontset-font
ogni volta che scopri che le scelte di default di emacs non funzionano bene.
PS Esiste un'alternativa: quando un font è costantemente troppo grande / piccolo, puoi aggiungere una voce face-font-rescale-alist
per dire a emacs di moltiplicare sempre la dimensione di quel font per un fattore, diciamo, 0,95, in questo modo:
(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)
Quando ho provato questo, non ha funzionato bene (la mia segnalazione di bug è qui ), ma questo è anche un possibile approccio.