Irisキーボードを作ってから一週間くらい経ちました。その間、色々と試行錯誤して、ある程度決まってきたので、ここで一回紹介しておこうかと思います。

なお、日頃の入力は全てIrisから行うようにしているので、キーマップ以外は慣れました。小さいは正義。

Ergodox EZから無くなったキーたち

Irisキーボード は、Ergodox EZよりもおよそ20キー弱少ない、54(または56)キーしかありません。また、改めて自分のErgodox EZのキー配列を見直してみた所、ちょうど無くなったキー部分に次のようなものがありました。

少なくともこれらのキーは、今までと別の場所にマッピングしてやる必要があります。

マッピング戦略

さて、マッピングをしないといけないキーは色々ありますが、いくつか個人的に譲れないものとかがあるので、まずはそれをあげていきます。

という感じです。記号類は、Ergodox EZの時点でSYMBOLレイヤーみたいなものを作ってそこで入力するようになっていたので、LOWER/RAISEを利用するとしても変わらないかな、と。

では、これらを考慮して設定していったキーマップを解説していってみます。

レイヤー解説:Default layer

https://github.com/derui/qmk%5Ffirmware/blob/master/keyboards/iris/keymaps/derui/keymap.c#L31

特筆すべき点というのはそんなに無いですが、親指に当たるキーは基本的に Multi Role になっています。同時押しのときと単独でのクリック時の挙動が違う、ということになります。

ここで一番変わっているのは、 m_kanam_eisu です。本来であれば LT() マクロなどを利用するのですが、 LTマクロなどは標準のキーコードなどとしかセットで利用できません 。無変換とかと組み合わせることはできないということです。

ですので、自前で管理しています。こんな感じで。

bool process_record_derui(uint16_t keycode, keyrecord_t *record) {
  static bool enable_layer = false;
  static bool interrupt_in_layer = false;

  if (record->event.pressed) {
    switch(keycode) {
    case M_EISU:
      layer_on(_RAISE);
      update_tri_layer(_LOWER, _RAISE, _ADJUST);
      enable_layer = true;
      interrupt_in_layer = false;
      return false;
      break;
    case M_KANA:
      layer_on(_LOWER);
      update_tri_layer(_LOWER, _RAISE, _ADJUST);
      enable_layer = true;
      interrupt_in_layer = false;
      return false;
      break;
    default:
      if (enable_layer) {
        interrupt_in_layer = true;
      }
      break;
    }
  } else {
    switch(keycode) {
    case M_EISU:
      layer_off(_RAISE);
      update_tri_layer(_LOWER, _RAISE, _ADJUST);

      if (enable_layer && !interrupt_in_layer) {
        /* KC_MHEN equals KC_INT5 */
        layer_off(_HACHIKOUME);
        SEND_STRING(SS_TAP(X_INT5));
        SEND_STRING(SS_TAP(X_LANG2));
        der_init_hk_variables();
      }
      enable_layer = false;
      return false;
      break;
    case M_KANA:
      layer_off(_LOWER);
      update_tri_layer(_LOWER, _RAISE, _ADJUST);

      if (enable_layer && !interrupt_in_layer) {
        /* KC_HENK equals KC_INT4 */
        SEND_STRING(SS_TAP(X_INT4));
        SEND_STRING(SS_TAP(X_LANG1));
        layer_on(_HACHIKOUME);
        der_init_hk_variables();
      }

      enable_layer = false;
      return false;

      break;
    default:
      if (enable_layer) {
        interrupt_in_layer = true;
      }
      break;
    }
  }
  return true;
}

tapping_termなどの恩恵は受けられませんか、これくらいであれば、自前で実装してもまぁなんとかなります。

なお、かな/英数切り替えとレイヤー切り替えが同じキーに割り当たっている都合上、結構いい感じに誤爆するケースもあるので、この辺りはまだ調整の必要があります。

レイヤー解説:LOWER/RAISE layer

LOWER/RAISEは、キーマップをほぼ対象にしているだけなので、合わせて解説します。

https://github.com/derui/qmk%5Ffirmware/blob/master/keyboards/iris/keymaps/derui/keymap.c#L45

基本方針としては、キーが物理的に不足していて入力できない記号類と、Shift+数値に対応する記号を割り当てています。LOWER/RAISEの両方に同じようなものを指定している理由としては、片方の親指だけに不可がかかるのを防ぐためです。

特に右親指は、Shift/Enterを利用するため、時には非常に忙しいです。その親指にさらに不可をかけるのはちょっと厳しいです。また、左の親指もSpaceを担当しているので結構厳しいです。なので、そのとき空いている親指を利用できるように、こうしています。

レイヤー解説:HACHIKOUME layer

https://github.com/derui/qmk%5Ffirmware/blob/master/keyboards/iris/keymaps/derui/keymap.c#L72

蜂蜜小梅配列をハードウェアレベルである程度実現するためのレイヤーです。が、ほぼ実装は 以前書いた記事 と同じです。

キー配列として異なるのは、シフトキーの位置ですが、これはErgodox EZ時点でのEnter/Spaceの位置と合わせるためにこうしています。なお、Irisではどうも.cファイルを分けられない?ようなので、全部1ファイルに収めています。

レイヤー解説:ADJUST layer

https://github.com/derui/qmk%5Ffirmware/blob/master/keyboards/iris/keymaps/derui/keymap.c#L87

最後はADJUSTです。このレイヤーは、LOWERとRAISEの両方を有効にした場合に有効になります。ADJUSTでは、基本的にはmodifierキー(Ctrl/Alt/Shift/GUI)とカーソルキーを配置しています。

カーソルキーとセットにすることで、org-modeでも利用できるし、候補選択とかでも利用できます。結局カーソルキーがないと逆に面倒な場面っていうのも多いので。

また、数字キーもホームポジション付近に来るようにしているので、このレイヤーまでフル活用すると、ほぼほぼホームポジションから指を動かすこと無く入力していくことが出来ます。親指をきついのでそんなにやりませんが・・・。

課題と展望

ある程度入力しやすくはなってきましたが、まだ課題はあります。

特に、蜂蜜小梅配列時とデフォルト時でかな/英数切り替えの位置が異なる、というのが目下一番の悩みです。かなり親指を忙しいので、何らかの代替手段を考えたいところです。

しかし、Ergodox EZのときよりもスペースを有効活用できている感が強く、間違いなくqmk_firmwareの機能を有効利用できています。理想のキーマップを目指す旅路はまだまだ果てがなさそうです。興味を持った方はぜひキーボード/キーマップの沼へどうぞ・・・。

本日は以上です。