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)キーを登録すれば良いです。
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文だけです。
...
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文で範囲指定します。
// どっちを使うかはお好みで
//#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