自作キーボード / QMK / Tap Dance

自作キーボード / QMK / Tap Dance

同一キーを複数回連続操作することで、単独で押した場合とは違う挙動をするように設定する操作。 ダブルタップとか、ダブルクリック、ダブルプレス、2度押しとか表現される場合もある。

機能の有効化

QMKはできあがるバイナリのサイズを縮小するために、デフォルトでこの機能自体がオフになっているようだ。

なのでこれをまず有効化する。

rules.mk というファイルに一筆書く。

TAP_DANCE_ENABLE = yes

同じキーの2回操作

単に2回操作するだけなのにやたらとまどろっこしい記述をしなければいけないのだが、2回操作に関しては単なる定型文である。

まず、その2回操作の操作に対して名前をつける、何でもいいのだが、tap dance の操作なので、自分は TD_HOGEHOGE という名前とした。 これの enum を作るということである。

enum {
  TD_HOGEHOGE = 0,
  TD_PIYOPIYO
};

これに対して tap_dance_actions という名前の配列を作る。 さっき定義した名前をキーにして、そこに ACTION_TAP_DANCE_DOUBLE という名前の定義を入れ込む。

qk_tap_dance_action_t tap_dance_actions[] = {
    [TD_HOGEHOGE] = ACTION_TAP_DANCE_DOUBLE(KC_A, KC_B),
    [TD_PIYOPIYO] = ACTION_TAP_DANCE_DOUBLE(KC_C, KC_D)
};

この例ならば、キー1回押しで a、キー2回押しで b が出力されるようになる。

当然これに設定されたキーは1回目押された場合は次に2回目の待ち受けに入るので 1回目のキーのレスポンスが悪化する。

この定義ができあがったら、後は、キーマップで、どのキーがこの挙動になるかを定義すればよい。

キーマップの部分に、このように定義する。

TD(TD_HOGEHOGE)

非常にまどろっこしくて、はっきり言って設計が終わっていると思う。なぜ、

TDD(KC_A, KC_B)

と書けないのか首をかしげたくなるが、しょうがない。

同じキーの3回操作

2回ができるのならば3回もできる。というか4回でも5回でも何回でも設定が可能になっている。

ここではよくある、括弧の重複設定をやってみる。

設定自体は2度押しと同じだが、設定するところが、ACTION_TAP_DANCE_DOUBLE ではなく、ACTION_TAP_DANCE_FN になっている。

ACTION_TAP_DANCE_DOUBLE は引数にキーそのものを2つ指定したが、FN では関数名を指定する。

どのような関数かというと、このようにする。

void td_lbb(qk_tap_dance_state_t *state, void *user_data) {
    if(state->count == 1){
        SEND_STRING("(");
    }else if(state->count == 2){
        SEND_STRING("{");
    }else if(state->count == 3){
        SEND_STRING("[");
    }
}

名前はなんでもよく、シグネチャはこうなっている。この state に押された回数が入っているっぽく、これで分岐してやればよい。 マッピング後のキーを送出する前の設定とはちょっと書き方が違うので注意が必要である。これは QMK のキーマクロの書き方に準ずるっぽい。

これで、連打する毎に括弧がグレードアップする挙動になる。

keyboard/diy_keyboard/qmk/tap_dance/start.txt · 最終更新: 2021-04-12 00:56 by ore