Как создать редактор, в котором не ломается ввод корейских слогов
Когда долго пишешь на корейском, наступает момент, когда последний слог исчезает или слово разделяется. Это не опечатка, а проблема того, где редактор обрабатывает композицию символов.

# отображается приглушённо, а текст сохраняет размер и насыщенность заголовка.Когда пишешь на корейском, порой сталкиваешься со странными моментами. В конце строки символ исчезает, а после переключения на другое окно и возвращения последний слог вводится дважды. Иногда во время ввода курсор перемещается не туда, куда нужно.
Сначала легко подумать, что это твоя ошибка. Но чаще всего дело не в руках. Такое происходит потому, что редактор неправильно обрабатывает «композицию» корейских символов.
Чтобы ввести один корейский символ, нужно несколько раз нажать клавиши с согласными и гласными. Пока слог не завершён, он виден на экране, но ещё не является подтверждённым символом. Это состояние называется композицией.
В английском такое состояние встречается редко, но при письме на корейском композиция происходит почти постоянно. Поэтому даже небольшая проблема с её обработкой доставляет корейским пользователям серьёзные неудобства.
Достаточно взглянуть на открытые отчёты о проблемах. В Typora есть проблема с разделением корейских слов при вводе в macOS (#4251) и проблема со скачками каретки во время композиции (#788). В Obsidian есть проблема со случайным пропуском корейских символов в Ubuntu (#79528), проблема с невозможностью ввода на корейском в Wayland (#84391), а также сообщение на форуме о том, что ввод игнорируется в точке переноса строки (#114224).
Приложения были разными, но место возникновения проблемы было примерно одним и тем же. Редактор заново интерпретировал события композиции поверх браузерного движка.
Мы не вставляем неподтверждённые символы в документ
Оболочка mote для Linux не интерпретирует композицию корейских символов самостоятельно. Формирование слога из согласных и гласных поручено системному методу ввода.
Символы в процессе композиции отображаются только на экране. Они попадают в документ лишь после подтверждения слога.
Благодаря одному этому принципу исчезло сразу несколько проблем.
При каждом шаге композиции не создаётся запись в истории отмены. Автосохранение не записывает в файл незавершённые слоги. А функции Markdown не пытаются оформлять ещё не подтверждённые символы.
Если подумать об автосохранении, разница становится ещё очевиднее. Во время ввода на корейском слог может находиться в процессе композиции даже в тот краткий момент, когда пользователь остановился. Если символ в процессе композиции попадает в документ, может сохраниться половина слога. А после одного нажатия кнопки отмены может удалиться лишь одна буква джамо.
Если оставить композицию за пределами документа, обрабатывать такие исключения отдельно не нужно. Ведь неподтверждённый символ — это ещё не часть документа.
Экран остаётся неподвижным даже во время ввода
Поначалу мы убирали всё оформление Markdown из строки, в которой шла композиция. Это казалось безопасным, но породило новую проблему.
При вводе корейского текста в заголовке строка внезапно уменьшалась до размера основного текста. Она снова становилась заголовком лишь после завершения ввода. Поскольку пользователь корейского языка почти постоянно вводит текст в режиме композиции, высота строки всё время менялась, пока он писал.
Теперь мы рассчитываем отображение так, словно символ в процессе композиции уже находится внутри строки. При вводе заголовка стиль заголовка сохраняется и для слога в процессе композиции. При вводе внутри жирного текста насыщенность тоже не меняется. Скрытые символы Markdown также не перекрывают символ в процессе композиции.
Мы убрали и синее подчёркивание, которое отображалось под символом в процессе композиции. Оно создавало впечатление, будто во время письма на корейском строка под предложением постоянно мигает. Функция композиции продолжает работать и без подчёркивания.
Это не просто визуальный эффект. Даже если все символы вводятся правильно, постоянное дрожание строки нарушает процесс письма. Чтобы сосредоточиться на предложении, нужен спокойный экран.

** отображаются серым, а находящееся между ними слово «굵게» сохраняет жирное начертание.Вместо слов «поддерживает корейский» мы проверяем реальное поведение
Одних слов «поддерживает корейский» недостаточно.
Непонятно, достаточно ли просто вводить символы или экран должен оставаться стабильным и во время ввода. Также трудно проверить, не исчезает ли последний слог и не вводится ли он дважды после переключения на другое окно и возвращения.
Поэтому mote превратил расплывчатое обещание в конкретный список проверок. При каждом выпуске мы вручную вводим корейский текст с помощью реального метода ввода на реальном экране. Мы проверяем 12 условий в 9 ситуациях, а скрипт сохраняет результаты в файл. При последнем запуске были пройдены все 12 условий.
Пункты проверки тоже не были придуманы из головы. Мы определили их на основе открытых проблем с вводом корейского текста в других редакторах и экранов, на которых реальные проблемы могут возникнуть в mote.
Мы проверяем, не перемещается ли курсор при вводе внутри выделения. Также смотрим, подтверждается ли последний слог ровно один раз после переключения на другое окно и возвращения. Проверяется и ситуация, когда после ввода корейского текста в окне поиска пользователь возвращается на экран редактирования. Тот же процесс повторяется в ячейках таблицы, в строке после списка и в заголовке.
Проверки конкретны. Например, если нажать Enter во время композиции слога, завершённый слог должен остаться в первой строке, а во вторую должны перейти только вновь введённые джамо. Если один раз нажать Backspace во время композиции слога «한», он должен превратиться в «하», а не исчезнуть целиком.
Если перепутать джамо и завершённый символ, проверка сразу завершается неудачей.

Мы не заявляем о поддержке непроверенных сред
При каждом выпуске мы вручную проверяем оболочку для Linux в сочетании X11 и ibus.
Базовая работа композиции в Wayland и fcitx5 проверяется в восьми отдельных экспериментальных средах. Но объём проверок там отличается. Оболочки для macOS и Windows тоже пока находятся в разработке. Мы не заявляем о поддержке способа ввода каждой операционной системы до завершения его проверки.
Есть и проблемы, которые mote не может исправить. Характерный пример — поведение, при котором метод ввода открывает каждое новое поле в режиме английского языка. После закрытия окна поиска и возвращения на экран редактирования может потребоваться снова нажать клавишу переключения между корейским и английским языками.
Эта проблема встречается во всех приложениях GTK, и её можно исправить в настройках метода ввода. Мы не описываем чужую ошибку как нашу. Вместо этого мы указываем, где находится соответствующая настройка.
Редактор, в котором можно вводить корейский текст, и редактор, в котором удобно писать на корейском, — не одно и то же.
В первом символы просто появляются на экране. Во втором текст не дрожит даже во время набора.