Клавиатурная раскладка US-International с поддержкой специальных символов Эсперанто для операционной системы Haiku

Эсперанто — самый популярный из искусственных языков, им пользуются, по разным данным, от 2 до 10 миллионов человек в мире. Операционная система Haiku «из коробки» поддерживает специальную клавиатурную раскладку для Эсперанто, поддерживающую буквы с диактрическими знаками «циркумфлекс» ĝ, ĥ, ĵ, ŝ, ĉ и «кратка» ŭ, которую можно использовать как основную или добавить в переключатель клавиатурных раскладок Keymap Switcher:

Системная клавиатурная раскладка Эсперанто в Haiku

Однако у неё есть один серьёзный недостаток — для ввода букв, которых в Эсперанто нет, (например, q, w, x), требуется нажимать клавишу Option (на Windows-клавиатуре Win):

При нажатой клавише „Option” раскладка позволяет вводить латинские буквы, которых в Эсперанто нет, и другие полезные символы

Увы, будем откровенны, английский язык всё-таки бывает нужен чаще. Поэтому для переписки на Эсперанто пришлось бы ставить две отдельных раскладки, привычную, стандартную US International и Esperanto. А если учесть нужду ещё и в русском языке, количество раскладок становится непомерным, причём одна из них будет использоваться значительно реже остальных.

Для операционной системы Windows решением является бесплатная программа Tajpi, при использовании которой можно просто добавить символ «карет» (^) после буквы, и программа сама превратит её в букву с циркумфлексом или краткой: c+^ превратится в ĉ, g+^ — в ĝ, u+^ — в ŭ, и так далее. Это достаточно удобно, поэтому я решил сделать нечто подобное и в Haiku.

Под Haiku можно сделать полноценный аналог Tajpi — так называемый «input method», то есть специальный плагин к подсистеме обработки пользовательского ввода, отслеживающий последовательности нажатий клавиш и меняющий введённый текст в зависимости от набранной последовательности. Но это задача относительно масштабная, а мне было важно получить решение как можно быстрее, поэтому в качестве эдакого промежуточного решения я остановился на «мёртвых клавишах». Так называются клавиши, которые сами по себе не выводят на экран символы, а модифицируют вид символов, которые будут напечатаны по нажатию следующей клавиши.

«Мёртвые клавиши» были изобретены именно для вывода букв с диактрическими знаками; на механических пишущих машинках «мёртвые клавиши» печатали диактрический знак, но не переводили каретку, (именно поэтому «мёртвые»). Следующая буква печаталась в том же месте, что и уже напечатанный диактрический знак. В результате на бумаге получался оттиск буквы с диактрическим знаком.

Отличие метода «мёртвых клавиш» от метода Tajpi заключается в последовательности действий: в Tajpi сначала надо нажать букву, а потом модификатор; «мёртвые клавиши» сначала ожидают модификатор, а потом букву. Можно сказать, что метод Tajpi ближе к написанию текста от руки, а метод «мёртвых клавиш» — к печати текста на пишущей машинке. Modus operandi Tajpi мне кажется более логичным, но на безрыбье дарёному коту в зубы не смотрят.

Итак, я решил создать клавиатурную раскладку для Haiku на основе US International, но с поддержкой специальных букв Эсперанто при помощи «мёртвых клавиш».

Создание изменённой раскладки

Для начала, я воспользовался командной утилитой keymap и превратил оригинальную раскладку US International в текстовый файл:

Команда, переводящая системную раскладку в текстовый файл, и этот текстовый файл в редакторе

Как видно, текстовый файл состоит из карты клавиш и посылаемых ими сканкодов. Я не собираюсь менять ничего, кроме одного из разделов «мёртвых клавиш», поэтому давайте взглянем сразу на него:

Так выглядит набор букв, которые можно набрать при помощи «мёртвой клавиши» циркумфлекса. Выделенный розовым текст означает, что для включения режима «мёртвой клавиши» нужно зажать клавишу Option и ввести символ «карет», то есть Shift+6; итого одновременно нажимаются два модификатора, Option и Shift.

Поскольку никакие другие буквы, к которым можно добавить знак циркумфлекса, меня не интересуют, я удаляю этот раздел и заменяю его своим. Коды проверяю по программе Character Map:

Программа Character Map, выделена одна из букв алфавита Эсперанто. Название буквы звучит как «Чо» 🙂 Нужный мне код символа находится в самой нижней строчке, после слов UTF-8, надо только отбросить оба \x и добавить в начало 0x.

И да, я помню, что одна из букв — это «u» с диактрическим знаком «кратка», хотя я и помещаю её в раздел «циркумфлекс».

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

В результате текстовый файл раскладки приобретает вот такой вид:

Раздел циркумфлекса содержит только буквы Эсперанто. В первой строке — заглавная «чо» с циркумфлексом, её код, как я показал на предыдущем скриншоте, 0xc488.

Когда редактирование закончено, нужно снова сделать из текстового файла бинарник с раскладкой клавиатуры. Для этого придётся вновь обратиться к командной строке:

Эта команда взяла отредактированный файл раскладки ~/keymap.txt и скомпилировала его в бинарник, который положила по пути /boot/home/config/settings/Keymap/US-Esperanto.

Вообще-то, Haiku ищет клавиатурные раскладки в двух директориях:

  1. /boot/system/data/Keymaps — здесь находятся все системные клавиатурные раскладки, именно отсюда я брал системную раскладку US International в начале;
  2. /boot/home/config/settings/Keymap — здесь пользователь хранит свои собственные, им самим сделанные клавиатурные раскладки.

Обратите внимание, что в первом случае Keymaps во множественном числе, а во втором Keymap в единственном!

Учитывая, что у пользователя всё равно нет прав на запись в системные папки, выбор директории для хранения результата эксперимента очевиден. Проверим, как этот эксперимент завершился?

Проверка результата

В уже знакомой графической утилите Keymap (с большой буквы, в отличие от компилятора/декомпилятора клавиатурных раскладок для командной строки keymap с маленькой) в нижней левой части окна, среди пользовательских раскладок, появилась новая, US-Esperanto. Чтобы переключиться на неё, надо выделить её щелчком мыши. Если нажать одновременно Option и Shift, возможные «мёртвые клавиши» окажутся подсвеченными синим:

Нажатые Option и Shift позволяют включить три разных «мёртвых клавиши»: слева направо — тильду, карет и трему. Две оставшиеся «мёртвые клавиши» включаются без Shift.

И, если открыть текстовый редактор, включить «мёртвую клавишу» карет при помощи Option+Shift+^ и набрать одну из шести изменённых букв в заглавном или в строчном варианте, получим нужный результат:

Во фразе на Эсперанто присутствуют буквы с циркумфлексом (выделены цветом), которые я набрал, не переключаясь с американской раскладки.

Всё работает, ура! Осталось добавить эту раскладку в Keymap Switcher простым перетаскиванием из пользовательского раздела (в самом низу нижнего списка) в верхний список используемых раскладок:

Теперь американская раскладка с поддержкой букв Эсперанто будет основной, а русская — дополнительной. Переключение между ними производится по Ctrl+Shift.

А в следующей части я расскажу, как сделать из этой раскладки пакет для распространения через менеджер пакетов.

Исходный код: https://github.com/ahitech/US_International_Esperanto-keymap/releases