Monaspace
(monaspace.githubnext.com)- Monaspace est un nouveau système de polices conçu pour apporter une expression typographique plus riche à l’affichage du code tout en conservant une grille à chasse fixe
- Sa fonctionnalité clé, Texture Healing, corrige les déséquilibres d’espacement entre paires de caractères adjacents à l’aide de glyphes alternatifs, afin de réduire les écarts de densité dans le texte à chasse fixe
- Cette approche applique les contextual alternates d’OpenType aux polices de code, ce qui permet de l’utiliser dans la plupart des éditeurs sans plugin dédié, avec aussi une configuration fournie pour Visual Studio Code
- Monaspace propose un axe de graisse de 200 à 800, un axe d’inclinaison de 0 à -11°, et un axe de largeur de 100 à 125, tout en permettant d’activer ou désactiver les ligatures de code par langue via des jeux de styles
- GitHub Next développe cette police avec Lettermatic depuis 2022, avec l’ambition d’élargir les moyens d’expression de l’affichage du code pour les outils de développement
Un système de polices qui étend l’affichage du code à chasse fixe
- Monaspace est une « superfamily » de polices pour le code, pensée pour faire évoluer la manière dont le code s’affiche à l’écran
- Le code est affiché en police à chasse fixe depuis les débuts du téléscripteur, et Monaspace cherche à conserver cette grille tout en y injectant davantage de sens
- Les éditeurs existants transmettent souvent des informations qui vont au-delà de la coloration syntaxique, via des éléments d’interface comme le survol, le soulignement ou des ornements graphiques
- Monaspace fournit, au niveau de la police elle-même, une palette plus expressive que le code et les outils de développement peuvent exploiter
Les suggestions de Copilot et la typographie
- Les suggestions de code comme celles de Copilot peuvent disposer, avec Monaspace, d’une voix typographique distincte
- Le ghost text peut rendre plus difficile l’analyse et l’évaluation du code proposé
- Si l’expression de la police elle-même indique quelles parties relèvent d’un code suggéré, il devient plus facile d’identifier ces fragments plus tard
Les limites des polices à chasse fixe visées par Texture Healing
- Les polices à chasse fixe placent tous les caractères dans des boîtes de même largeur, ce qui crée une densité de texte irrégulière
- Les caractères étroits comme
letiont besoin d’empattements exagérés pour remplir leur boîte, et malgré cela, trop d’espace vide subsiste encore - Les caractères larges comme
metwsont compressés dans leur boîte, ce qui déforme leur forme, affine leurs traits et limite aussi l’espace intérieur - Ces contraintes constituent un problème structurel des polices à chasse fixe qui remonte à l’époque des téléscripteurs des années 1960
Fonctionnement de Texture Healing
- Texture Healing repère les paires de caractères adjacents où l’un manque d’espace et l’autre en a en trop, puis remplace leurs glyphes
- Les caractères étroits sont remplacés par des glyphes alternatifs qui cèdent une partie de leur espace à leur voisin, tandis que les caractères larges sont remplacés par des glyphes alternatifs qui s’étendent jusqu’au bord de leur boîte
- Cette fonctionnalité est implémentée via les contextual alternates d’OpenType
- Les contextual alternates sont généralement utilisés dans les écritures arabes ou les polices cursives, où la forme d’un glyphe varie selon les caractères environnants
- Monaspace applique cette technique aux polices de code à chasse fixe
- Le texte obtenu respecte toujours une grille à chasse fixe
- La manière d’activer Texture Healing dans Visual Studio Code est détaillée dans la documentation Monaspace
Axes de la police et styles
- L’axe de graisse de Monaspace va de 200 à 800
- 200 : Extra Light
- 300 : Light
- 400 : Regular
- 500 : Medium
- 600 : Semibold
- 700 : Bold
- 800 : ExtraBold
- L’axe d’inclinaison va de 0 à -11°
- 0 : Normal
- -5.5° : point intermédiaire où certains caractères passent d’une forme oblique à une forme italique
- -11° : Italic
- L’axe de largeur va de 100 à 125
- 100 : Normal
- 112.5 : Semiwide
- 125 : Wide
- Monaspace comprend des familles comme Neon, Argon, Xenon, Radon et Krypton
Ligatures de code et réglages OpenType
- Monaspace inclut des ligatures de code pour divers langages de programmation
- Les ligatures sont organisées en jeux de styles, ce qui permet à l’utilisateur d’activer ou désactiver uniquement ceux qu’il souhaite
- Chaque jeu de styles est conçu de manière approximative selon les besoins d’un langage donné
ss01: inclut des ligatures pour des séquences de caractères courantes en JavaScriptss05: fournit des ligatures pour les opérateurs F#
- Des fonctionnalités OpenType supplémentaires sont également proposées
calt: active Texture Healingliga: ajuste l’espacement de caractères répétés comme///ou||, et est conçu pour ne pas s’activer à l’intérieur de séquences plus longues comme////
- Dans Visual Studio Code, on active les fonctionnalités et jeux de styles souhaités via
editor.fontLigaturesdanssettings.json
Conception et distribution
- Monaspace a été créé avec l’objectif d’améliorer l’affichage du code pour tous les développeurs
- GitHub Next a lancé ce travail en 2022 et a conçu la police avec Lettermatic
- La liste des contributeurs, la documentation et les fichiers de police sont disponibles dans le repo Monaspace
- Le téléchargement est proposé dans le dépôt GitHub
1 commentaires
Avis sur Hacker News
La fonction Texture Healing utilise très intelligemment les fonctionnalités OpenType pour rendre les combinaisons problématiques de polices à chasse fixe bien plus agréables à lire, sans casser du tout la grille
Une approche simple consisterait à créer des ligatures pour des paires de lettres délicates comme
mioulm, mais ici, on dirait qu’elle choisit des glyphes de substitution qui remplissent différemment l’espace à largeur fixe selon les lettres voisinesEn pratique, c’est difficile à utiliser. La largeur des lettres varie selon la lettre qui suit, ce qui fait sauter le texte pendant la saisie. C’est superbe à la lecture, mais horrible à l’écriture
Bravo à Riley Cran, qui a conçu cette technique dans le cadre de ce projet, ainsi qu’à toute l’équipe de https://lettermatic.com
Par exemple, dans
time_limit, dans l’exemple par défaut, le secondma unide chaque côté et donc plus d’espace pour « grandir » ; il paraît clairement plus large que le premierm. Je ne sais pas trop si c’est une bonne choseCe texture healing casse déjà la grille parfaite des cellules de caractères ; d’une certaine manière, on a l’impression qu’il cumule les inconvénients des deux approches
Je vois les ligatures sophistiquées un peu de la même façon. On peut utiliser les vrais caractères dans le code source, et Unicode est largement pris en charge. Raku fait cela, mais pour que ça brille vraiment, il faut une meilleure composition typographique, y compris des polices à chasse variable
Au début, je me suis dit « encore une autre famille de polices à chasse fixe, sympa », mais après avoir vu le texture healing, j’ai vraiment envie de l’essayer
J’aime beaucoup l’idée d’utiliser différents styles de police selon les usages. Cela dit, comme j’utilise surtout le terminal, je ne sais pas quels terminaux prennent ça en charge, et les éditeurs de texte en ligne de commande devront probablement le faire aussi. Cela reste une excellente idée à mes yeux
ESC[<10-19>mest la séquence d’échappement qui choisit les polices 0 à 9Que cela fonctionne réellement est une autre question. J’utilise Alacritty et je n’ai pas trouvé s’il le prend en charge ; en essayant moi-même, je n’ai rien obtenu
Je me demande quoi penser des exemples Mix & Match
Radon, le style manuscrit, ressemble pratiquement à de l’italique et s’accorde bien avec les autres polices. Mais les autres ont des métriques, etc. trop similaires, si bien que les exemples de « chaînes de documentation faisant autorité » ou de « voix de Copilot » sont assez difficiles à distinguer
Je cherchais depuis longtemps une alternative ouverte à Operator Mono, et grâce à Mix & Match, je me dis enfin que celle-ci pourrait être cette alternative
Certaines personnes détesteront sans doute, mais personnellement j’ai envie d’essayer
Les autres variantes ne sont pas assez différentes pour transmettre de l’information
Il y a pas mal de ligatures, mais pour moi ce n’est toujours pas suffisant. Aujourd’hui,
!=et<=sont des basiques, et je remarque sans cesse à quel point il est agréable que Fira Code aligne la hauteur de*dans*ptr, centre:dansX:Y, ou remonte lexdans0xFFJ’aurais presque aimé l’aspect de la variante Krypton, mais la barre horizontale du
tminuscule est trop basse par rapport à la hauteur de lettres comme lecminuscule. Je pense donc continuer à utiliser Fira Code pour l’instant, et je reviendrai voir dans environ un an ce qui aura changé après les retours utilisateurs*de/**ne soient pas alignésCela se voit particulièrement dans des exemples comme
// What if tentative ideas looked handwritten?et/** * What if docstrings looked authoritative? */L’idée est bonne, mais je me demande pourquoi on ne voit pas davantage de polices étroites comme PragmataPro
Je l’utilise depuis presque dix ans, et j’aimerais avoir plus de choix dans ce domaine, mais personne ne semble vouloir aller aussi loin dans l’étroitesse. Berkeley Graphics annonce depuis presque un an une version étroite de Berkeley Mono, mais il ne s’est toujours rien passé
Ici, Monaspace a aussi un curseur de largeur, mais j’ai l’impression que le point de départ est « plus large que PragmataPro » et que l’arrivée va vers « absurdement large ». Je me demande pourquoi ils ne l’ont pas aussi fait descendre vers des versions plus étroites
Iosevka par défaut s’en rapproche, mais l’interligne est beaucoup plus grand. Heureusement, on peut la personnaliser pour obtenir quelque chose de presque identique en réglant
leading = 1110dans la configuration. J’ai trouvé cette valeur par tâtonnementsEn cherchant la police la plus étroite, j’ai découvert que Quinze était la réponse. Elle est environ 20 % plus étroite qu’Iosevka ou M+. Je n’ai pas trouvé de comparaison facile avec PragmataPro, mais si Iosevka est une interprétation gratuite de PragmataPro, alors Quinze devrait être encore plus étroite
En pratique, Quinze est tellement étroite que, quand je l’ai forcée pour tout le texte à chasse fixe du navigateur, la lisibilité s’est dégradée au lieu de s’améliorer. À hauteur égale, elle paraît beaucoup plus petite qu’une police « normale ». Dans un environnement de code, je l’utilise avec une taille de police plus grande, ce qui va bien avec sa faible largeur
L’inconvénient est que Quinze est très minimaliste. Il n’y a presque que l’ASCII, pas de ligatures ni de personnalisation. Personnellement, ça ne me gêne pas
Cela dit, elle peut être aussi étroite que souhaité
https://mplusfonts.github.io/
Dans le navigateur, j’utilise « Bell MT » à la place de Times, et je l’utilise aussi comme police à largeur variable dans le mode Org d’emacs. Elle est bien, mais j’aimerais qu’il existe une version plus grande et plus étroite
Une autre bonne police étroite à chasse fixe est « The Sans Mono Condensed », devenue célèbre grâce aux premiers livres d’O’Reilly. O’Reilly est ensuite passé à une autre police à chasse fixe. Son défaut est de ne couvrir que le jeu de caractères occidental, mais je l’aimais beaucoup
Ça me dérange que le symbole du radon sur la page soit Rd. Pour le radon, ce devrait être Rn
Le radium est
Ra, le radon estRn, et ça m’a même fait revérifier s’il existait un autre élément commençant parRet contenant unddans son nomRhComme le mono flag n’est pas défini, j’ai dû essayer avec GTK2 gvim pour charger la police
Le résultat de
% ttfmono MonaspaceArgon-Regular.otfdonnemonospaced flag = 0, avec0 = variable-width, otherwise = monospacedMalheureusement, il semble que ce flag empêche l’activation des ligatures
Cela dit, dans vim lancé avec
stpatché, j’ai pu voir les ligatures et le texture healing, et j’aime vraiment beaucoup. Les lignes ne bougent que de façon très subtile pendant la saisie, et quand le curseur passe dessus, il ne laisse pas de rémanence due, par exemple, à unmélargi. C’est bien conçu pour le codeSi je pouvais demander une fonctionnalité, ce serait de pouvoir choisir certaines variantes, comme un 0 anguleux avec une barre oblique inverse, ou garder le
!dans la ligature!=. On voit ce que je veux dire ici : https://github.com/be5invis/Iosevka/blob/main/doc/stylistic-...https://st.suckless.org/patches/ligatures/
J’utilise la version publiée aujourd’hui, donc ça a peut-être été corrigé récemment
Il faut activer explicitement la case « Show all fonts » pour voir aussi les polices « non monospace »
Sur les systèmes modernes, les polices pour le code pourraient désormais aller au-delà des polices à chasse fixe
Je l’ai déjà recommandé plusieurs fois ici, mais j’utilise Input Sans, une police de codage proportionnelle
https://input.djr.com
Avec cette police, il semble qu’il pourrait être plus difficile de repérer les fautes de frappe
Quand j’utilise Vim en SSH, ça ne me dérange pas de continuer avec une chasse fixe, mais même si Neovim a fait apparaître beaucoup de frontends, il semble que très peu prennent en charge les polices proportionnelles. Et ceux qui le font sont souvent péniblement lents à utiliser
>=par≥? J’ai essayé l’aperçu web sur téléphone, mais c’est peut-être une limitation de Firefox sur AndroidPour référence, les ligatures, c’est ça : https://fonts.google.com/knowledge/glossary/ligature
Je ne comprends toujours pas comment, dans ce genre de polices, le 0 pointé est devenu une sorte de standard. Personnellement, je le confonds toujours avec le 8, et je préfère de loin le 0 barré
S’il existe une variante comme ça, j’aimerais vraiment essayer cette police
Le concepteur de la police pourrait aussi accentuer les côtés convexes du 0 pointé et les côtés concaves du
8pour les distinguer visuellement, mais je ne sais pas si cette police le faitLe texture healing est une idée vraiment astucieuse et élégante
J’aimerais l’essayer aussi pour l’écriture manuscrite chinoise, qui est souvent utilisée en chasse fixe. Des caractères courants mais très denses, en particulier des caractères traditionnels comme
邊鐵餐廳臺藥機麵顧露樓幫讓, gagneraient beaucoup à recevoir de l’espace supplémentaire pour pouvoir s’étaler