Irisキーボード配列の現状
Irisキーボードを作ってから一週間くらい経ちました。その間、色々と試行錯誤して、ある程度決まってきたので、ここで一回紹介しておこうかと思います。 <!–more–> なお、日頃の入力は全てIrisから行うようにしているので、キーマップ以外は慣れました。小さいは正義。 Ergodox EZから無くなったキーたち Irisキーボード は、Ergodox EZよりもおよそ20キー弱少ない、54(または56)キーしかありません。また、改めて自分のErgodox EZのキー配列を見直してみた所、ちょうど無くなったキー部分に次のようなものがありました。 カーソルキー 主に日本語入力中の候補選択とかに、org-modeで多用していました Backspace/Enter 作成の都合上、親指部分のキーに2uのキーを使ったので、単純にbackspace/enterのキーが消えました {}[] の入力 人差し指内側のキーにそれぞれマッピングしていました 少なくともこれらのキーは、今までと別の場所にマッピングしてやる必要があります。 マッピング戦略 さて、マッピングをしないといけないキーは色々ありますが、いくつか個人的に譲れないものとかがあるので、まずはそれをあげていきます。 親指にShiftがある コレだけは譲れない 親指にEnterがある コレも譲れないと言うか、US/JPどっちにしろIrisだとEnterがあるべき場所にキーがそもそもないので・・・ 親指にSpaceがある 元々親指で押してたもんですし。 アルファベット+基本的な記号部分はQwertyから崩さない 別段ずらす必要はないので GUIキーはデフォルトのlayerに必要 タイル型WMを利用している都合上、コレは必須 蜂蜜小梅配列 を利用する Ergodox EZでは一つのレイヤーとして実装していたので 日本語切り替えはワンタッチで 現状維持。手軽に切り替えられることは効率に直結します という感じです。記号類は、Ergodox EZの時点でSYMBOLレイヤーみたいなものを作ってそこで入力するようになっていたので、LOWER/RAISEを利用するとしても変わらないかな、と。 では、これらを考慮して設定していったキーマップを解説していってみます。 レイヤー解説:Default layer https://github.com/derui/qmk_firmware/blob/master/keyboards/iris/keymaps/derui/keymap.c#L31 特筆すべき点というのはそんなに無いですが、親指に当たるキーは基本的に Multi Role になっています。同時押しのときと単独でのクリック時の挙動が違う、ということになります。 SFT_ENT 同時押しでshift、単独でEnterになるようになっています M_EISU M_KANA 単独だとかなと英数の切り替えを行います。切り替えは無変換のキーコードを出すようにしています 同時押しだとLOWER/RAISEに切り替えられます。このキーを2つとも押しっぱなしにすると、ADJUSTになります ここで一番変わっているのは、 m_kana と m_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などの恩恵は受けられませんか、これくらいであれば、自前で実装してもまぁなんとかなります。 ...