Add the Eucalyn keyboard layout

最近 Iris というキーボードを組み立て使い始めました。

元々 Planck というキーボードを使用しており、素晴らしいキーボードでとても気に入っていたのですがエンド・ゲームを目指すために左右分離型のキーボードに手を出してしまったのでした。

※エンド・ゲームが一体何を指すのかは諸説あり、お金がなくなったときを指すという意見や、はたまた検索をやめた時であるという意見もあります。

私がキーボードを組み立て始めた理由の一つに、より手が疲れないキーボードが欲しいというものがありますが、左右分離型のカラムスタッガード配列である Iris を組み立てたことによりこの点はとても満足のいくものとなりました (現時点では…)。

キーボードの物理的な形状以外に手の負担を少なくする方法としては、指の移動をホームポジションからなるべく崩さないようにする、という方法もあります。より効率よく文字を入力するために様々なキーのレイアウトが考案されており、一般に普及しているレイアウトの QWERTY 以外に Dvorak や Colemak など様々なレイアウトが存在しています。

レイアウトを変えるのは正直慣れるまでまともに文字を打てないんじゃないかという不安が大きいですが、より効率の良い、疲れにくいレイアウトという響きには抗い難い魅力があります。そこでちょっと挑戦してみることにしました!

使用するレイアウト

調べた結果、@eucalyn_ さんの考案された Eucalyn というレイアウトを使ってみることにしました。

Eucalyn レイアウトは、上記リンクで紹介されていますが以下の特徴があります。

  • 日本語のローマ字入力のしやすさを重視している。
  • それでいてショートカットキーとしてよく使われるキーは QWERTY レイアウトと同じ位置に配置してある。

QWERTY レイアウトからの移行のしやすさも考慮されていてすごい。
実際のレイアウトは以下です。

Eucalyn配列について

Eucalyn レイアウトを追加する

追加するにあたって、いきなりレイアウトを変更するのは荒療治的にはいいかもしれませんがしばらくは作業に支障が出てしまうと思うので、好きなタイミングで QWERTY レイアウトと切り替えられるようにしてみます。慣れるまでは仕事では QWERTY レイアウトを、プライベートでは Eucalyn 配列を使う、のように試せればと考えています。

Iris のデフォルトのキーマップを見ると、以下の通り enum とマクロでレイヤーを定義し switch 文でレイヤーを有効化しているみたいです。
それぞれ抜粋してみます。

#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2
#define _ADJUST 3

enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  LOWER,
  RAISE,
  ADJUST,
};
  [_QWERTY] = LAYOUT(
  //┌────────┬────────┬────────┬────────┬────────┬────────┐                          ┌────────┬────────┬────────┬────────┬────────┬────────┐
     KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                               KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC,
  //├────────┼────────┼────────┼────────┼────────┼────────┤                          ├────────┼────────┼────────┼────────┼────────┼────────┤
     KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                               KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSLS,
  //├────────┼────────┼────────┼────────┼────────┼────────┤                          ├────────┼────────┼────────┼────────┼────────┼────────┤
     KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                               KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,
  //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐        ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
     KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_GRV,           KC_DEL,  KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
  //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘        └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
                                    KC_LGUI, LOWER,   KC_ENT,                    KC_SPC,  RAISE,   KC_RALT
                                // └────────┴────────┴────────┘                 └────────┴────────┴────────┘
  ),
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case QWERTY:
      if (record->event.pressed) {
        set_single_persistent_default_layer(_QWERTY);
      }
      return false;
      break;

今回行いたい設定は以下です。

  • Eucalyn レイアウトのレイヤーを定義。
  • Adjust レイヤー (Lower と Raise を同時押し中に有効になるレイヤー) に QWERTY レイヤーと Eucalyn レイヤーを切り替えるキーを設定する。

デフォルトのキーマップを参考に以下のように変更してみました。
※Lower, Raise, Adjust より小さい数値を割り当てるようにする必要があるので注意。

#define _QWERTY 0
#define _EUCALYN 1
#define _LOWER 2
#define _RAISE 3
#define _ADJUST 4

enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  EUCALYN,
  LOWER,
  RAISE,
  ADJUST,
};
  [_QWERTY] = LAYOUT(
  //┌────────┬────────┬────────┬────────┬────────┬────────┐                                      ┌────────┬────────┬────────┬────────┬────────┬────────┐
     KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                                           KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC,
  //├────────┼────────┼────────┼────────┼────────┼────────┤                                      ├────────┼────────┼────────┼────────┼────────┼────────┤
     KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                                           KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSLS,
  //├────────┼────────┼────────┼────────┼────────┼────────┤                                      ├────────┼────────┼────────┼────────┼────────┼────────┤
     KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                                           KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,
  //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐                    ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
     KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_ESC,                       KC_DEL,  KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
  //└────────┴────────┴────────┴───┬────┴────────┴──┬─────┴──┬─────┴─┐                ┌─┴──┬─────┴──┬─────┴────────┴┬───────┴────────┴────────┴────────┘
                                    GUI_T(KC_LANG2), LOWER,   KC_SPC,                  KC_ENT,  RAISE,   ALT_T(KC_LANG1)
                                // └────────────────┴────────┴───────┘                └────────┴────────┴───────────────┘
  ),

  [_EUCALYN] = LAYOUT(
  //┌────────┬────────┬────────┬────────┬────────┬────────┐                                      ┌────────┬────────┬────────┬────────┬────────┬────────┐
     KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                                           KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC,
  //├────────┼────────┼────────┼────────┼────────┼────────┤                                      ├────────┼────────┼────────┼────────┼────────┼────────┤
     KC_TAB,  KC_Q,    KC_W,    KC_COMM, KC_DOT,  KC_SCLN,                                        KC_M,    KC_R,    KC_D,    KC_Y,    KC_P,    KC_BSLS,
  //├────────┼────────┼────────┼────────┼────────┼────────┤                                      ├────────┼────────┼────────┼────────┼────────┼────────┤
     KC_LCTL, KC_A,    KC_O,    KC_E,    KC_I,    KC_U,                                           KC_G,    KC_T,    KC_K,    KC_S,    KC_N,    KC_QUOT,
  //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐                    ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
     KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_F,    KC_ESC,                       KC_DEL,  KC_B,    KC_H,    KC_J,    KC_L,    KC_SLSH, KC_RSFT,
  //└────────┴────────┴────────┴───┬────┴────────┴──┬─────┴──┬─────┴─┐                ┌─┴──┬─────┴──┬─────┴────────┴┬───────┴────────┴────────┴────────┘
                                    GUI_T(KC_LANG2), LOWER,   KC_SPC,                  KC_ENT,  RAISE,   ALT_T(KC_LANG1)
                                // └────────────────┴────────┴───────┘                └────────┴────────┴───────────────┘
  ),
  [_ADJUST] = LAYOUT(
  //┌────────┬────────┬────────┬────────┬────────┬────────┐                          ┌────────┬────────┬────────┬────────┬────────┬────────┐
     _______, _______, _______, _______, _______, _______,                            _______, _______, _______, _______, _______, _______,
  //├────────┼────────┼────────┼────────┼────────┼────────┤                          ├────────┼────────┼────────┼────────┼────────┼────────┤
     _______, _______, _______, _______, _______, _______,                            _______, _______, _______, _______, _______, _______,
  //├────────┼────────┼────────┼────────┼────────┼────────┤                          ├────────┼────────┼────────┼────────┼────────┼────────┤
     _______, _______, _______, _______, QWERTY,  _______,                            _______, EUCALYN, _______, _______, _______, _______,
  //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐        ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
     _______, _______, _______, _______, _______, _______, _______,          _______, _______, _______, _______, _______, _______, _______,
  //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘        └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
                                    _______, _______, _______,                   _______, _______, _______
                                // └────────┴────────┴────────┘                 └────────┴────────┴────────┘
  )

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case QWERTY:
      if (record->event.pressed) {
        set_single_persistent_default_layer(_QWERTY);
      }
      return false;
      break;
    case EUCALYN:
      if (record->event.pressed) {
        set_single_persistent_default_layer(_EUCALYN);
      }
      return false;
      break;

これでうまく切り替えられるようになりました!全体のコードは以下です。

今回は雰囲気でいじってみましたが、詳細は QMK 公式にレイアウトの追加方法や各関数の説明が載っています。例えば set_single_persistent_default_layer() はレイヤーを永続的に設定する関数です。

また、日本語情報は以下のサイトで詳細に解説されております。🙏

感想

この記事も Eucalyn で書いています…と言いたいところですが、この感想の部分だけ書いていますw

まだ全然入力スピードが出ないですが確かにあまりホームポジションから手を動かさずに入力できている気がします!まだまだキーマップに変更したい箇所があるので引き続き模索していきます。

HUNTER×HUNTER モノクロ版 5 (ジャンプコミックスDIGITAL) | 冨樫義博 | 少年マンガ | Kindleストア | Amazon