個性のあるタップ時間の設定方法

[過去](e81b966e4ca791d81987#ctl_t関数の自前作成)に、コントールキーとエンターキーの組み合わせ自作関数を作ろうとしたことがあった。
しかし、複雑で挫折した。

自作する目的は、他の組み合わせは90ミリ秒程度のタップ時間で操作したいが、上記の組み合わせは60〜70ミリ秒あたりに設定したかった。
エンターキー押下だけは短い時間に設定しなければ、コントールキーを瞬間的に使えない。
そのため、`TAPPING_TERM`をより低い値に設定し、`PERMISSIVE_HOLD`を有効にするならば、問題を低減できそうに感じるが、押下速度に依存するため、受け入れ難い。
そして、個別設定ができない・・・と思っていた。

結論は`get_tapping_term`関数を使うことで、タッピング時間を個別に変更することが可能になる。
自作すら必要なくなる。

素晴らしい。




















# 関数にキーコードを設定するだけ
[カスタムタッピング時間](https://docs.qmk.fm/#/custom_quantum_functions?id=custom-tapping-term)を使うための準備はたいして不要だ。
既存のソースファイルに、少し追加するだけで完了するからだ。

## config.h
下記を新規に追加するだけで終わる。

```c:config.h
#define TAPPING_TERM_PER_KEY
```

簡単でしょ？
もちろん、`#define TAPPING_TERM 90`は、必要なままだ。
※時間は任意で。


## keymap.c
仮に、`CTL_T(KC_ENTER)`の挙動を`TAPPING_TERM`時間に加えて、300ミリ秒を追加するとしよう。

以下のコードそのもの。

```c:keymap.c
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
	switch (keycode) {
		case CTL_T(KC_ENTER):
			return TAPPING_TERM + 300; // 390ミリ秒(極端な例)
		case LGUI_T(KC_ENTER):
			return 39; // 高橋名人以上の素早さが必要(これも極端な例)
		default:
			return TAPPING_TERM; // 90ミリ秒
	}
}
```

上記の他に、`LGUI_T(KC_ENTER)`は、39ミリ秒を設定している。これは、無茶苦茶尋常ならざるほどの速度でタップしなければEnterキーが動かない時間設定になる。


## キーコードの設定
当たり前だが、上記で設定した`CTL_T(KC_ENTER)`などを実際のキーコードとして使わなければ意味がない。
（以下、大分省略したキーマップ）

```c:keymap.c
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 * |Ctrl/Ent|      |      |      |      |      |      |      |      |      |      |      |
 * `-----------------------------------------------------------------------------------'
 */
[BASE] = LAYOUT_planck_grid(
	CTL_T(KC_ENTER),・・・,・・・,・・・　・・・
```

後はよしなに。














ここまでがタップ時間の設定方法だ。
以下、ソースコード最新化について。




















# Gitコマンド
わざわざここのページで記載する理由は、今回の件でGithubでのCloneしたソースコードを最新化できなかったため、備忘録として残すのが目的になる。

ドキュメントの[Updating your master branch](https://docs.qmk.fm/#/newbs_best_practices?id=updating-your-master-branch)を参照することで、最新化できた。

ちなみに、この**docs.qmk.fm**は、[githubリポジトリ](https://github.com/qmk/qmk_firmware/tree/master/docs)から生成されるため、[どちら](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_best_practices.md#updating-your-master-branch)を参照しても問題ない。
同期がとれている・・・と言うより、githubから引っ張ってきているとのこと(Redditからの情報)。

## [get_tapping_term](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action_tapping.c#L23)関数
自分のキーマッピングを確認するが、全く反映されず、にっちもさっちもいかず、かなり困った。
掲示板で助けを求めるが、サンプルコードのようにdefine値を追加するだけで使えるようになるという返事だけで終わってしまった。
しかし、リモート上のソースコードを確認したら明らかに私のローカル上のソースコードと全面的なプログラムが異なっていた。
そのため、ローカル環境を最新化する必要に迫られた。


## Git
どうやらクローンした場合、クローン元で変更が行われたときもそれはクローン先に反映されないようだ。
クローンという名前をやめて、`コピー`の文言を使って欲しいよ。

<img width="203" alt="ぷるぷる.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/f917f18e-790c-7950-e80a-d773727426ce.jpeg">

`プル`で最新版を取得できると思い込んでいたのは内緒だ。

## 結論
以下のコマンドの打ち込みで何とか最新化にこぎつけた。

![コマンド状況.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/2cc568c7-ad8e-b79d-ffe8-fe0f5ebf4baa.jpeg)

※見やすいように画像を加工済み。

## 現在のフォーク元を取得([add](http://www-creators.com/archives/4939))
最新のFork元を自分のリモート先に追加する。

```bash:コマンドプロンプト
git remote add root_branch https://github.com/qmk/qmk_firmware.git
```

ちょっとした[コマンド](https://git-scm.com/book/ja/v2/Git-の基本-リモートでの作業)なのに、理解できないほど複雑に思える。

## 現在の状態と比較([fetch](https://backlog.com/ja/git-tutorial/stepup/15/))
先ほど取得した最新版のForkと自分のリポジトリを比較する。

```bash:コマンドプロンプト
git fetch root_branch
```

## Tag付け
特に作業として必要ないのだが、一応の記録付けと言うことで、Tagを追加することにした。

```bash:コマンドプロンプト
git tag 'forkGet'
git tag -a 'forkGet' -m 'fork元取得(最新化)'
```

1行目は、Tagそのものの作成なので、一度実行すれば、二度目は不要だ。
2行目は、作業へのTag付けなので、適切なコメントとともに、実行する。

## 一時的な待避([Stash](https://backlog.com/ja/git-tutorial/reference/stash/))
本来は、マージ作業をするだけなのだが、私の場合は作業途中のソースファイルが存在していたため、マージに失敗した。
そのため、作業中のファイルを待避させることで、マージを再開し、成功した。

```bash:コマンドプロンプト
git stash save
```

踏み込んで言えば、任意に名前付けを行え、その名前で出したり入れたりができるようだ(詳細は不明)。

## ソースファイルの統合([マージ](http://www-creators.com/archives/4996))
`add`で追加した最新版のソースファイルたちと自分のリポジトリ環境を統合する。

```bash:コマンドプロンプト
git merge root_branch/master
```

私の環境が`master`だったため、それに取り込んだ認識で合っているよね？
逆だったら凹むよ。

コメントを残す必要がある。

## マージ後の反映([プッシュ](https://reasonable-code.com/git-push-origin-head/))
プッシュコマンドで反映される。

```bash:コマンドプロンプト
git push origin master
```

リモート先に[反映](http://shoma2da.hatenablog.com/entry/2014/03/08/234523)されたはずだ。

## 一時的な待避を戻す
上記で待避(Stash)したため、ここで戻す。

```bash:コマンドプロンプト
git stash pop
```

一つしか待避させていないため、この程度で事足りる。

## 最新化終了
ここまでで最新化が行われたはず。


## 注意
上記で、`git remote add`コマンドを使った。
そのとき、`root_branch`がリモート上に残ってしまったため、手動で削除した。
しかし、あかんかったわ。
それ以降の操作でエラーが出て続けてしまい、解消することができなくなってしまった。
むぅ。
今度は、この問題を解決しなければならない。
困った。




















# 感想
今回の時間設定により、より柔軟なキーマッピングが可能になったのではないだろうか。
これで、自作関数を作る必要性から解放され、時間を有効活用できるようになった・・・つもり。
やはり、知っていなければ、車輪の再開発をしてしまい、時間の無駄をするところだった。
勉強こそが人間のあるべき姿であり、経験を重視するのは愚かであり、犬畜生にも劣る下の下の生き方だろうことがここでも実証された。
今後も勉強して、人間の立場を棄てないように頑張ろうと思う。

その前に、Gitの使い方を勉強するかな・・・やることが多い。。。
あぁ就職活動が先か・・・。


以上。