2021年02月19日

【自キ】QMKのMod Tap Config、完全に理解した

キーボードには、色んな押し方がある。
それらをQMKで制御することができる。
そのオプションを完全に理解したので共有。


大前提:

config.hに以下のものを書き込むことで制御。

#define TAPPING_TERM 200(その他数値。単位はms)

(以下は目的に合うものを組み合わせる)
#define PERMISSIVE_HOLD
#define IGNORE_MOD_TAP_INTERRUPT
#define TAPPING_FORCE_HOLD
#define RETRO_TAPPING

この4つのオプションの何がどう違うのか、
とても分かりにくかったのだが、
整理してみてやっとわかった。


大前提2:

キーを押してから、
TAPPING_TERM(以下TT)内に離すとTAP、
TTを過ぎてから離すとHOLD扱い。

(デフォは200ms。
経験的に、文字をタイピングするときは100くらいでもいいけど、
マクロパッドなどでは考えながらキーを打つので、
100だと意外とTAPとHOLDの区別がシビアだった。
デフォの200msは考えながらの作業には最適値かも)

例: TT 200(デフォルト値)の場合。

SFT_T(KC_A)に設定されたキーをAとすると、
Aを押してから200ms以内に離せばTAPでaが出る。
Aを押してから200ms経ってから離すとシフトキーを押して、
しばらく待って離したのと同じ。

Aを押してる間をーで示すと、

     200ms
      |
Aーーー          a
Aーーーーーーーーーー   Shift押して離す

Bキーと組み合わせた時、
Aーーーーーーーーーーー
B       ーー    Shift+bなのでBが出る

ここまではわかる。
しかしややこしいケースがある。

Aーーー
B  ーーー
のときはどういう挙動?
1. abが出る(ABともに単打扱い。デフォルト)
2. Bが出る(ABが重なってるからシフトがかかる)

Aーーーーーーーーーーー
B  ーー
と、AがHOLDされていたら?
1. abが出る(デフォルト)
2. Bが出る(AはHOLDになってるんだからシフトだろ)
Bは200msより先に離してるぞ?どっち?

Aーーーーーーーー
B       ーー
1. abが出る(Aを先に離してるから)
2. Bが出る(Aがシフトになってるから)
これもどっち?

こうしたややこしいケースに対して、
「こういう風に定める」と、
オプションで制御するのである。
(なお、_PER_KEYでキーごとにオプションを設定できるが、
話がややこしくなるので以下は全キーでの話に限定)


解説:

#define PERMISSIVE_HOLD

これは、TT以内にそれぞれ離したときに、
どう制御するかのオプションである。
      200ms
Aーーーー
B ーー

デフォルトではAはTAPだから、abと出る。
これを、重なってるからシフト優先、とするオプション。
つまりBが出る。

(ちなみに、TTを縮めていくとこの誤打を避けられるか?
TT 0にすると結構快適な処理速度になるので、
「基本HOLD、ほかに何も押さないならTAP」
を、あとの#define RETRO_TAPPING
との組み合わせで実現できます)


#define IGNORE_MOD_TAP_INTERRUPT

Aーーーーーーーーー
B    ーーーーーーーー
と、Aを先に離したとき、AはTAPと定義する。つまりabが出る。
(デフォは重なりがシフトになりBが出る)
以下のTAPPING_FORCE_HOLDと組み合わせとくと、
キーリピートオフでゆっくりタイピングするのに向くと思う。


#define TAPPING_FORCE_HOLD

オートリピートをオフにして、
どんなに押しっぱなしでもシフトを継続する。
デフォだとオートリピートで、
しばらく押してるとaaaaaaaになってしまう。
シフトを押しながら考えてるとたいへんだ。
落ち着いて考えるときはこれを選択したい。
とくにこれは、_PER_KEYで個別に制御したいオプションだね。


#define RETRO_TAPPING

仮にシフトになるほど長押ししてたとしても、
他に何も押さずに離したらTAPに戻す。

Aーーーーーーーーーーー
デフォ: 何も出ない(シフトを押して離しただけ)
これ: aが出る

ただ、「他を何も押さず」には、
そのキーボードのキーしか含まれず、
マウスなどの挙動は含まれない。
僕は「シフトキー押しながらマウスで選択」をやりたくて、
かつシフトキーにも単打で別の役割を持たせたくて、
このオプションを選んでいたが、
マウスクリックはキーボードの挙動ではないため、
クリックしても「他に何も押してない」と認識されてしまい、
長押しの果てにポロッと単打が漏れていた。

こういうときは素直に、

#define TAPPING_TERM 200
#define PERMISSIVE_HOLD
#define TAPPING_FORCE_HOLD

の3行でよかったみたい。
短く押して離した時だけ単打で、短かろうが長押しだろうが、
キーリピートオフのままシフトキー継続、
という設定がこれで実現したよ。



こうした挙動の細かい制御は、
どういう目的で使うかによるよね。

ややこしいのだが、
ようやく理解したよ。
間違ってたら指摘してください。

キーリピートが絡むとさらに場合分けが必要だ。めんどくさいのでオフだよなあ。
posted by おおおかとしひこ at 17:40| Comment(0) | カタナ式 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。