40%キーボードを使い始めて1年が経ちました。最初は「レイヤーを覚えられない」「誤字が多い」と苦労しましたが、試行錯誤の末にたどり着いたのは「レイヤーは少ないほど良い」というシンプルな結論でした。
この記事では、1年かけて最適化したQMK設定の全体像を紹介します。レイヤーは定義上3つあるのに、実質2つしか使っていません。その理由と、具体的な設定を公開します。

僕が使っているのは主に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で生成したキーマップの全体像です。
ベースレイヤーの設計

ベースレイヤーで特徴的なのは、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%キーボードの限られたキー数を最大限活用できます。
また、キーマップの中央(スプリット部分)にあるF14とF15は、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にしています。

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つ減らせました。

詳しい実装は別記事で紹介しています。
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との連携

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同時押しの設定です。
dとfを同時押し → IME ON(日本語モード)jとkを同時押し → Escape + IME OFF
VimではjkをEscapeにマッピングする人が多いですが、これにIME OFFを組み合わせることで、ノーマルモードに戻ると同時に英数入力になります。インサートモードで日本語を打って、jkでノーマルモードに戻れば自動で英数。Vimのモードと入力言語が常に同期するので、「あ、日本語モードのままだった」という事故がなくなります。
IdeaVimとの相性
IdeaVimを使うと、JetBrains IDE内でVimキーバインドが使えます。40%キーボード + IdeaVimの組み合わせで、マウスにほとんど触らずにコーディングできるようになりました。
IdeaVim歴8年のエンジニアが辿り着いた.ideavimrc完全設定ガイド【2026年版】開発キーマップは「育てるもの」
1年かけて最適化できたのは、試行錯誤しやすい環境があったから。Lumberjackは前面にリセットボタンがあるので、ケースを開けずにQMKファームウェアを書き込めます。
「キーマップを調整→書き込み→試す」のサイクルがめちゃくちゃ速い。他のキーボードだと裏返してドライバーでケースを開けて…を繰り返すことになるので、この差は大きいです。
最初から完璧を目指さなくていい。違和感があれば直す、を繰り返すうちに、自然と手に馴染むキーマップになっていきます。
まとめ
1年かけて辿り着いた40%キーボードのQMK設定をまとめると:
- レイヤーは少なく: 3つ定義して実質2つしか使わない
- Home Row Modsで修飾キーを節約: A=Ctrl、Z=Shift
- Tapping Termは個別調整: キーの役割に応じて180ms〜200ms
- Sequential Comboで記号入力を効率化:
((→) - 自動IME OFFで誤入力防止: 10秒アイドルで英数モード
- Karabiner + IdeaVimと連携: 3つのツールで完全な開発環境
正直、最初の半年は「これ本当に効率いいのか?」と疑問でした。でも、体が覚えてしまえば、フルキーボードには戻れません。手の移動距離が圧倒的に少ないので、長時間のコーディングでも疲れにくいです。
