40%キーボードのQMK設定を1年かけて最適化した話|レイヤーを減らす設計哲学

ワーク環境

40%キーボードを使い始めて1年が経ちました。最初は「レイヤーを覚えられない」「誤字が多い」と苦労しましたが、試行錯誤の末にたどり着いたのは「レイヤーは少ないほど良い」というシンプルな結論でした。

この記事では、1年かけて最適化したQMK設定の全体像を紹介します。レイヤーは定義上3つあるのに、実質2つしか使っていません。その理由と、具体的な設定を公開します。

筆者が使用している40%キーボードのコレクション。

僕が使っているのは主に2台。数字行ありのLumberjack(48キー)と、数字行なしのCorne v4(42キー)です。Corne v4はアルミ削り出しの高級感あるケースで、持ち運び用としてもお気に入り。どちらも同じキーマップ設計を採用しているので、キーボードを変えても違和感なく使えます。

レイヤーを減らす設計哲学

40%キーボードを使う上で、最大の敵は「レイヤーの迷子」です。3レイヤー、4レイヤーと増やしていくと、「あれ、この記号どのレイヤーだっけ?」と手が止まる瞬間が増えます。

海外のキーボードコミュニティでは、Miryoku layoutのように複数レイヤーを使い分ける設計が人気ですが、僕には合いませんでした。覚えられないし、誤字が増える。

そこで方針を変えました。レイヤーを減らして、代わりにSequential ComboとHome Row Modsでカバーするという設計です。

現在のレイヤー構成

enum layers {
  _QWERTY = 0,   // ベースレイヤー(ほぼここにいる)
  _FUNCTION,     // 記号・矢印(よく使う)
  _NUMBER,       // 数字(ほとんど使わない)
};

レイヤーは3つ定義していますが、実際に使うのは0と1の2つだけ。レイヤー2(NUMBER)は「Cmd+数字」でアプリ切り替えするときにしか使いません。

ポイントはLM(2, MOD_LGUI)というキー。これは「レイヤー2に切り替えつつ、Cmd修飾子を保持する」という意味です。このキーを押しながらQを押すと、レイヤー2の1がCmd付きで送信され、Cmd+1になります。JetBrains IDEではCmd+数字でツールウインドウを切り替えられるので、ホームポジションから手を動かさずにProject(Cmd+1)やTerminal(Cmd+3)を開けます。

Corne(42キー)では数字行がないため、LM_NUMキーの重要度がさらに上がります。親指の内側に配置しているので、数字入力もCmd+数字のショートカットも、すべて親指一つでアクセスできます。

以下がkeymap-drawerで生成したキーマップの全体像です。

Lumberjack 48キーのキーマップ。3レイヤー構成で、ベースレイヤーにはHome Row ModsとDual-Function Keysを配置

ベースレイヤーの設計

Lumberjack 48キー。数字行があるスタンダードな40%キーボード

ベースレイヤーで特徴的なのは、Home Row ModsとDual-Function Keysです。

// Home Row Mods
#define C_A    LCTL_T(KC_A)      // A = Ctrl(ホールド)
#define C_ENT  LCTL_T(KC_ENT)    // Enter = Ctrl(ホールド)
#define S_Z    LSFT_T(KC_Z)      // Z = Shift(ホールド)
#define S_SLSH LSFT_T(KC_SLSH)   // / = Shift(ホールド)

// Dual-Function Keys(親指)
#define A_SPC  LALT_T(KC_SPC)    // Space = Alt(ホールド)
#define G_TAB  LGUI_T(KC_TAB)    // Tab = Cmd(ホールド)
#define L1_BSPC LT(1, KC_BSPC)   // Backspace = Layer1(ホールド)
#define L2_DEL  LT(2, KC_DEL)    // Delete = Layer2(ホールド)

これで、修飾キー専用のキーが不要になります。小指でCtrl、親指でCmd/Alt/レイヤー切り替え。40%キーボードの限られたキー数を最大限活用できます。

また、キーマップの中央(スプリット部分)にあるF14F15は、Karabiner-Elementsでスリープのトリガーとして使っています。普段使わないファンクションキーを物理的に配置しておくことで、ワンタッチでMacをスリープできます。

Tapping Termの細かな調整

Home Row Modsで最も重要なのは、Tapping Term(タップとホールドを区別する時間)の調整です。

海外のガイド(precondition.github.io)によると、一般的に150ms〜220msの範囲で設定する人が多いとのこと。QMKのデフォルトは200msです。

ただ、僕の場合はキーごとに個別調整しています。

uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case S_SLSH:
        case S_Z:
            return 180;  // Shiftは少し短め
        case C_A:
        case C_ENT:
            return 180;  // Ctrlも短め
        default:
            return 200;
    }
}

ShiftとCtrlは180msと短めに設定しています。これらのキーは「ホールドして別のキーを押す」使い方がメインなので、素早く反応してほしいからです。

Hold On Other Key Press

もう一つ重要なのが、get_hold_on_other_key_press関数です。これをtrueにすると、キーを押している間に別のキーが押されると、即座にホールド扱いになります。

bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case A_SPC:
        case G_TAB:
        case A_BSPC:
        case L1_BSPC:
            return true;  // 親指キーは即座にホールド判定
        default:
            return false;
    }
}

ただし、海外のガイドでは「Home Row Modsには使わない方がいい」と明記されています。通常のタイピングではキーが重なる(次のキーを押してから前のキーを離す)ことが多いため、意図しない修飾キー発動が起きるからです。

僕の設定では、親指キー(Space、Tab、Backspace)だけtrueにして、Home Row Mods(A、Z、Enter、/)はfalseにしています。

デスクに置いた40%キーボード。コンパクトなサイズ感がわかる

Sequential Comboでレイヤーを減らす

レイヤーを減らすために実装したのが、Sequential Comboです。これは「2つのキーを素早く順番に押すと別のキーが出る」という仕組み。

static const sequential_combo_entry_t my_combos[] = {
    // かっこ系:開きを2回で閉じ
    {LSFT(KC_9), LSFT(KC_9), LSFT(KC_0)},  // (( → )
    {KC_LCBR, KC_LCBR, KC_RCBR},            // {{ → }
    {KC_LBRC, KC_LBRC, KC_RBRC},            // [[ → ]
    {LSFT(KC_COMM), LSFT(KC_COMM), LSFT(KC_DOT)}, // << → >

    // 記号の組み合わせ
    {KC_DOT, KC_COMM, KC_SCLN},   // ., → ;
    {KC_COMM, KC_DOT, KC_EQL},    // ,. → =
    {KC_COMM, KC_COMM, LSFT(KC_SCLN)}, // ,, → :
    {S_Z, S_SLSH, LSFT(KC_SLSH)}, // z/ → ?
};

これで、記号専用のレイヤーを1つ減らせました。

Sequential Comboで実装したキー配置。開きカッコを2回押すと閉じカッコが出力される

詳しい実装は別記事で紹介しています。

40%キーボードで記号を効率よく打つ工夫ワーク環境

自動IME OFF機能

地味に便利なのが、10秒アイドルで自動的にIMEをOFFにする機能です。

void housekeeping_task_user(void) {
    static bool idle_ime_sent = false;

    if (last_input_activity_elapsed() > 10000) {  // 10秒
        if (!idle_ime_sent) {
            tap_code(KC_LNG2);  // 英数キー(IME OFF)
            idle_ime_sent = true;
        }
    } else {
        idle_ime_sent = false;
    }
}

コードを書いていて、ふと手を止めて考え事をする。その後タイピングを再開すると「あ、日本語モードだった」ということがよくあります。これを防ぐために、10秒操作がなければ自動で英数モードに戻します。

Karabiner + IdeaVimとの連携

Corne v4 アルミケース。数字行がないコンパクトなスプリットキーボード

40%キーボードの設定だけでは完結しません。Karabiner-ElementsとIdeaVimと組み合わせることで、完全な開発環境が完成します。

Karabinerとの役割分担

機能担当
基本的なキー入力QMK(キーボード)
Cmd+hjkl → 矢印キーKarabiner
RSFTでIME切り替えKarabiner
Vim風操作(IDE内)IdeaVim
アプリ固有のショートカットKarabiner

Karabinerでは、Cmd+hjklを矢印キーに変換しています。これでVimに慣れた指でも、どのアプリでも矢印操作ができます。

特に便利なのが、右Shiftを押している間だけIME ON、離すと自動でIME OFFという設定。通常のIME切り替えは「ONにする→入力→OFFにする」の3ステップですが、この設定なら「押しながら入力→離す」の2ステップで完結します。しかも、離せば必ずIME OFFになるので「日本語モードのまま英語を打ってしまった」という事故が起きません。QMKの自動IME OFF機能と組み合わせることで、IME切り替えのストレスがほぼゼロになりました。

もう一つ、Vimユーザーにおすすめなのがdf/jk同時押しの設定です。

  • dfを同時押し → IME ON(日本語モード)
  • jkを同時押し → Escape + IME OFF

VimではjkをEscapeにマッピングする人が多いですが、これにIME OFFを組み合わせることで、ノーマルモードに戻ると同時に英数入力になります。インサートモードで日本語を打って、jkでノーマルモードに戻れば自動で英数。Vimのモードと入力言語が常に同期するので、「あ、日本語モードのままだった」という事故がなくなります。

Karabiner-Elementsユーザーに設定をTypeScriptで書くことを全力でおすすめしたいMac

IdeaVimとの相性

IdeaVimを使うと、JetBrains IDE内でVimキーバインドが使えます。40%キーボード + IdeaVimの組み合わせで、マウスにほとんど触らずにコーディングできるようになりました。

IdeaVim歴8年のエンジニアが辿り着いた.ideavimrc完全設定ガイド【2026年版】開発

キーマップは「育てるもの」

1年かけて最適化できたのは、試行錯誤しやすい環境があったから。Lumberjackは前面にリセットボタンがあるので、ケースを開けずにQMKファームウェアを書き込めます。

「キーマップを調整→書き込み→試す」のサイクルがめちゃくちゃ速い。他のキーボードだと裏返してドライバーでケースを開けて…を繰り返すことになるので、この差は大きいです。

最初から完璧を目指さなくていい。違和感があれば直す、を繰り返すうちに、自然と手に馴染むキーマップになっていきます。

まとめ

1年かけて辿り着いた40%キーボードのQMK設定をまとめると:

  1. レイヤーは少なく: 3つ定義して実質2つしか使わない
  2. Home Row Modsで修飾キーを節約: A=Ctrl、Z=Shift
  3. Tapping Termは個別調整: キーの役割に応じて180ms〜200ms
  4. Sequential Comboで記号入力を効率化: (()
  5. 自動IME OFFで誤入力防止: 10秒アイドルで英数モード
  6. Karabiner + IdeaVimと連携: 3つのツールで完全な開発環境

正直、最初の半年は「これ本当に効率いいのか?」と疑問でした。でも、体が覚えてしまえば、フルキーボードには戻れません。手の移動距離が圧倒的に少ないので、長時間のコーディングでも疲れにくいです。

40%キーボードのコレクション

Thanks for reading!
自作キーボードQMK40%キーボードキーマップLumberjack