QMK Firmware で英字配列のまま Windows と macOS 両対応の IME のオンオフキーを作る


概要

Keebio の自作キーボードキット Iris を QMK Firmware でカスタマイズして使っています。
macOS では Mac の日本語キーボードのように、左右の親指キーに IME のオン・オフ (LANG1, LANG2) を割り当てることで、トグル無しに快適な日本語切り替えができます。しかし、Windows では英字キーボードに設定するとこれらのキーが認識されないため、仕方なく Ctrl+Space で切り替えるようにしていました。

対処法としては、日本語配列を英字配列風にカスタマイズする方法、AX 配列をインストールする方法など色々あるようですが、今回はなるべく環境をいじらないで実現できる方法として、英字配列でも認識される F12 以降のファンクションキーを LANG1, LANG2 と同時に送信するようにファームウェアの書き換えを行います。

事前準備

QMK Firmware のリポジトリを clone してセットアップを行います。方法は公式のドキュメントをどうぞ。

キーマップを作る

keyboards/keebio/iris/keymaps/default などの元にする設定のディレクトリをコピーし、適当な名前をつけます (本記事では keyboards/keebio/iris/keymaps/ryohey ディレクトリ)

設定方法

コードはこちら
https://github.com/ryohey/qmk_firmware/commit/deb4e582ec660ec692c019bebce798e725b24bc0

keymap.c にカスタムキーコード IMEONIMEOFF を追加し、キーマップに指定します。

keymap.c
enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  LOWER,
  RAISE,
  ADJUST,
  IMEON,
  IMEOFF,
};
keymap.c
#define KC_IMEON IMEON
#define KC_IMEOFF IMEOFF
keymap.c
  [_QWERTY] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     ESC , 1  , 2  , 3  , 4  , 5  ,                6  , 7  , 8  , 9  , 0  ,BSPC,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     TAB , Q  , W  , E  , R  , T  ,                Y  , U  , I  , O  , P  ,    ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     LCTL, A  , S  , D  , F  , G  ,                H  , J  , K  , L  ,SCLN,ENT,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
     LSFT, Z  , X  , C  , V  , B  ,IMEOFF,  IMEON, N  , M  ,COMM,DOT ,SLSH,    ,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                       LGUI,LOWR,SPC ,         RSFT,RASE,RALT
  //                  `----+----+----'        `----+----+----'
  ),

process_record_userIMEONIMEOFF が押されたときに複数のキーコードを送信する処理を追加します。

keymap.c
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case QWERTY:
      if (record->event.pressed) {
        persistent_default_layer_set(1UL<<_QWERTY);
      }
      return false;
      break;
    case LOWER:
      if (record->event.pressed) {
        layer_on(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case RAISE:
      if (record->event.pressed) {
        layer_on(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case ADJUST:
      if (record->event.pressed) {
        layer_on(_ADJUST);
      } else {
        layer_off(_ADJUST);
      }
      return false;
      break;
    case IMEON:
      if (record->event.pressed) {
        register_code(LANG1);
        register_code(F14);
      } else {
        unregister_code(LANG1);
        unregister_code(F14);
      }
      break;
    case IMEOFF:
      if (record->event.pressed) {
        register_code(LANG2);
        register_code(F15);
      } else {
        unregister_code(LANG2);
        unregister_code(F15);
      }
      break;
  }
  return true;
}

Firmware の書き込み

qmk flash --keyboard keebio/iris/rev2 --keymap ryohey --bootloader avrdude

make での書き方

make keebio/iris/rev2:ryohey:avrdude

結果

Windows 側で認識されました。

Windows での設定

IME で F14, F15 に IME の有効化、無効化を設定します。

追記

macOS でターミナルを利用しているときに F13 がなにかのキーとして入力されてしまうので、F14, F15 を使うように変更しました。

追記2

クラムシェルモードで使っていたので気が付かなかったのですが、F14, F15 は画面の明るさを変えるショートカットに割り当てられているようです。F24 まであるので、何にも割り当てられていないキーを探すとよさそうです。