Forcer une seule police pour tous les glyphes Unicode

8

J'utilise GNU Emacs 24.4.1 dans une interface graphique sur OS X. Je veux forcer chaque caractère à être affiché en utilisant une seule police plutôt que de permettre à Emacs de choisir une supposée plus appropriée. Je comprends qu'aucune police n'inclura tous les glyphes, mais j'utilise un sous-ensemble limité d'unicode que de nombreuses bonnes polices couvrent de manière satisfaisante.

J'ai beaucoup parlé de l'utilisation du package unicode-fonts pour définir des polices pour des plages de caractères, mais je ne veux pas avoir mille lignes supplémentaires dans ma configuration pour définir chaque bloc séparément.

Comment puis-je simplement empêcher Emacs de mapper automatiquement différents glyphes à différentes polices?

Merci.

karl
la source
1
Avez-vous essayé (set-fontset-font t nil MY-FONT)MY-FONTest le nom de votre police?
lunaryorn
@lunaryorn Merci pour la suggestion. J'ai essayé cela tout à l'heure et j'obtiens toujours différentes polices pour différents caractères. J'ai essayé de définir ma police sur Pragmata Pro et j'ai fini par obtenir des glyphes unicode Menlo (comme vérifié par describe-char).
karl

Réponses:

6

Jouer avec les définitions des jeux de polices d'Emacs devrait être la réponse.

Après avoir lu

  • Documents sur les jeux de polices :

    Le jeu de polices de démarrage utilisera la police que vous spécifiez, ou une variante avec un registre et un codage différents, pour tous les caractères pris en charge par cette police, et se repliera sur «fontset-default» pour les autres caractères.

    Si certains caractères apparaissent à l'écran sous forme de cases vides ou de codes hexadécimaux, cela signifie que le jeu de polices utilisé pour eux n'a pas de police pour ces caractères.

  • description de set-fontset-font :

    CIBLE peut être un inconvénient; (FROM. TO), où FROM et TO sont des caractères. Dans ce cas, utilisez FONT-SPEC pour tous les caractères de la plage FROM et TO (inclus).

    TARGET peut être un symbole de nom de script. Dans ce cas, utilisez FONT-SPEC pour tous les caractères appartenant au script.

    TARGET peut être un jeu de caractères. Dans ce cas, utilisez FONT-SPEC pour tous les caractères du jeu de caractères.

    CIBLE peut être nul. Dans ce cas, utilisez FONT-SPEC pour tous les caractères pour lesquels aucun FONT-SPEC n'est spécifié.

  • documents sur la vérification des jeux de caractères :

    Il existe deux commandes qui peuvent être utilisées pour obtenir des informations sur les jeux de caractères. La commande Mx list-charset-chars demande un nom de jeu de caractères et affiche tous les caractères de ce jeu de caractères. La commande Mx describe-character-set demande un nom de jeu de caractères et affiche des informations sur ce jeu de caractères, y compris sa représentation interne dans Emacs.

    Pour savoir à quel jeu de caractères appartient un caractère dans le tampon, placez-le avant et tapez Cu Cx =

Dans notre fichier init, nous devrions pouvoir définir une police pour une gamme complète de caractères:

 (let ((my-font "DejaVu Sans Mono-14"))
  (set-fontset-font "fontset-startup" '(#x000000 . #x3FFFFF) my-font)
  (set-fontset-font "fontset-default" '(#x000000 . #x3FFFFF) my-font)
  (set-fontset-font "fontset-standard" '(#x000000 . #x3FFFFF) my-font))

Mais pour définir une police pour une plage de caractères et la forcer en tant que police de remplacement pour les caractères non pris en charge, nous devons également ajouter nil comme cible:

(let ((my-font "DejaVu Sans Mono-14")
      (font-sets '("fontset-default"
                   "fontset-standard"
                   "fontset-startup")))
  (mapcar
   (lambda (font-set)
     ;; all the characters in that range (which is the full possible range)
     (set-fontset-font font-set '(#x000000 . #x3FFFFF) my-font)

     ;; for all characters without font specification
     ;; in another words it is a setting for lack of fallback font
     ;; if e.g. ℕ called DOUBLE-STRUCK CAPITAL N is not covered by our font
     ;; it will be displayed as placeholder-box,
     ;; because fallback for our font is now... our font :)
     (set-fontset-font font-set nil my-font))
   font-sets))

Maintenant, comme nous pouvons le voir sous le point (curseur) avec C-u C-x =ou M-x describe-char:

             position: 1430 of 1954 (73%), column: 16
            character: ℕ (displayed as ℕ) (codepoint 8469, #o20425, #x2115)
    preferred charset: unicode (Unicode (ISO10646))
code point in charset: 0x2115
               script: symbol
               syntax: w    which means: word
             category: .:Base, L:Left-to-right (strong)
             to input: type "C-x 8 RET HEX-CODEPOINT" or "C-x 8 RET NAME"
          buffer code: #xE2 #x84 #x95
            file code: #xE2 #x84 #x95 (encoded by coding system utf-8-unix)
              display: no font available

Character code properties: customize what to show
  name: DOUBLE-STRUCK CAPITAL N
  old-name: DOUBLE-STRUCK N
  general-category: Lu (Letter, Uppercase)
  decomposition: (font 78) (font 'N')

Partie importante: affichage: aucune police disponible .

Il devrait être possible de définir cela dans notre fichier .Xresources :

Avec la ressource X 'Emacs.Font', vous pouvez spécifier un nom de jeu de polices comme un vrai nom de police.

Cependant, je ne sais pas quelle est la syntaxe appropriée.

Avant ce changement, j'ai pu voir beaucoup de glyphes Unicode non pris en charge par la police de mon choix. Après ce changement - je ne peux voir qu'une seule police dans mes Emacs et des cases vides-espaces réservés pour les glyphes non pris en charge par celui-ci.

Cela fonctionne dans mon système et devrait être suffisant pour le moment avant que quelqu'un d'autre ne vous donne une réponse détaillée, technique et correcte .

kmicu
la source
Votre explication est logique, mais la configuration de suggestion réelle ne semble pas fonctionner. Je ne peux pas essayer d'utiliser l'approche Xresources parce que j'utilise la version Cocoa d'Emacs sur OS X, mais la définition des polices du jeu de polices comme vous l'avez suggéré semble n'avoir aucun effet. Si list-fontsetsaprès avoir mis votre code dans mon fichier init, j'en vois quatre répertoriés et un seul est lié à la police que j'ai définie.
karl
1
Je dois préciser: cela semble résoudre mystérieusement le problème pour un morceau de glyphes, mais pas tous. J'obtiens probablement 75% des caractères dans la police que je veux, mais toujours une solution de rechange pour quelques privilégiés.
karl
Oui, cela n'est valable que pour la plage unicode . Si vous souhaitez couvrir davantage d'encodages, vous devez également modifier les jeux de polices pour eux. Je mettrai à jour ma réponse, mais c'est probablement du piratage. Nous devons attendre une réponse des Anciens d'Emacs. :)
kmicu
J'apprécie vraiment l'aide jusqu'à présent et je suis sur le point de marquer votre réponse comme acceptée, sauf un dernier problème. Le personnage principal pour lequel je continue de remarquer que cela ne fonctionne pas, même après la modification utile, est le "N majuscule à double frappe" utilisé pour désigner l'ensemble des nombres naturels. Si je l'examine, describe-charil semble être unicode avec un point de code dans la plage que vous avez utilisée, mais il s'affiche toujours avec une police différente.
karl
1
Cette dernière mise à jour m'a donné tout ce que je voulais --- marqué comme résolu. Merci de votre aide.
karl