⌨️

Vial-QMKのAuto Mouse LayerでTap Danceを使う

に公開

はじめに

私は今までQMK/ZMKキーボードでTap Danceを使っていませんでした。

一方、普段NapeオリジンのキーにMacのMission ControlとかアプリExposéを割り当てているのですが、これがとても便利なので、cocot38miniで人差しトラボをAuto Mouse Layer(以下AML)操作している時も親指キーでMission ControlとかアプリExposéを割り当てたくなってきました。

私は右手人差し指でトラボ操作しているので、左手親指キーに割り当てたいのですが、左手親指キーは既にCPI変更、スクロール、左クリックに割り当てています。どうしても親指キーに割り当てたいので、スクロールを割り当てているキーをTap Danceにして、tap:Mission Control, double tap:アプリExposé, hold:スクロールに割り当てたいと思い、そのメモを記録して共有したいと思います。

VialでのTap Danceの設定

VialでTap Danceを設定します。
Mission ControlのショートカットはCtrl+Up, アプリExposéはCtrl+Downなので、[On tap], [On double tap]にそれぞれ割り当てます。スクロールはcocot38miniではSCRL_MOなので、それを[On hold]に割り当てます。

登録したTD(0)キーをまずはLayer0の適当なキーに割り当てて動作することを確認しました。

Auto Mouse LayerでTap Danceを使う

続いて、TD(0)をAMLのキーに割り当てて動作確認します。
...[On tap]のMission Controlは動くけど、[On hold], [On double tap]もMission Controlになりました。これはキーを入力した時点でAMLを抜けてしまうからです。

QMKのドキュメントに記述されている通り、AMLから抜けないようにするには、is_mouse_record_kb()またはis_mouse_record_user()でmouse keyに登録する必要があります。Tap Danceの場合、TD(0)キーを登録すれば良いです。

keymap.c
bool is_mouse_record_kb(uint16_t keycode, keyrecord_t* record) {
    switch(keycode) {
        case TD(0):
            return true;
        default:
            break;
    }
    return is_mouse_record_user(keycode, record);
}

これでAMLでTap Danceが動作するようになりました。

全てのTap DanceをAuto Mouse Layerで使えるようにする

QMKのkeycodesはkeycodes.hに定義されています。
Tap DanceはQK_TAP_DANCEからQK_TAP_DANCE_MAXまでです。
同ファイルにはrange helperマクロが定義されているのですが、Tap Danceはswitch文用のhelperは無く、if文だけです。

quantum/keycodes.h
...
    QK_TAP_DANCE                   = 0x5700,
    QK_TAP_DANCE_MAX               = 0x57FF,
...
#define IS_QK_TAP_DANCE(code) ((code) >= QK_TAP_DANCE && (code) <= QK_TAP_DANCE_MAX)

というわけで全てのTap DanceをAMLで使えるようにするには、if文用helperを使うか、switch文で範囲指定します。

keymap.c

// どっちを使うかはお好みで
//#define USE_IF_HELPER

bool is_mouse_record_kb(uint16_t keycode, keyrecord_t* record) {
#ifdef USE_IF_HELPER
    if (IS_QK_TAP_DANCE(keycode) {
        return true;
    }
#endif
    switch(keycode) {
#ifndef USE_IF_HELPER
        case QK_TAP_DANCE ... QK_TAP_DANCE_MAX:
            return true;
#endif
        default:
            break;
    }
    return is_mouse_record_user(keycode, record);
}

まとめ

Vial-QMKのAuto Mouse LayerでTap Danceを使う方法を紹介しました。どなたかの参考になれば幸いです。

Discussion