Comment créer un éditeur qui ne perturbe pas la composition du coréen
Quand on écrit longuement en coréen, il arrive que la dernière syllabe disparaisse ou qu’un mot se scinde. Ce n’est pas une faute de frappe, mais un problème lié à l’endroit où l’éditeur traite la composition.

# apparaît en grisé, tandis que les caractères conservent la taille et la graisse du titre.Lorsqu’on écrit en coréen, on rencontre parfois des situations étranges. Un caractère disparaît en fin de ligne, et la dernière syllabe est saisie deux fois après être passé dans une autre fenêtre. Il arrive aussi que le curseur se déplace à un endroit inattendu pendant la saisie.
Au début, il est facile de penser que l’on a fait une erreur. Mais, dans la plupart des cas, ce n’est pas un problème de frappe. Cela arrive parce que l’éditeur ne gère pas correctement la « composition » du coréen.
Pour saisir un seul caractère coréen, il faut appuyer plusieurs fois sur des consonnes et des voyelles. Tant que la syllabe n’est pas terminée, elle apparaît à l’écran, mais ne constitue pas encore un caractère confirmé. Cet état s’appelle la composition.
Cet état est rare en anglais, mais lorsque l’on écrit en coréen, on est presque toujours en cours de composition. C’est pourquoi le moindre problème dans le traitement de la composition peut devenir une gêne importante pour les utilisateurs coréens.
Il suffit de consulter les problèmes signalés publiquement pour le constater. Typora présente un problème où les mots coréens sont saisis en étant scindés sous macOS (#4251), ainsi qu’un problème où le caret saute pendant la composition (#788). Obsidian présente un problème où des caractères coréens sont omis de manière aléatoire sous Ubuntu (#79528), un problème empêchant la saisie du coréen sous Wayland (#84391), ainsi qu’un message sur le forum signalant que la saisie est ignorée au point de retour à la ligne (#114224).
Les applications étaient différentes, mais le problème se situait à peu près au même endroit. L’éditeur réinterprétait les événements de composition au-dessus du moteur du navigateur.
Les caractères non confirmés ne sont pas insérés dans le document
Le shell Linux de mote n’interprète pas directement la composition du coréen. Il confie à la méthode de saisie du système d’exploitation la tâche de transformer les consonnes et les voyelles en syllabes.
Les caractères en cours de composition ne sont affichés qu’à l’écran. Ils ne sont insérés dans le document qu’une fois la syllabe confirmée.
Ce seul principe a permis de faire disparaître plusieurs problèmes.
Aucune entrée d’annulation n’est créée à chaque étape de la composition. L’enregistrement automatique n’écrit pas non plus dans le fichier une syllabe qui n’est pas terminée. Et les fonctions Markdown n’essaient pas de mettre en forme des caractères qui ne sont pas encore confirmés.
La différence devient encore plus évidente lorsque l’on pense à l’enregistrement automatique. Pendant la saisie en coréen, une syllabe peut encore être en cours de composition même lors d’une brève pause. Si le caractère en cours de composition était inséré dans le document, une demi-syllabe pourrait être enregistrée. Et une seule pression sur Annuler pourrait ne supprimer qu’un seul jamo.
Lorsque la composition reste en dehors du document, il n’est pas nécessaire de traiter séparément ce genre d’exceptions. Un caractère non confirmé ne fait pas encore partie du document.
L’écran ne bouge pas non plus pendant la saisie
Au début, nous supprimions toute la mise en forme Markdown de la ligne en cours de composition. Cela semblait sûr, mais un nouveau problème est apparu.
Lorsqu’on saisissait du coréen dans un titre, la ligne rétrécissait soudainement pour adopter la taille du corps du texte. Elle ne redevenait un titre qu’une fois la saisie terminée. Comme les utilisateurs coréens composent continuellement des caractères pendant la saisie, la hauteur de la ligne montait et descendait sans cesse pendant qu’ils écrivaient.
Désormais, le calcul est effectué en tenant compte du caractère en cours de composition tel qu’il apparaît dans la ligne. Lorsque l’on saisit un titre, le style du titre est également conservé sur la syllabe en cours de composition. Si l’on saisit du texte à l’intérieur d’un passage en gras, sa graisse ne change pas. Les symboles Markdown masqués ne recouvrent pas non plus le caractère en cours de composition.
Nous avons également supprimé le soulignement bleu qui apparaissait sous le caractère en cours de composition. Il donnait l’impression que le dessous de la phrase clignotait pendant toute la saisie en coréen. La fonction de composition continue de fonctionner de la même manière même sans ce soulignement.
Il ne s’agit pas d’un simple effet visuel. Même si tous les caractères sont correctement saisis, le mouvement incessant de la ligne interrompt le rythme de l’écriture. L’écran doit rester calme pour que l’on puisse se concentrer sur la phrase.

** apparaissent en gris, tandis que le mot « 굵게 » conserve sa graisse.Nous vérifions le comportement réel au lieu de simplement annoncer une « prise en charge du coréen »
Dire simplement « le coréen est pris en charge » ne suffit pas.
Cette affirmation ne permet pas de savoir s’il suffit que les caractères soient saisis ou si l’écran doit aussi rester stable pendant la saisie. Il est également difficile de vérifier si la dernière syllabe ne disparaît pas ou n’est pas insérée deux fois après un passage dans une autre fenêtre.
C’est pourquoi mote a transformé une promesse vague en critères de vérification concrets. À chaque version, nous saisissons directement du coréen avec une véritable méthode de saisie sur un véritable écran. Nous vérifions 12 conditions dans 9 situations, et un script enregistre les résultats dans un fichier. Lors de la dernière exécution, les 12 conditions ont toutes été remplies.
Les critères de vérification n’ont pas non plus été imaginés de toutes pièces. Ils ont été définis à partir des problèmes de saisie du coréen signalés publiquement dans d’autres éditeurs et des écrans où des problèmes pouvaient réellement survenir dans mote.
Nous vérifions que le curseur ne bouge pas lorsque l’on saisit du texte à l’intérieur d’une emphase. Nous vérifions également que la dernière syllabe n’est confirmée qu’une seule fois après un passage dans une autre fenêtre. Nous testons aussi le cas où l’on saisit du coréen dans la fenêtre de recherche avant de revenir à l’écran d’édition. Le même processus est répété dans les cellules de tableaux, sur la ligne suivant une liste et dans les titres.
Les vérifications sont précises. Par exemple, si l’on appuie sur Entrée pendant la composition d’une syllabe, la syllabe terminée doit rester sur la première ligne et seuls les nouveaux jamos saisis doivent passer sur la deuxième ligne. Si l’on appuie une fois sur Retour arrière pendant la composition de « 한 », le caractère entier ne doit pas disparaître : il doit devenir « 하 ».
Toute confusion entre les jamos et les caractères terminés provoque immédiatement un échec.

Nous ne prétendons pas prendre en charge les environnements que nous n’avons pas vérifiés
À chaque version, l’environnement directement vérifié est la combinaison X11 et ibus du shell Linux.
Le fonctionnement élémentaire de la composition sous Wayland et fcitx5 est vérifié dans 8 environnements expérimentaux distincts. Cependant, l’étendue des vérifications n’est pas la même. Les shells macOS et Windows sont eux aussi encore en cours de développement. Nous ne déclarons pas prendre en charge le mode de saisie de chaque système d’exploitation avant d’avoir terminé sa validation.
Il existe également des problèmes que mote ne peut pas corriger. Le fait que la méthode de saisie démarre en mode anglais chaque fois qu’une nouvelle fenêtre de saisie s’ouvre en est un exemple représentatif. Après avoir fermé la fenêtre de recherche et être revenu à l’écran d’édition, il peut être nécessaire d’appuyer de nouveau sur la touche coréen/anglais.
Ce problème est commun aux applications GTK et peut être modifié dans les paramètres de la méthode de saisie. Nous ne présentons pas comme notre bug ce qui n’en est pas un. Nous indiquons plutôt où se trouve le paramètre concerné.
Un éditeur dans lequel on peut saisir du coréen et un éditeur dans lequel il est agréable d’écrire en coréen sont deux choses différentes.
Dans le premier, les caractères sont saisis. Dans le second, le texte ne bouge pas non plus pendant la frappe.