Emacs: fuentes y paquetes de fuentes

Traducción de Inglés a Español de un texto de Alan Third que explica cómo funcionan las fuentes en Emacs: fuente por defecto, fuentes de reserva, fuentes para otros idiomas, etc

emacsfuentesidiomastraduccion
22 marzo, 2021 Fuentes en Emacs
22 marzo, 2021 Fuentes en Emacs

Un artículo original escrito por Alan Third,
publicado originalmente en https://idiocy.org/emacs-fonts-and-fontsets.html

Traducido por Laura, traductora Espa̱ol РIngles

* * *

 

Con Emacs, tenía un problema: no conseguía entender cómo funcionaba el sistema de fuentes. Tenía muy claro que los paquetes de fuentes eran la solución a muchos de mis problemas, pero nunca había conseguido averiguar cómo utilizarlos. Os dejo por aquí todo lo que he aprendido sobre la configuración de fuentes en Emacs.

Configuración de la fuente por defecto

Se suele decir que «cada maestrillo tiene su librillo», y en Emacs ocurre lo mismo. Hay tantas formas de configurar la fuente por defecto como usuarios, pero esta es la que más me ha convencido:

(set-face-attribute 'default nil :font "Droid Sans Mono")

Así, se modifica el paquete de fuentes por defecto y se establece la fuente en todos los frames.

Configuración de las fuentes de reserva

Pero ¿qué pasa si utilizas la misma configuración en varias cajas o si la fuente que has elegido no proporciona todos los glifos que necesitas? Por defecto, Emacs busca entre las fuentes existentes hasta que encuentre una que contenga el glifo deseado, pero el proceso puede ser muy lento y, además, un caos1.

Emacs permite que puedas especificar tú mismo cuáles son las fuentes de reserva. Para hacerlo con el paquete de fuentes por defecto, prueba a hacer algo así:

(set-fontset-font t nil "Courier New" nil 'append)

Al usar t como primer argumento, se actualizará el paquete de fuentes por defecto. También es posible crear otros paquetes de fuentes y utilizarlos, pero nunca me ha dado muy buen resultado, así que prefiero modificar el predeterminado y ya está. El segundo argumento, al que volveremos luego, es el rango del glifo. El último argumento, append, es el que ordena a Emacs que añada la fuente al final del paquete de fuentes, por lo que será la opción a la que recurrir después de todas las que incluya el paquete.  También se puede utilizar prepend, que, junto con set-face-attribute, pone la fuente en primer lugar, justo después de la establecida por defecto.

Configuración de fuentes para glifos específicos

Pero volvamos al segundo argumento, el del rango de glifos. Puedes especificar un solo glifo, un rango de glifos, el nombre de un conjunto de caracteres o un idioma.

Por ejemplo, si quieres que se use en una fuente específica.

(set-fontset-font t ?:) "Segoe UI Emoji")

También puedes establecer rangos.

(set-fontset-font t '(?:) .?:/) "Segoe UI Emoji")

Esta opción no es válida para caracteres ASCII, Emacs no lo permite.

Configuración de fuentes para diferentes conjuntos de caracteres o idiomas

Vamos a suponer que sueles usar mucho las letras tailandesas, pero que tu fuente por defecto no las soporta, o que igual te gusta más cómo queda otra fuente para la letra tailandesa.

Busca en script-representative-chars y list-charset-chars para ver si lo que buscas está en la lista y usa ese nombre. Si no, usa describe-char en uno de los caracteres en cuestión y mira las entradas de charset o script.

(set-fontset-font t 'thai" Noto Sans Thai")

Esto acelera muchísimo el proceso, porque Emacs ya no tiene que buscar entre cientos de fuentes para ver si hay alguna compatible.

Si necesitas establecer una fuente de reserva para la letra tailandesa, solo tienes que hacer lo de arriba.

(set-fontset-font t 'thai" Leelawadee UI" nil 'append)

Lo malo es que, si estás usando la configuración en máquinas que no tienen estas fuentes, ni siquiera se va a molestar en buscar una fuente compatible, solo ofrecerá una fila de cajas. Pero no te preocupes, podemos obligar a Emacs a buscar usando font-spec.

(set-fontset-font t 'thai (font-spec :script 'thai) nil 'append)

Puedes poner lo que quieras en esa orden de font-spec; Emacs buscará entre las fuentes algo que se ajuste.  No hay razón por la que no se pueda usar font-spec para establecer una fuente específica.

Nuestra configuración completa para la letra tailandesa tendría entonces este aspecto:

(set-fontset-font t 'thai "Noto Sans Thai")
(set-fontset-font t 'thai "Leelawadee UI" nil 'append)
(set-fontset-font t 'thai (font-spec :script 'thai) nil 'append)

Ten en cuenta que solo puedes añadir o preañadir una fuente cuando ya hay algo establecido para ese glifo o rango. Tiene sentido, pero yo antes pensaba que así la añadía a una gran lista dentro del paquete de fuentes en vez de a una dentro de un conjunto de listas, y no entendía por qué no funcionaba.

Cómo comprobar si una fuente está instalada

En vez de apostarlo todo a lo que haga la reserva, puedes ver si una fuente está instalada antes de intentar utilizarla. Es muy fácil, porque todas las familias de fuentes disponibles están en font-family-list2, así que solo habría que mirar la lista:

(member "Noto Sans" (font-family-list))

Anexo

He configurado algunas fuentes básicas de Noto para varios idiomas para intentar que la navegación por el archivo Hello de Emacs sea más rápida (C-h h). Como no hay paquetes de reserva para estas fuentes, si utilizara esta configuración en un ordenador que no las tuviera, solo se verían un montón de casillas vacías por todas partes. Igual este es el empujón que necesitas para establecer una configuración propia.

(set-face-attribute 'default nil :font "Droid Sans Mono");

; Latin (set-fontset-font t 'latin "Noto Sans")

;; East Asia: 你好, 早晨, こんにちは, 안녕하세요
;;
;; Asegúrate de que estás usando la fuente correcta. Consulta:
;; https://www.google.com/get/noto/help/cjk/.
;;
;; This font requires "Regular". Other Noto fonts dont.
;; ¯\_(ツ)_/¯
(set-fontset-font t 'han "Noto Sans CJK SC Regular")
(set-fontset-font t 'kana "Noto Sans CJK JP Regular")
(set-fontset-font t 'hangul "Noto Sans CJK KR Regular")
(set-fontset-font t 'cjk-misc "Noto Sans CJK KR Regular")

;; South East Asia: ជំរាបសួរ, ສະບາຍດີ, မင်္ဂလာပါ, สวัสดีครับ
(set-fontset-font t 'khmer "Noto Sans Khmer")
(set-fontset-font t 'lao "Noto Sans Lao")
(set-fontset-font t 'burmese "Noto Sans Myanmar")
(set-fontset-font t 'thai "Noto Sans Thai")

;; Africa: ሠላም
(set-fontset-font t 'ethiopic "Noto Sans Ethiopic")

;; Middle/Near East: שלום, السّلام عليكم
(set-fontset-font t 'hebrew "Noto Sans Hebrew")
(set-fontset-font t 'arabic "Noto Sans Arabic")

;;  South Asia: નમસ્તે, नमस्ते, ನಮಸ್ಕಾರ, നമസ്കാരം, ଶୁଣିବେ,
;;              ආයුබෝවන්, வணக்கம், నమస్కారం, བཀྲ་ཤིས་བདེ་ལེགས༎
(set-fontset-font t 'gujarati "Noto Sans Gujarati")
(set-fontset-font t 'devanagari "Noto Sans Devanagari")
(set-fontset-font t 'kannada "Noto Sans Kannada")
(set-fontset-font t 'malayalam "Noto Sans Malayalam")
(set-fontset-font t 'oriya "Noto Sans Oriya")
(set-fontset-font t 'sinhala "Noto Sans Sinhala")
(set-fontset-font t 'tamil "Noto Sans Tamil")
(set-fontset-font t 'telugu "Noto Sans Telugu")
(set-fontset-font t 'tibetan "Noto Sans Tibetan")

Actualizaciones

Actualización: 31/3/2019. Yuan Fu nos ha hecho algunas sugerencias. ¡Gracias!

Actualización: 01/04/2019. Se ha añadido un enlace a la traducción al chino.

Actualización: 31/12/2019. Sebastian Urban me ha enviado una configuración de fuentes Noto más completa. Os dejo su mensaje:

Me ha parecido muy útil tu post «Emacs: fuentes y paquetes de fuentes» y me ha apetecido ir más allá. Como hay otras fuentes Noto Sans, he decidido crear una lista que sea lo más completa posible. Tiene la forma de «(set-fontset-font «default-fontset» ‘SCRIPTNAME «Noto Sans FONT»)». No he incluido «Noto Sans Symbols» ni «Noto Sans Symbols2» y utilizo «Noto Sans CJK SC Regular» para ‘cjk-misc’.
Además, como ocupa mucho espacio, las guardo en un archivo aparte y los cargo con «(load …)» desde init.

Notas

1Emacs tiene por defecto la fuente de reserva de Symbola, por lo que es bueno instalarla para no tener que buscar en todo el paquete de fuentes.

2Visita Xah Lee’s Font Setup page para obtener más información.

Valora este artículo