前記事の続き。
trp3lさんのコードは細かく制御できそうなものの、
結局「○ミリ秒」を意識しなければならないので、
思うような挙動にならないと感じた。
困ったなあと思っていたが、
薙刀式の編集モードと同様、
「二つのキーを押しっぱなしにしたら、
シフトキーをオンにする、
離したらオフにする」
とすれば、
マウスのクリックやホイールと合わせようが、
他のキーと合わせようがいけるのでは?
と思いつく。
丁度、
SS_DOWN(X_LSHIFT)
SS_UP(同)
という、おあつらえ向きのマクロ見つけたし。
マクロを2個定義する。
カーソル左右キーのダブルホールドということで、
DH_LとDH_Rとしようか。
いつものswitch文のところで、
case: DH_L
押された時、押されたフラグを立てる。
もう一方のDH_Rが押されたフラグが立ってるかどうか見て、
両方押されてるときにSS_DOWN(X_LSHIFT);
を発行し、シフトフラグを立てる。
そうでないなら放置。
離された時、
押されたフラグをオフ。
シフトフラグ立ってたら、
SS_UP(X_LSHIFT);フラグリセットしてbreak;
立ってなかったら、
単押し、単離しなので、
カーソルを発行。
case: DH_R
同様。
などのように書けば、
○ミリ秒のことを一切意識せずに、
ノーマルカーソルと、
二つ同時押しシフトキーとに使い分けられ、
かつ、
他のキーコードにもシフトがかかるし、
マウス挙動にもシフトをかけられる、
という仕組みが出来そう。
今出先でスマホしかないので、
家帰ったらコード組んでみよ。
そもそもの目的は、
シフトクリック(複数選択)、
シフトホイール(AEでのタイムラインの横スクロール、
単ホイールだとレイヤー移動)、
Ctrlクリック(レイヤーオプション)、
などを実現したいなあと思っていた。
無意識に選択や移動するので、
○ミリ秒を意識するのはとても難しいのだ…
生理的感覚の違いが出ていて
面白いなと思いました。
私の場合、先述のコードだったり、
ダブルタップだったりと、
時間に対しては
あまり抵抗がないのかもしれません。
大岡さんが提案されている手法が
もっと一般的に拡張できたら
片手マクロ用薙刀式みたいな
キーマップが実現できるかもしれませんね。
このへんは同時シフトがいいのか、
先行通常シフトでもいいのか、
みたいなことのような気がしますね。
僕は、先行押し、かつ押しっぱなしで、
次の押しを制御したいので、
間にタイムラグがあると許せない感覚があります。
なのでTAPPING_TERMは普段0で、
RETRO_TAPPINGをオンにして使ってます。
でもシフト明けにカーソルがポロリするので、
だったら二つのキーホールドなら、
と思いついた感じ。
AfterEffectsだと、
タイムラインで、
ホイールで縦移動、
シフトホイールで横移動なので、
横移動しようとしてシフトにまだなってなくて縦移動してしまう、
というのがイライラしてしょうがないんですよね…
複数選択するときもガガガって選択できないし。
これを一般化するには、
「押した時点から離す時点まで、
キーを他に発行したかしてないか」
みたいな関数が必要な気がして、
かなり面倒なので避けることにしました…
さらにエレガントな解決策は全然あるでしょう。
QMK薙刀式のコードを応用すれば、
if文の迷路に迷わずに済みそうですね。