⌨️

キーバインド変更方法の紹介 QMKファームウェア+PowerToys

2025/01/07に公開

🎍あけましておめでとうございます🎍

皆さん、キーバインドへのご関心はありますでしょうか?

私はキーバインドを変更することで業務効率は結構変わると思っている流派です。例えば、こちらの記事などで具体的な効用が語られています。業務効率が上がると聞けば、関心度があがるのではないでしょうか。。!

本題です。
今回はお正月に整理したキーバインドを紹介します。Windowsが対象です。

キーバインドの変更方法

キーバインド変更方法には、大きく3つの方法があると考えています。それぞれファームウェア変更、アプリケーション変更、レジストリ変更です。

  • ファームウェア変更
    キーボード端末のファームウェアを変更する方法で、PC端末に依存せずにキーボードを変更可能です。今回はこの1つであるQMKファームウェアを紹介します。

  • アプリケーション変更
    キーボード変更アプリを使う方法です。最も手軽ですが、端末毎の設定が必要です。PowerToysがMS純正ということでデファクトスタンダードになりつつあります。こちらにも登場しています。私は以前keyhackを使用していました。PowerToysでは既存バインドとユーザ指定バインドを単純にマッピングするだけですが、keyhackではPythonを使用したプログラマブルなキーバインド変更が可能です。

  • レジストリ変更
    レジストリエディタなどでレジストリを変更する方法で、アプリケーション変更よりも下のレイヤでキーバインドを変更可能です。CapsLockキーのバインド変更はアプリケーション変更では対応できず、レジストリ変更をする必要があります。これはCapsLockキーを押下してもボタン押下終了のイベントが発生しないためです。
    ただし、レジストリ変更は非推奨です。変更に失敗するとPCが文鎮化します。レジストリの桁数を間違えて本当に文鎮化した経験があります。

QMKファームウェアとは?

QMK(Quantum Mechanical Keyboard)はファームウェアでキーバインドを変更可能なライブラリです。オープンソースで、以下の特徴があります:

https://github.com/qmk/qmk_firmware

  • なんでもできる:C言語のマイコン開発の要領でプログラマブルにキーバインドが変更可能ですので、基本的にはなんでもできます。例えば、4連打したらCopilotキーと同等な動きをするようにする、一定条件下でJISキーボードにUSキーボード風な記号割り当てを行うなど。。
  • 対応キーボードが多い:有名どころだとNuphyやkeychronでしょう。私はKeychronユーザーで、こちらJIS配列も販売しています。他にも自作キーボードをQMK対応させたり、HHKBをQMK対応させるモジュールが販売されていたりします。
  • 安定している: と思います。

QMKを使用されたい方は、対応キーボードを入手して以下の手順を踏みましょう!

https://docs.qmk.fm/newbs_getting_started

私の場合、WSLでQMKファームウェアをビルドして、WindowsホストでQMK ToolboxというGUIソフトウェアを用いてキーボード(keychron K3 MAX)にフラッシュしています。手順はおおよそ上のリンクの通りです。ビルド環境はこちらのdevcontainerで構築しています。

https://keychron.co.jp/products/keychron-k3-max-qmk-via-wireless-custom-mechanical-keyboard-us-ansi-layout?variant=43273535455403

私のキーバインド設定 (QMKファームウェア+PowerToys)

普段使っているキーバインド設定を紹介します。
前は色々設定していましたが、ほぼHHKBバインドに落ち着いています。。
キーボードの左下のキーをFnに割り当てています。

Fnを小指の付け根で押すことでホームポジションで色々できます。

HHKBバインド

  • Ctrlキー
    • CapsLockCtrlに再割り当て。
  • カーソル移動キー
    • Fn + ;:左矢印
    • Fn + ':右矢印
    • Fn + l:PgUp
    • Fn + .:PgDn
    • Fn + k:Home
    • Fn + ,:End
  • FキーFnキーと数字キーを組み合わせてF1~F12を操作。

HHKBバインド以外

  • カーソル移動キー:
    • Alt + ;:左へ1単語移動
    • Alt + ':右へ1単語移動

1単語移動は、通常はCtrl + 矢印で動作します。しかし、Alt押下時にメニューアクセスが発生し、エディタからFocusが外れてしまうため、Escのイベントを入れてメニューアクセスを無効化しています。

    switch (keycode) {
        // Alt + ; = Esc, Ctrl + Left
        case KC_SCLN: {
            if (record->event.pressed) {
                if ((mod_state & MOD_MASK_ALT)) {
                    clear_mods();
                    register_code(KC_ESC); // Here
                    unregister_code(KC_ESC); // Here
                    set_mods(MOD_MASK_CTRL);
                    register_code(KC_LEFT);
                    set_mods(mod_state);
                    left_registered = true;
                    return false;
                }
            } else {
                if (left_registered) {
                    clear_mods();
                    register_code(KC_ESC); // Here
                    unregister_code(KC_ESC); // Here
                    unregister_code(KC_LEFT);
                    clear_mods();
                    set_mods(mod_state);
                    left_registered = false;
                    return false;
                }
            }
            break;
        }
        // End of Alt + ; = Esc, Ctrl + Left

こういった突飛な処理をほぼ遅延なしで安定的にできるのが、ファームウェア変更によるキーバインド変更のメリットでもあります。keyhackでも可能ですが、QMKのほうが安定している気がします。

  • IMEのオン・オフ設定
    • Alt + f:IMEオフ
    • Alt + j:IMEオン

こちら実は、F14F15を経由させています。Alt + fF14IMEオフという感じです。Alt + fF14はファームウェア変更で対応し、F14IMEオフはPowerToysで行っています。F15も同様です。

なぜこうしたかと言うと、US配列キーボードからIMEオン、オフができなかったからです。Alt + TabなどのIMEトグル操作はできたのですが。。

これらの変更をkeymap.cに反映して、ビルドして、フラッシュしています。

https://github.com/akutsu-kei/qmk_firmware/blob/8dd16355398a2eeca0721b4d2b2693b5eee34510/keyboards/keychron/k3_max/ansi/white/keymaps/my-default/keymap.c

End

以上、キーバインドの変更方法と私のキーバインド設定の紹介でした。QMKファームウェアまでやると非常に柔軟かつ可搬性の高いキーバインド体験が得られます。

自分に合ったキーバインドを作成してみてください!

ヘッドウォータース

Discussion