ZMKのキーマップは<name>.keymapというDevicetreeファイルで定義する

用語

Stock

  • boardやshieldに定義されたデフォルトのキーマップをstockという
  • zmk-configをセットアップするとユーザコンフィグにコピーされる

Behaviors

  • 特定のキーやセンサ、コンボ等にバインドして、特定のイベントが発火したときに特定のアクションを実行するという動作をbehaviorという
  • behaviorの一覧はここ

Layers

  • 想像の通りのレイヤ、スタックになっていて0がデフォルト
  • デフォルトレイヤは常に有効化されている
  • 特定のバインドによって他のレイヤを有効化/無効化する
  • 有効なレイヤのうち、スタックの最も上のレイヤがアクティブになる
  • アクティブなレイヤは発火したイベントをその位置のbehaviorに渡す
  • behaviorはイベントを消費するか、下位の有効なレイヤに渡す

Behaviorをバインドする

  • behaviorキープレス(&kp)は1つのパラメータをとる
  • Aは生のHIDキーコードを持つ定数
example.keymap
&kp A
  • behaviorモッドタップ(&mt)は2つのパラメータholdtapをとる
example.keymap
&mt LSHIFT D

キーマップファイルを作る

Includes

  • キーマップファイルはたいてい2行インクルードしている
example.keymap
#include <behaviors.dtsi>  
#include <dt-bindings/zmk/keys.h>
  • 1行目は&kpなどの全てのbehaviorを定義している
  • 2行目はAなどの全てのキーコード定数を定義している
  • 他にも#include <dt-bindings/zmk/bt.h>をインクルードすればbluetooth関係の定数が使える

Root Node

  • 全てのノードはルートノード配下に記述する
example.keymap
/ {
    // Everything else goes here!  
};

Keymap Node

  • keymapノードは"zmk,keymap"型を指定する
  • keymapというノード名はなんでもいい
example.keymap
/ {
    keymap {  
        compatible = "zmk,keymap";  
    };
};

Layer Node

  • layerノードはkeymap配下に定義する
  • layer_default等のノード名はなんでもいい
  • 定義順にナンバリングされる
  • display-nameはZMK Studioでの表示に使われる
example.keymap
/ {
    keymap {  
        compatible = "zmk,keymap";  
        layer_default { // Layer 0  
            display-name = "Base";  
            // | Z    | M     | K      |  
            // | MO1  | Space | Return |  
            bindings = <  
                &kp Z &kp M     &kp K  
                &mo 1 &kp SPACE &kp RET
            >;  
        };
        layer_second { // Layer 1
            ...
        };
    };
};