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

# はじめに
QMK Firmwareのマクロ機能を用いることで、あるキーを押下した時に一文を入力することができます。
その際にコードポイントが0xFFFFより上のEmoji（🍺`U+1F37A`とか）をMacで入力するには、サロゲートペア入力による一工夫が必要でしたので、その方法を記載します。
![20190512_180526.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119348/689ebe86-c56d-a7f4-4fd1-17a6a3e777eb.gif)

# 検証環境
- OS: macOS Mojave 1O.14.4
- キーボード: Meishi keyboard (@Biacco氏)

# 準備運動
### 1. キー押すごとに1つのEmojiを入力する
Meishi keyboardを組み立て、キーを押すごとに1つのEmojiを入力する方法は、下記の記事が丁寧にご説明いただいており分かりやすいです。
[新しい令和時代のキーボード (自作キーボード初心者が Meishi で U+32FF [㋿] を入力する話)](https://qiita.com/kitakitash/items/ead550a19533f00bcb7d)

### ２. キーを押すごとに半角英数字の一文を入力する
1キーを押すごとに、半角英数の一文を入力する方法は、下記QMK FirmwareのMacroの項が分かりやすいです。
[Macros](https://docs.qmk.fm/#/feature_macros)
`SEND_STRING（）`関数で任意の半角英数字の一文を送信できます。

### 3. キーを押すごとに日本語（全角）の一文を入力する
日本語の一文を入力する場合は、`send_unicode_hex_string（）`関数を利用します。
スペース区切りで一文字ごとにUnicodeのコードポイントを記載します。
コードポイントが0xFFFFの範囲内なら利用できるので、♥`U+2665`も打てます。

```c: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を切り替えるのは面倒くさいので、~~ぶっちゃけ今回の記事は実用的でないという……~~
<img width="736" alt="macOSで16進数入力.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119348/1319e632-bd40-5c38-7942-d933b0ccff37.png">

# Emojiを含む一文を入力する
上述の方法で、Emojiを1文字入力する方法や、一文を入力する方法は分かりました。
しかし一文の中にコードポイント5桁以上のEmojiを組み込むにはもう少し工夫が必要です。（Emojiはほとんどが5桁以上です）

先の`send_unicode_hex_string（）`関数は、5桁以上のコードポイントに対応しておりません。
また[準備運動#1](https://qiita.com/suzunashi/items/173eacd7ac0dc9e158de#1-%E3%82%AD%E3%83%BC%E6%8A%BC%E3%81%99%E3%81%94%E3%81%A8%E3%81%AB1%E3%81%A4%E3%81%AEemoji%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B)で利用されているキーコード`X()`は`send_unicode_hex_string（）`関数の入力値としては利用できません。

```c: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.](http://www.russellcottrell.com/greek/utilities/SurrogatePairCalculator.htm)
例えば🍺のサロゲートペアは、`D83C DF7A`であることが分かります。

MacのUnicode入力では、Optionキーを押しながらサロゲートペアを入力することで1文字のユニコードとなります。

よってQMKのMacroで`SS_LALT()`関数を利用することで、Optionキーを押しながらサロゲートペアの文字列を入力を実現します。
[Macros#TAP, DOWN and UP](https://docs.qmk.fm/#/feature_macros?id=tap-down-and-up)

```c: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入力の参考リンク
- [新しい令和時代のキーボード (自作キーボード初心者が Meishi で U+32FF [㋿] を入力する話)](https://qiita.com/kitakitash/items/ead550a19533f00bcb7d)
- [💥🍣emojiキーを設定しよう🍣💥](https://qiita.com/miyaoka/items/969864e5219349f01be3)