ZMK firmwareの追加behavior定義

コメントでMod-tap機能を使用するとリピート付きのSpace and Shiftを定義できると教えてもらったので設定テスト。

以下のHold-Tapの説明を参考にして adv360.keymap に定義を追加する。 zmk.dev

behaviors{};の中にsands挙動を追加する。*1

この定義の後、keymap{};の中の狙ったキーの部分を「&sands LEFT_SHIFT SPACE」のように記載する。 最初のキー(LEFT_SHIFT)は長押し時の挙動で2番目のキー(SPACE)は単押し時の挙動なので、Space and Shiftの挙動になる。 behavior定義の際に flavor = "tap-unless-interrupted"; としているので、リピート機能付きになる *2

全体のイメージは以下の通り。

  behaviors {

    sands: space_and_shift {
    compatible = "zmk,behavior-hold-tap";
    label = "SPACE_AND_SHIFT";
    #binding-cells = <2>;
    flavor = "tap-unless-interrupted";
    tapping-term-ms = <200>;
    quick-tap-ms = <125>;
    global-quick-tap;
    bindings = <&kp>, <&kp>;
    };
    
  };

    keymap {
        compatible = "zmk,keymap";

        default_layer {
            bindings = <

       &sands LEFT_SHIFT SPACE
            >;
        };

設定の意味については以下を参考に。 zmk.dev

とりあえずはyamy(窓使いの憂鬱)の以下の設定と似た感じにはできた😊 *3

# Space and Shift
def option delay-of !!! = 5  # 最初のn回のリピートを無視
mod shift += !!!Space  # リピート有り
key ~R-*C-Space = Space
key R-*C-Space = &Ignore

*1: sandsは勝手に付けた名前。後でkeymapの定義の際に使用する

*2: The 'tap-unless-interrupted' flavor triggers a hold behavior only when another key is pressed before tapping-term-ms has expired. It triggers the tap behavior in all other situations.

*3: ZMK firmwareの方で空押しを無視する方法は不明