はじめに
QMK Firmwareのマクロ機能を用いることで、あるキーを押下した時に一文を入力することができます。
その際にコードポイントが0xFFFFより上のEmoji(🍺U+1F37A
とか)をMacで入力するには、サロゲートペア入力による一工夫が必要でしたので、その方法を記載します。
検証環境
- OS: macOS Mojave 1O.14.4
- キーボード: Meishi keyboard (@Biacco氏)
準備運動
1. キー押すごとに1つのEmojiを入力する
Meishi keyboardを組み立て、キーを押すごとに1つのEmojiを入力する方法は、下記の記事が丁寧にご説明いただいており分かりやすいです。
新しい令和時代のキーボード (自作キーボード初心者が Meishi で U+32FF [㋿] を入力する話)
2. キーを押すごとに半角英数字の一文を入力する
1キーを押すごとに、半角英数の一文を入力する方法は、下記QMK FirmwareのMacroの項が分かりやすいです。
Macros
SEND_STRING()
関数で任意の半角英数字の一文を送信できます。
3. キーを押すごとに日本語(全角)の一文を入力する
日本語の一文を入力する場合は、send_unicode_hex_string()
関数を利用します。
スペース区切りで一文字ごとにUnicodeのコードポイントを記載します。
コードポイントが0xFFFFの範囲内なら利用できるので、♥U+2665
も打てます。
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT( /* Base */
MEISHI_1, LCTL(KC_X), LCTL(KC_C), LCTL(KC_V) \
),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case MEISHI_1:
if (record->event.pressed) {
// 「はじめまして♥」と入力される。
send_unicode_hex_string("306F 3058 3081 307E 3057 3066 2665");
}
break;
return true;
}
なお上記の方法で実際にMac上で文字を入力するためには、IMEをUnicodeにする必要があります。でもこのマクロのためだけにIMEを切り替えるのは面倒くさいので、ぶっちゃけ今回の記事は実用的でないという……
Emojiを含む一文を入力する
上述の方法で、Emojiを1文字入力する方法や、一文を入力する方法は分かりました。
しかし一文の中にコードポイント5桁以上のEmojiを組み込むにはもう少し工夫が必要です。(Emojiはほとんどが5桁以上です)
先のsend_unicode_hex_string()
関数は、5桁以上のコードポイントに対応しておりません。
また準備運動#1で利用されているキーコードX()
はsend_unicode_hex_string()
関数の入力値としては利用できません。
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case MEISHI_1:
if (record->event.pressed) {
// 「はじめまして🍺」と入力されることを期待するが、実際は「はじめまして」と入力される。
send_unicode_hex_string("306F 3058 3081 307E 3057 3066 1F37A");
}
break;
return true;
}
解決方法として、5桁以上のコードポイントの文字を入力するためには、サロゲートペアによる入力が考えられます。
まずはサロゲートペアを調べます。下記サイトにて変換したい文字を入力し[convert]を押下します。
The Surrogate Pair Calculator etc.
例えば🍺のサロゲートペアは、D83C DF7A
であることが分かります。
MacのUnicode入力では、Optionキーを押しながらサロゲートペアを入力することで1文字のユニコードとなります。
よってQMKのMacroでSS_LALT()
関数を利用することで、Optionキーを押しながらサロゲートペアの文字列を入力を実現します。
Macros#TAP, DOWN and UP
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case MEISHI_1:
if (record->event.pressed) {
// 「はじめまして」と入力
send_unicode_hex_string("306F 3058 3081 307E 3057 3066");
// 「🍺」と入力
SEND_STRING(SS_LALT("D83CDF7A")); // 🍺Beerのサロゲートペア
}
break;
return true;
}
これでコードポイント5桁以上のUnicode入力が可能となり、あらゆるEmojiを含む一文を入力することが可能となりました🍺