8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-05-12

はじめに

QMK Firmwareのマクロ機能を用いることで、あるキーを押下した時に一文を入力することができます。
その際にコードポイントが0xFFFFより上のEmoji(🍺U+1F37Aとか)をMacで入力するには、サロゲートペア入力による一工夫が必要でしたので、その方法を記載します。
20190512_180526.GIF

検証環境

  • 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を切り替えるのは面倒くさいので、ぶっちゃけ今回の記事は実用的でないという……
macOSで16進数入力.png

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入力の参考リンク

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?