キーボードを使っていると、「よく使うキーが遠い」「レイヤー切り替えが面倒」「日本語入力と英数入力の切り替えで手が止まる」と感じることがあります。
そこで今回は、QMK Firmwareを使ってキー配列を変更し、実際の作業で使い勝手を検証しました。結論から言うと、すべてのキーを大きく変えるよりも、カーソル移動・レイヤー切り替え・日本語入力切り替えの3点に絞って変更する方が、慣れるまでの負担が小さく効果を実感しやすいと感じました。
今回変更したキー配列
普段の作業では、エディタ、ターミナル、ブラウザを行き来します。特に使用頻度が高かったのは次の操作です。
- 矢印キーによるカーソル移動
- Home / End
- Backspace / Delete
- 日本語入力と英数入力の切り替え
- コピー、貼り付け、保存
これらをホームポジション付近で実行できるように、通常レイヤーとファンクションレイヤーを分けました。
通常レイヤーではアルファベット入力を優先し、左手親指のキーを押している間だけ、右手側をカーソル操作用のレイヤーとして使います。
イメージは次の通りです。
通常レイヤー:
[ Q ][ W ][ E ][ R ][ T ] [ Y ][ U ][ I ][ O ][ P ]
[ A ][ S ][ D ][ F ][ G ] [ H ][ J ][ K ][ L ][ ; ]
[ Z ][ X ][ C ][ V ][ B ] [ N ][ M ][ , ][ . ][ / ]
カーソルレイヤー:
[ ][ ][ ][ ][ ] [ ][ ][ ↑ ][ ][ ]
[ ][ ][ ][ ][ ] [ ← ][ ↓ ][ → ][ ][ ]
[ ][ ][ ][ ][ ] [Home][End ][Del][ ][ ]
キー位置はキーボードの配列や利き手によって調整してください。重要なのは、無理なく指を移動できる位置に操作を集めることです。
QMKの環境を用意する
QMK Firmwareを取得して、キーマップのディレクトリを確認します。すでにQMKの環境がある場合は、この手順は不要です。
git clone https://github.com/qmk/qmk_firmware.git
cd qmk_firmware
python -m pip install qmk
qmk setup
キーボード名を確認するには、次のコマンドを使います。
qmk list-keyboards
今回の例では、キーボード名を my_keyboard、キーマップ名を kyo とします。実際には利用しているキーボードの名前に置き換えてください。
qmk new-keymap -kb my_keyboard -km kyo
生成されたディレクトリに keymap.c が作成されます。
なお、QMK対応キーボードでも、マイコンやレイアウトによって設定内容が異なります。最初にキーボードの公式ドキュメントを確認し、書き込み対象のキーボード名を間違えないようにしました。
keymap.cでレイヤーを定義する
QMKでキー配列を変更して検証するまでの流れを図にすると次の通りです。
まず、レイヤー名を定義します。通常レイヤーを BASE、カーソル操作用を NAV としました。
enum layers {
BASE,
NAV
};
次に、キーコードを定義します。QMKには標準で多くのキーコードが用意されています。
#define NAV_SPC MO(NAV)
MO(NAV) は、キーを押している間だけ NAV レイヤーを有効にするキーコードです。
シンプルな配列の例は次のようになります。
#include QMK_KEYBOARD_H
enum layers {
BASE,
NAV
};
#define NAV_SPC MO(NAV)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T,
KC_A, KC_S, KC_D, KC_F, KC_G,
KC_Z, KC_X, KC_C, KC_V, KC_B,
KC_LCTL, KC_LALT, NAV_SPC, KC_SPC, KC_ENT
),
[NAV] = LAYOUT(
_______, _______, _______, _______, _______,
_______, _______, KC_UP, _______, _______,
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______,
_______, _______, _______, _______, _______
)
};
ここで使っている LAYOUT の引数やキー数は、キーボードごとに異なります。このコードをそのまま貼り付けるのではなく、対象キーボードの既存キーマップに合わせて調整します。
_______ は、そのレイヤーでは下のレイヤーのキーを使う指定です。つまり、カーソルレイヤーで定義していないキーは、通常レイヤーの動作になります。
日本語入力切り替えを追加する
日本語入力の切り替えは、OSや設定によってキーコードが異なります。Windowsでは、環境によって KC_LANG1、KC_LANG2、またはIME関連のキーコードを使います。
私の環境では、左右の親指付近に英数とかなを割り当てました。
#define IME_ON KC_LANG1
#define IME_OFF KC_LANG2
配列には次のように記述します。
[BASE] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T,
KC_A, KC_S, KC_D, KC_F, KC_G,
KC_Z, KC_X, KC_C, KC_V, KC_B,
KC_LCTL, IME_OFF, NAV_SPC, KC_SPC, IME_ON
),
OS側のキーボード設定によっては、これらのキーコードが期待どおりに動かない場合があります。その場合は、まずQMKのキーテスターやOSのキーボード設定画面で、キー入力が正しく認識されているか確認します。
入力切り替えが不安定な場合は、QMKだけで解決しようとせず、OS側のショートカット設定も確認するのがポイントです。
コンパイルと書き込み
キーマップを作成したら、まずコンパイルします。
qmk compile -kb my_keyboard -km kyo
成功すると、キーボード用のファームウェアファイルが生成されます。
続いて書き込みを実行します。
qmk flash -kb my_keyboard -km kyo
キーボードによっては、コマンドを実行した後にリセットボタンを押す必要があります。また、書き込み中にUSBケーブルを抜くと復旧作業が必要になる場合があるため、書き込みが完了するまで操作しないようにしました。
最初から大きく配列を変えるのではなく、次のような小さな変更から始めると安全です。
[BASE] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T,
KC_A, KC_S, KC_D, KC_F, KC_G,
KC_Z, KC_X, KC_C, KC_V, KC_B,
KC_LCTL, KC_LALT, KC_SPC, KC_ENT, KC_BSPC
),
一度に複数の変更を入れると、どの変更が使いにくかったのか分からなくなります。私は、最初にレイヤーだけ追加し、その後に入力切り替えキーを追加しました。
実際の検証で分かったこと
変更後は、普段のコード編集、文章入力、ターミナル操作で使い心地を確認しました。
まず、矢印キーをホームポジション付近に移したことで、カーソル移動のたびに手を大きく動かす場面が減りました。特に短いコードの修正や文章中の一文字移動では、レイヤーキーを押しながら操作する流れが自然でした。
一方で、レイヤーキーを押し続ける操作には慣れが必要でした。最初のうちは、レイヤーキーを押したままカーソルキーを押すつもりが、通常レイヤーの文字を入力してしまうこともありました。
また、矢印キーを独自配置すると、既存の物理キー配置に慣れているアプリケーションでは混乱します。特にゲームやリモートデスクトップなど、別のキーマップを前提にした操作では、通常の矢印キーを残しておく方が便利です。
このため、最終的には次の方針にしました。
- よく使うカーソル操作はレイヤーに集約する
- 既存の矢印キーは完全には削除しない
- 日本語入力切り替えは親指で押せる位置に置く
- 変更内容を一度に増やしすぎない
- 数日使ってから次の変更を判断する
生産性については、作業時間を厳密に計測したわけではありません。ただ、手の移動を減らせる場面が増えたことで、操作の中断が少なくなった感覚はありました。特に、エディタ上での細かいカーソル移動と入力切り替えは、変更の効果を感じやすい部分でした。
まとめ
QMKでキー配列をカスタマイズすると、キーボードを買い替えなくても、自分の作業に合わせて操作方法を調整できます。
今回試した中では、次の3つが効果を感じやすい変更でした。
- レイヤーによるカーソル操作
- 親指付近への日本語入力切り替え
- よく使うキーだけを段階的に移動する
ただし、配列変更は一度にやりすぎると学習コストが高くなります。まずは1つのレイヤーを追加し、コンパイル、書き込み、数日間の使用を繰り返す方法がおすすめです。
QMKの魅力は、キー配置を固定されたものとして使うのではなく、自分の手や作業内容に合わせて育てられることだと思います。まずは MO(NAV) で小さなレイヤーを作り、毎日何度も使う操作から見直してみてください。