Forzar una sola fuente para todos los glifos unicode

8

Estoy usando GNU Emacs 24.4.1 en una GUI en OS X. Quiero obligar a que se muestren todos los caracteres con una sola fuente en lugar de permitir que Emacs elija uno supuestamente más apropiado. Entiendo que ninguna fuente incluirá todos los glifos, pero uso un subconjunto limitado de Unicode que muchas fuentes buenas cubren satisfactoriamente.

He visto muchas conversaciones sobre el uso del paquete de fuentes Unicode para establecer fuentes para rangos de caracteres, pero no quiero tener mil líneas adicionales en mi configuración para configurar cada bloque por separado.

¿Cómo puedo evitar que Emacs asigne automáticamente diferentes glifos a diferentes fuentes?

Gracias.

karl
fuente
1
¿Intentaste (set-fontset-font t nil MY-FONT)dónde MY-FONTestá el nombre de tu fuente?
lunaryorn
@lunaryorn Gracias por la sugerencia. Lo intenté hace un momento y todavía obtengo diferentes fuentes para diferentes personajes. Intenté configurar mi fuente en Pragmata Pro y terminé obteniendo los glifos unicode de Menlo (como lo verificó describe-char).
karl

Respuestas:

6

Jugar con las definiciones de conjuntos de fuentes de Emacs debería ser la respuesta.

Despues de leer

  • Documentos de conjuntos de fuentes :

    El conjunto de fuentes de inicio utilizará la fuente que especifique, o una variante con un registro y una codificación diferentes, para todos los caracteres que son compatibles con esa fuente, y recurrirá a 'fontset-default' para otros caracteres.

    Si algunos caracteres aparecen en la pantalla como cuadros vacíos o códigos hexadecimales, esto significa que el conjunto de fuentes en uso para ellos no tiene fuente para esos caracteres.

  • descripción de set-fontset-font :

    OBJETIVO puede ser una desventaja; (FROM. TO), donde FROM y TO son caracteres. En ese caso, use FONT-SPEC para todos los caracteres en el rango FROM y TO (inclusive).

    TARGET puede ser un símbolo de nombre de script. En ese caso, use FONT-SPEC para todos los caracteres que pertenecen al script.

    OBJETIVO puede ser un juego de caracteres. En ese caso, use FONT-SPEC para todos los caracteres en el juego de caracteres.

    OBJETIVO puede ser nulo. En ese caso, use FONT-SPEC para cualquier carácter para el que no se especifique FONT-SPEC.

  • documentos sobre la comprobación de charsets :

    Hay dos comandos que se pueden usar para obtener información sobre charsets. El comando Mx list-charset-chars solicita un nombre de conjunto de caracteres y muestra todos los caracteres de ese conjunto de caracteres. El comando Mx describe-character-set solicita un nombre de conjunto de caracteres y muestra información sobre ese conjunto de caracteres, incluida su representación interna dentro de Emacs.

    Para averiguar a qué conjunto de caracteres pertenece un carácter en el búfer, ponga el punto antes y escriba Cu Cx =

En nuestro archivo init deberíamos poder configurar una fuente para la gama completa de caracteres:

 (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))

Pero para establecer una fuente para un rango de caracteres y forzarla como una fuente alternativa para los caracteres no admitidos por ella , también debemos agregar nil como destino:

(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))

Ahora, como podemos ver debajo del punto (cursor) con C-u C-x =o 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')

Parte importante: pantalla: no hay fuente disponible .

Debería ser posible configurar eso en nuestro archivo .Xresources :

Con el recurso X 'Emacs.Font', puede especificar un nombre de conjunto de fuentes como un nombre de fuente real.

Sin embargo, no sé cuál es una sintaxis adecuada para eso.

Antes de ese cambio, pude ver muchos glifos Unicode no admitidos por mi fuente de elección. Después de ese cambio, solo puedo ver una fuente en mis Emacs y casillas vacías para marcadores de posición para glifos que no son compatibles.

Funciona en mi sistema y debería ser suficiente por ahora antes de que otra persona le dé una respuesta detallada, técnica y correcta .

kmicu
fuente
Su explicación tiene sentido, pero la configuración de sugerencia real no parece funcionar. No puedo intentar usar el enfoque Xresources porque estoy usando la compilación Cocoa de Emacs en OS X, pero configurar las fuentes del conjunto de fuentes como usted sugirió parece no tener efecto. Si list-fontsetsdespués de poner su código en mi archivo init, veo cuatro en la lista y solo uno está relacionado con la fuente que configuré.
karl
1
Debo aclarar: esto misteriosamente parece solucionar el problema para una gran cantidad de glifos, pero no todos. Probablemente obtengo el 75% de los caracteres en la fuente que quiero, pero aún así es una alternativa para algunos seleccionados.
karl
Sí, eso solo es válido para ' rango unicode . Si desea que se cubran más codificaciones, también debe cambiar los conjuntos de fuentes para ellas. Actualizaré mi respuesta, pero esto probablemente sea un hacker. Necesitamos esperar una respuesta de los Ancianos de Emacs. :)
kmicu
Realmente aprecio la ayuda hasta ahora y estoy cerca de marcar su respuesta como aceptada, salvo un problema final. El personaje principal que sigo notando que esto no funciona, incluso después de la modificación útil, es la "N mayúscula doble" utilizada para denotar el conjunto de números naturales. Si lo examino, describe-charparece ser unicode con un punto de código en el rango que ha utilizado, pero aún se muestra con una fuente diferente.
karl
1
Esa última actualización me dio todo lo que quería --- marcado como resuelto. Gracias por tu ayuda.
karl