打造韩文组合输入不出错的编辑器的方法
用韩文写长文时,有时最后一个音节会消失,或者单词会被拆开。这不是输入错误,而是编辑器在哪里处理组合输入的问题。

# 会以淡色显示,文字则保持标题原有的字号和粗细。用韩语写文章时,常常会遇到一些奇怪的情况。行尾的文字会消失,从其他窗口切回来后,最后一个音节又会被输入两次。有时输入过程中,光标还会移动到意想不到的位置。
一开始很容易认为是自己操作失误。但大多数时候并不是手的问题,而是编辑器没能正确处理韩文的“组合输入”所导致的。
要输入一个韩文字,需要多次按下辅音和元音键。在音节完成之前,它虽然显示在屏幕上,但还不是已经确认的字符。这种状态称为组合输入。
这种状态在英文中很少见,但输入韩语时几乎始终处于组合状态。因此,即使组合输入处理只有一点小问题,对韩语用户来说也会造成很大的不便。
只看公开的问题报告也能发现这一点。Typora 有在 macOS 上输入韩文单词时被拆开的问题(#4251),以及组合输入时光标跳动的问题(#788)。Obsidian 则有在 Ubuntu 上韩文随机遗漏的问题(#79528)、在 Wayland 上无法输入韩文的问题(#84391),以及输入在换行位置被忽略的论坛帖子(#114224)。
应用虽然不同,问题出现的位置却很相似。编辑器都在浏览器引擎之上重新解释组合输入事件。
不把尚未确认的文字放入文档
mote 的 Linux 外壳不会直接解释韩文组合输入。将辅音和元音组合成音节的工作交给操作系统的输入法。
组合中的文字只显示在屏幕上。只有音节确认后,才会进入文档。
仅凭这一项原则,许多问题就消失了。
不会在每次组合输入时都生成撤销记录。自动保存也不会把尚未完成的音节写入文件。Markdown 功能也不会试图修饰尚未确认的文字。
想到自动保存时,这种差异就更加明显。输入韩语时,即使只是短暂停顿,音节也可能仍处于组合状态。如果组合中的文字进入文档,就可能保存下只有一半的音节。按一次撤销,也可能只删除一个字母。
把组合输入留在文档之外,就不需要单独处理这些例外。因为尚未确认的文字还不是文档的一部分。
输入时也不让画面晃动
一开始,我们移除了正在进行组合输入的行中的所有 Markdown 样式。这看起来很安全,却产生了新的问题。
在标题中输入韩文时,那一行会突然缩小到正文的字号。只有输入结束后才会恢复成标题。由于韩语用户在输入时会持续进行组合,行高也会在整个书写过程中不断上下变化。
现在,我们会按照组合中的文字原样位于行内的状态来进行计算。输入标题时,组合中的音节也会保持标题样式。即使在粗体文字内输入,粗细也不会改变。隐藏的 Markdown 符号也不会覆盖组合中的文字。
我们还去掉了显示在组合中文字下方的蓝色下划线。因为在输入韩文的整个过程中,它看起来像是在句子下方不断闪烁。即使没有下划线,组合输入功能也会照常工作。
这不只是简单的视觉效果。即使所有文字都能正确输入,只要行不断晃动,书写的节奏就会被打断。只有画面保持安静,才能专注于句子本身。

** 标记会以灰色显示,其中的“굵게”则保持原有的粗体。不说“支持韩文”,而是确认实际行为
仅仅说“支持韩文”是不够的。
无法知道只要能输入文字就行,还是输入过程中画面也必须保持稳定。也很难确认从其他窗口切回来后,最后一个音节是否不会消失或被输入两次。
因此,mote 把模糊的承诺变成了具体的检查项目。每次发布时,都会在真实输入法和真实画面中直接输入韩文。在 9 种情形下检查 12 项条件,并由脚本将结果保存为文件。最近一次执行通过了全部 12 项条件。
检查项目也不是凭空设想出来的。它们是根据其他编辑器公开的韩文输入问题,以及 mote 中实际可能出现问题的画面制定的。
我们会确认在强调文字中输入时光标是否不会移动。也会检查从其他窗口切回来时,最后一个音节是否恰好只确认一次。还会检查在查找窗口中输入韩文后返回编辑画面的情形。并在表格单元格、列表的下一行和标题中重复相同的过程。
检查内容很具体。例如,在组合音节的过程中按下 Enter 时,完成的音节必须留在第一行,只有新输入的字母应当移到第二行。在组合“한”的过程中按一次 Backspace 时,不应让整个字消失,而应变成“하”。
如果混淆字母和完整字符,就会立即判定失败。

不会声称未经验证的环境也受支持
每次发布时直接验证的环境,是 Linux 外壳中的 X11 与 ibus 组合。
Wayland 和 fcitx5 会在另外 8 种实验环境中确认基本的组合输入行为。但检查范围并不相同。macOS 和 Windows 外壳也仍在开发中。在完成各操作系统输入方式的验证之前,我们不会声称支持它们。
也有一些问题不是 mote 能够修复的。典型例子是输入法每次打开新的输入窗口时都会以英文模式启动。关闭查找窗口并返回编辑画面后,可能需要再次按下韩/英切换键。
这个问题普遍出现在 GTK 应用中,可以在输入法设置里更改。我们不会把不是我们的错误写得像是我们的错误,而是会注明相关设置位于何处。
能输入韩文的编辑器,与适合用韩文写作的编辑器并不相同。
前者能让文字输入进去。后者则能让文章在输入过程中也不晃动。