自作キーボードで絵文字を含む一文を入力するマクロを組む


はじめに

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も打てます。

keymap.c
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()関数の入力値としては利用できません。

keymap.c
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

keymap.c
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を含む一文を入力することが可能となりました🍺

Emoji入力の参考リンク