2019年04月24日

【QMK】単打と押しっ放しの実装

キーコードLT(layer, key)は、
「単打でkey、押しっ放しでlayer」を想起させるが、
そのようには作動しない。
しかしそうするように設定を書き換えることが出来る。
そのメモ。


どうやらQMKは、
「短く押して離す」をTAP、
「長く押す」をHOLDと定義しているらしい。
(HOLDのイメージが違うよね)
その短い/長いの境目が、TAPPING_TERMというパラメータで、
デフォは200ミリ秒だ。
(これはconfig.hに、
#define TAPPING_TERM 100
などと一行加えることで変更できる)

しかし我々の日本語の操作感覚からすると、
短時間押しと長時間押しで打ち分けるのは稀で、
ふつうは、
「押して離すと単押し、押しながら何かを押すと、
(シフトのように)定められた別の何かが発動」
という感覚でいるものだ。

これについての記事をみつけたが、
マクロを組んで押し離しで定義する、というやり方であった。
http://okapies.hateblo.jp/entry/2019/02/02/133953

別解をつくったので記しておく。

僕のやり方は単純にconfig.hに、

#define PERMISSIVE_HOLD
#define RETRO_TAPPING

の二行を加えるものだ。

これでLT(layer, key)が、
「単打でkey、押しながらだとlayerのキーに」
の機能になるようになる。


解説

PERMISSIVE_HOLDは、
「別のキーが押されたとき、
TAPPING_TERM以内にキーを離してしまっても、
Hold扱いにする」というオプション。
(デフォは、すばやく離してしまうと単打扱い)

RETRO_TAPPINGは、
「TAPPING_TERMを過ぎて何も他に押されずに離しても、
TAP扱い」というオプション。
(デフォは、遅れて何も押さないと、何も発行されない)

これらふたつをオンにすることで、
素早いときでもゆっくりのときでも、
思った挙動にすることに成功。

たとえばカタナ式では、
SandS、すなわちスペースキーを、
「押しながら何かを押すとシフトキー
(連続して複数のものにも効く)、
押して他に何も押さずに離すとスペースキー。
キーリピートなし。
ずっと押しっ放しでも、何も押さずに離すとスペースキー」
と定義している。

これを実装するのに、
LT(shift_layer, KC_SPC)
と書くだけでOKになった。

先の記事では、
「単押しで変換/無変換、
押しながらだとLower/Raise」に定義しようとしていたが、
おそらく二つのオプションをconfig.hに書けば、
LT(_Lower, KC_MHEN)
LT(_Raise, KC_HENK)
で実装できると考えられる。
(もっとも、このオプションは全体の挙動に影響するため、
他のキーの挙動がこれを想定してなかったら都合が悪くなるが……)

なお老婆心ながら、LT()はレイヤー0-15までしか対応していないので、
レイヤーが多いマップだと、うっかり漏れるかも。


QMKはやはり難しい。
想定ルールから外れたことをやろうとすると、
「できないことはないが困難」みたいなことにすぐさらされ、
「できないならできないと知りたいが、それはわからない(できるはず……)」
状態に放り込まれがち。
できた人、詳しい人に聞いたほうが速いかもしれない。
posted by おおおかとしひこ at 19:02| Comment(2) | カタナ式 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
いま、「→」キーをTapしたときに右に進む。長押ししても右に進み続ける。ただし、「→」キーと何かほかのキーを押したときには「Ctr」扱いにしたいと思い、いろいろなサイトをあさっていました。

以下の設定にしても思うように動かないのですが、何かアドバイスをいただければ幸いです。

config.hには以下のラインを加えました。
#define PERMISSIVE_HOLD
#define RETRO_TAPPING

keymap.cには以下の用に定義しました。
LT(KC_RCTL, KC_RGHT)

もし、解決方法をご存知でしたら教えていただけないでしょうか。
Posted by くれいじーブラックホール at 2020年04月14日 17:00
>くれいじーブラックホールさん

キーリピートあたりのことを調べれば分かるかもですが、
多分思った挙動は難しそうな気がします。

→のキーリピート時間以内に別のキーが押されたらCtrlとそのキーを組み合わせて出す、
リピート時間がくれば→を離しを検出するまで一定期間おいて出す、
(他のキーを押しても離すまで無視)
みたいなプログラムを組めば実現可能かと。

で、このリピート時間を何msに設定するかが難しいと思うので、
「→のリピートは諦める」が現実的かも…
Posted by おおおかとしひこ at 2020年04月14日 18:45
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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