⌨️

QMKのTap Hold設定したキーでTap対象を長押しする

2024/10/06に公開

QMKファームウェアでは一つのキーに複数の機能を持たせる方法の一つとして、Tap Hold設定がある。例えば、

  • 短く押したとき(Tap)はエスケープの動作
  • 長く押したとき(Hold)は左コントロールの動作

としたいなら、keymap.cのkeymaps配列に LCTL_T(KC_ESC) と書いておけばいい(Mod-Tap)。Remap を使って設定する場合は下図のようにHold/Tapを選択して設定する。

TapなのかHoldなのかの判定はキーを押してから上げるまでの間隔が TAPPING_TERM (デフォルト200ms) 未満かどうかで制御される。

では、Tap Hold設定をしている状況で、Tapで指定したキーの長押しの動作をさせたいならどうすればよいだろう?

自分が遭遇したのは、LT(2, KC_SPC) という設定をしていて、Zoom で一時的にミュートを解除するときのスペース長押しができないという困りごと。

最初はTap Holdの設定を諦めて KC_SPC に変更して回避していたのだが、それだとキー数に対して割り当てられる機能が減ってしまう。

そんな時に公式ドキュメントを読んでいて、Tap-Hold Configuration Options > Quick Tap Termを見つけてTapした直後にHoldの操作をすれば良いことを知った。つまり、LT(2, KC_SPC)と設定したキーだと

  • Tap: KC_SPC↓↑
  • Hold: MO(2)↓

に加え、タターンと続けて操作した場合には

  • Tap, Hold: KC_SPC↓↑, KC_SPC↓

という動作になる。ただし、Tapのキー上げからHoldのキー押しまでの間隔が QUICK_TAP_TERM (デフォルトは TAPPING_TERM と同じ) 未満であることが条件で、間隔が開いている場合には KC_SPC↓↑, MO(2)↓という動作になるので、タターンと軽やかに操作する必要があることに注意。

これを使って、LT(2, KC_SPC)と設定したキーの操作でZoomのミュート解除ができることを確認した(一回目のKC_SPC↑でポッと余計な音がなってしまうのは許容するとして[1])。

脚注
  1. 今回利用したのは長押し自体の再現というよりは、長押しによる入力のオートリピートを再現することを想定した機能なので仕方ない。Tap Danceを使えばよりうまいことできるかもしれないけど調べていない。 ↩︎

Discussion