落ち着きのないレイヤー移動(再現できず？)

タッピングが早漏で、うまく認識してくれない場合、以下の設定をすれば良いようだ。

* [Permissive Hold](#permissive-hold)：タップを押し続けたこととして認識する。
* [Mod tap interrupt](#mod-tap-interrupt)
* [Hold after tap](#hold-after-tap)
* [Retro Tapping](#retro-tapping)

"良いようだ"と言う発言の意図は、私の環境では上手く動いてくれなかったため(勘違いしていたのが原因)。

今回も[config.h](https://qiita.com/chesscommands/items/3f077c63960bf085d4f1#%E3%82%AD%E3%83%BC%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%AB%E3%82%88%E3%82%8Aautoshift%E6%9C%89%E5%8A%B9%E3%82%92%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B "キーの種類によりAutoShift有効を制限する。")を変更する。
「~\qmk_firmware\keyboards\ergodox_ez」ディレクトリ配下にあるのは周知の通り。

#Permissive Hold
タッピング時間前に、他のキー押下にて(下記で言う)Shiftキー押下をしたこととして扱われる。
ただし、押下順序があるため、気をつけなければならない。

> This makes it easier for fast typists to use dual-function keys. Without this, if you let go of a held key inside the tapping term, it won't register.


[SFT_T(KC_A)](https://qiita.com/chesscommands/items/e81b966e4ca791d81987#shift%E3%82%AD%E3%83%BC "タップでShiftキーとの切り替え")を今回例として使う。

1. SFT_T(KC_A)キー押下
1. KC_Z押下
1. KC_Z押上
1. SFT_T(KC_A)キー押上

通常であれば、`az`が入力される。
しかし、今回の設定により、`Z`が入力されるようになる。

```ErgoDoxEZ:config.h
#define PERMISSIVE_HOLD
```

##"再現できない"ことについて。
私が勘違いしていたことが大きな要因だった。
上記通りの手順で行えば、設定されていることが確認できた。
しかし、私がキー操作の順を入れ子にしていたため、上手く動いてくれなかった。
具体的には以下の通り。

1. SFT_T(KC_A)キー押下
1. KC_Z押下
1. SFT_T(KC_A)キー押上
1. KC_Z押上

これでは、`az`が入力されてしまう。
こんな順番を意識しなければ使えないのであれば、使えない設定になる。
（どうしても私はこの使い方をするようで、上手く動いてくれない）
決められた順序通りにタイピングできるのであれば、早漏にはうれしい設定だろう。

##タッピング時間
とりあえず、config.hの`TAPPING_TERM`の値を[500](https://github.com/qmk/qmk_firmware/pull/1359/ "Permissive Hold, and two keymaps #1359")に設定した場合、今回の設定は自動的に割り当てられるようだ。
480と500で挙動を確認できた。
200では、短いため、あまり用をなさない(何より、順番が大事なのがな・・・)。

```ErgoDoxEZ:config.h
#define TAPPING_TERM 500
```

この500の時間で、KC_Aが打てる状態からSHIFTキー押下に変化する。
ちなみに、私が普段使う値は、180にしているが、標準では200が設定されている。

#Mod tap interrupt
これ何？
これを使ったことで[解決した人](https://bouzuya.hatenablog.com/entry/2017/09/09/235959 "QMK の TAPPING_TERM や IGNORE_MOD_TAP_INTERRUPT を雰囲気で触る")がいるようだ。

例えば,[CTL_T(KC_A)](https://qiita.com/chesscommands/items/e81b966e4ca791d81987#control%E3%82%AD%E3%83%BC "タップでCtrlキーとの切り替え")の設定で、KC_A押下直後に、KC_Z押下をした場合、通常のテキストエディタでの挙動は切り取りになるだろう。
しかし、ゲームをしているときに、その挙動では困る。
"A"キーと"Z"キーがゲームに送出されなければ、きっと負けてしまうだろう。
負けないための設定が、今回か？

```ErgoDoxZE:config.h
#define IGNORE_MOD_TAP_INTERRUPT
```

使い方が分からないのは、その挙動を確認できなかったからだが・・・。
押下や押上の順番などは関係なさそうに思う。
Tapping Termを短い時間にしていれば、無駄だと言うことなのかな・・・。逆に、長い時間に設定しても恩恵は受けられないし・・・。
※レイヤー切り替えは対象外で、CTL_Tなどのモディファイアのみに対応しているようだ。

#Hold after tap
2回目のタップで、押下し続けることにする。

1. SFT_T(KC_A)キー押下　←1回目
1. SFT_T(KC_A)キー押上
1. SFT_T(KC_A)キー押下　←2回目
一定時間押し続ける。

1. SFT_T(KC_A)キー押上

もし、今回の設定をしていない場合、2回目の押下で、"A"キーが送信され続けることになる(一定時間押し続けるため)。
テキストエディタに、aの文字が止まることなく入力され続けていることだろう。
今回の設定で、Shiftキー押下として機能することになる。
要は、テキストエディタにaが入力された後は、入力がなされず、Shiftキー押下していることになり・・・。
一応再現できたが、これが何の意味があるのだろう。
Shiftキーを使いたいのであれば、最初に押したままにすれば良いだろうし、Aキーとして使いたいのであれば、タップだけでいいだろうし・・・。

```ErgoDoxZE:config.h
#define TAPPING_FORCE_HOLD
```

メリットが分からない。
また、タップでトグルするキーとかぶってしまうため、注意が必要になる(例えば、TTレイヤーたワンショットタッピングなど)。

#Retro Tapping
タッピング時間(`TAPPING_TERM`)を無視して、タップの挙動が欲しい場合があるだろう。
例えば、`SFT_T(KC_A)`を押し続けた場合、Shiftキー押下になる。
しかし、Aキーが欲しかった場合、どうするのか・・・。
それが今回の設定になる。

```ErgoDoxZE:config.h
#define RETRO_TAPPING
```

1. SFT_T(KC_A)キー押下　←1回目
一定時間押し続ける。
1. SFT_T(KC_A)キー押上

本来であれば、Shiftキーとして動くのだが、今回の設定で、テキストエディタにはaが入力されていることだろう。

先日の[AutoShift](https://qiita.com/chesscommands/items/3f077c63960bf085d4f1 "障害者向けのShiftキー自動押下")と組み合わせれば、完全にSpace&Shift(SandS)になる・・・わけないか。
私はErgoDoxEZを使っているため、不要な設定でどうでもいいからな。

※一定時間押し続けてもキー押上で、Aキーとして動くのだが、それは他のキーを押下しなければと言う前提がある。
一定時間押下時に、Bキーを押せば、大文字のBがエディタに出力されることになる。

※当たり前のことだが、マウスのクリックをしたとしてもキーボードからのキー押下ではないため、今回の場合はAキーが送信されてしまう。要は、意図しない動きをする。



## 再現できない
今回の問題で、今回の設定が反映されない機能がある。
それが、レイヤー切り替えとの組合せ。
レイヤー1のキーに、バックスペースキーを割り当てているのだが、一定時間を経過しようが、バックスペースとして機能して欲しいと思っていた。
他にもレイヤー2のキーに、Escキーを割り当てているため、一定時間を経過しようが、エスケープとして機能して欲しいと思っていた。
しかし、働かないため、どうしようもない。

##C言語の出番
要は、単純に出来るとしか説明していない記事は嘘で、レイヤーで動かしたい場合は、一手間必要だ。
私と同じように設定している人もいるようで、その人はすでに解決済みのようだ。
ゆえに、参考にさせてもらう。
[Add support for RETRO_TAPPING to LT(layer, kc) #2805](https://github.com/qmk/qmk_firmware/pull/2805 "GITHUB#2805")
[Make LT send the keycode if no other key was tapped #1521](https://github.com/qmk/qmk_firmware/issues/1521 "GITHUB#1521")

個人的にGitHUBの使い方を分かっていないのだが、"Files changed"の通りに修正すれば良いと思っている。
合っているよね。
⇒合っていない行動だった。

![Add support for RETRO_TAPPING to LT.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/8d734c1a-5e78-41f5-12a5-a754ac0590c9.jpeg)

この指摘が反映されておらず、そしてソースコードが書き換わっているため、どのように修正すれば良いのか分からない。
取り込まれているようなコメントにも見えるため、どうなっているのか分からない。
う〜ん・・・英語力が無いので、イマイチ解決方法が分からない。
ならば・・・放置。

#ちなみに
ここで勝手に`押上`という言葉を使ったが、理解してくれるだろうか。
`押下`がキーを押すことなので、離す(上げる)ことを想定しているのだが・・・。
そもそも押下とは何ぞや⇒[押下(おうか)にまつわる話](https://qiita.com/yaju/items/0ceb6a0343561b4d208e "押下(おうか)にまつわる話")

そして、今回もHHKBを使って執筆していることは内緒だ。

以上。