⌨️QmkUnicode

В этой статье я делюсь моим опытом настройки ввода произвольных символов юникода на QMK под ОС Windows.

Официальное руководство по Unicode: https://beta.docs.qmk.fm/using-qmk/software-features/feature_unicode

Немного предыстории (этот абзац можно пропустить). По работе мне приходится писать на немецком языке. Несколько лет назад я открыл для себя стандартную раскладку QWERTY (International), которая позволяет с небольшими усилиями вводить буквы европейских и не только языков. Например, если ввести " (двойные кавычки) а после них нажать a, o, u, то результатом станут ä, ö, ü. Буква ß вводится нажатием AltGr+S. Недостатком такого подхода является необходимость нажимать пробел после "специальных" символов ( ", ' и других), потому что простое нажатие на них ничего не вводит - система ждёт следующую клавишу чтобы сложить их вместе и написать соответствующий символ из QWERTY (International).

С покупкой правильной клавиатуры я решил попробовать вернуться обратно на обычную QWERTY. Для этого решил создать отдельный слой и повесить в нём на буквы s, a, o, u, е, и, у буквы ß, ä, ö, ü, ё, і, ў. Чтобы заодно и специфическими белорусскими буквами можно было пользоваться.

QMK имеет три метода обработки юникод символов. Для их активации нужно вписать в rules.mk одну из следующих строк:

1. UNICODE_ENABLE = yes

Это позволяет добавлять в раскладку символы через hex-коды: UC(0x40B) — выдаст Ћ, а UC(0x30C4) выдаст ツ.

2. UNICODEMAP_ENABLE = yes

Тут нужно для каждого символа ещё отдельно в keymap.c добавлять маппинг. Выглядеть будет так:

enum unicode_names {
    BANG,
    IRONY,
    SNEK
};
const uint32_t PROGMEM unicode_map[] = {
    [BANG]  = 0x203D,  // ‽
    [IRONY] = 0x2E2E,  // ⸮
    [SNEK]  = 0x1F40D, // 🐍
};

Вызывать символы нужно будет так: X(BANG), X(SNEK) и т.д. У этого варианта есть бонус - можно на одну клавишу повесить, например, строчную и заглавную буквы - будет полноценно работать шифт.

XP(IRONY, SNEK) выдаст ⸮ без шифта и 🐍 с шифтом.

3. UCIS_ENABLE = yes

Эту штуку я не пробовал. Она больше подходит для ввода эмодзи, чем для быстрой печати на иностранном языке. Её суть — создание коротких заранее заданных мнемонических ярлыков. То есть нажал хоткей, ввел rofl, нажал ESC, space или enter - получил смеющуюся рожицу в поле для ввода. Этот метод не имеет смысла в ОС Windows так как там есть намного более удобная встроенная комбинация Win+; или Win+. которая выводит наглядное окно с поиском эмодзи по мере ввода.


Если с методами обработки символов сразу более-менее понятно какой выбрать в зависимости от потребностей, то с методами ввода юникод символов не всё так однозначно. Так как я пользуюсь Windows, то опишу только релевантные для этой ОС методы. Их два и для их активации нужно добавить следующую строчку в файл config.h:

1. #define UNICODE_SELECTED_MODES UC_WIN

Этот метод не рекомендуется разработчиками QMK. Они предупреждают, что он может работать нестабильно. До сих пор единственная нестабильность, что я на нём заметил: ввод некоторых символов не работает в OneNote. Однако в Outlook и Word эти символы вводятся.

Кроме того чтобы его активировать нужно добавить в реестр ключ EnableHexNumpad = 1 в пути HKEY_CURRENT_USER\Control Panel\Input Method. После чего перелогиниться.

При вводе юникод символов не важно какой сейчас язык ввода включён в системе.

2. #define UNICODE_SELECTED_MODES UC_WINC

Этот вариант рекомендуют разработчики. Чтобы он работал нужно повесить в трее приложение WinCompose. Это приложение само по себе неплохое (хотя отчасти дублирует возможности win+;) - позволяет искать и вводить любой юникод символ удерживая Alt и используя мнемонические шорткаты. Например alt+<, 3 даст ♥. Данный метод не работает если у вас включена не английская раскладка. Значит, быстро писать на белорусском или украинском периодически "захватывая" символы из слоя с юникодом не получится - нужно будет переключаться на английский язык каждый раз перед вводом символа юникод.

Ещё нужно упомянуть, что Via не особо дружит со всем вышеописанным. Если сохранить json с раскладкой из Via, а затем попытаться его импортировать обратно, то все юникод клавиши потеряются.

На данный момент я остановился на комбинации
UNICODEMAP_ENABLE = yes
И
#define UNICODE_SELECTED_MODES UC_WIN

Кроме невозможности печатать символы в OneNote и необходимости править реестр я не столкнулся ни с какими ограничениями либо проблемами.

P.S. Мои попытки схитрить и сделать клавишу с запятой и точкой, которая бы работала одинаково и на русской и на английской раскладках потерпели поражение. Такая клавиша вела себя предсказуемо только в блокноте. В любых других программах она вызывала меню или выводила "002," вместо запятой.

Ссылки
https://www.reddit.com/r/olkb/comments/8qn3hl/qmk_how_to_input_altgr_codes_window_710/