たまに「Aを押しながらB」で、
Aが押しっぱなしになる現象が起こる。
これはDvorakJのバグではなく、
ベースになるAutoHotKeyのバグらしい。
田中さん:
> DvorakJを起動してると、「Shift+Enter」キーを単打した後、キー入力が切れずに、Shift押しっぱなしのまま保留されるの何とかならんかな...
対処法はいくつかある。
シフトが本来のシフトキーでない別のキーをフックしてる場合、
もう一回シフト+エンターを打つと、
「シフトを離す」イベントが起きる場合がある。
シフト+何かの別のものでも良い。
素早い動作や、DvorakJの処理が追いついてないときに、
「離す」が発生しないことがあるっぽい。
別の回避方法は、
「シフトエンター」というキーを新設することだ。
DvorakJ側でつくるのを避けて、
自作キーボード側で新設すれば動作は機敏だ。
エンターキー、シフトキー以外に、
2つのキーを押さない、
一発でシフトエンターを発行するキーがある、
ようにしてしまうとよい。
レイヤーの余ってるところに、
シフトエンター、コントロールエンター、オルトエンター、
なんて並べてもいいかもね。
(チャットアプリの改行コードが色々異なるの、
マジでやめてほしい)
どれくらいそれを使うかの重要度はわからないが。
もしDvorakJのSandSをシフトキーとしているなら、
DvorakJは親指キーと文字キーの同時押しは、
3つ以上のキーが絡むと、
タイマー同時押し(同時に打鍵する配列、-での判定)でしか判定出来ず、
薙刀式のような相互シフトにならなかったはず。
その制限があるから、
親指操作系とDvrorakJは相性が悪い。
なので、親指キー系でシフトしたいなら、
QMK側で組むのが簡単かな。
ただ、最初にのべたAutoHotKeyのバグがある
(DvorakJはAHK_Lで組まれたもので、
破壊的変更をしたAHKのver2で組まれていない)
ので、
そっちが発動してたら「もう一回押す」が、
現実的対処としては簡単かもしれない。
薙刀式でも、
素早い相互シフトや、
離し順が変な順の相互シフトでは、
シフトキー側(濁音キーなど)が入りっぱなしになるバグに突入する。
なので軽いエディタを使うのが絶体条件。
(wordなんて10万字超えたらクソ重いエディタでは、
1同時押し当たり60%くらいの確率で起こる)
まあもう一度打てば今のところ100%解消するので、
データが消えるとかの深刻ではないと思う。
> CliborのFIFOを使うときだけ
これが結構重い場合、
バグが起きてる可能性はあるなー。
なおAHKでは、
「フォーカスが特定のアプリにいるときだけ、
DvorakJをサスペンド(サスペンドに設定してるコードを発行)して、
別のアプリにフォーカスしたら復活させる」
ように組む事ができるはず。
やったことないけどサンプルコードはそのへんに転がってると思われます。
2026年03月27日
この記事へのトラックバック


せっかくファームウェア書ける自作キーボードを使っていることだし、キーボード側で手当てするのが良さげですね。
打鍵速度が上がるにつれて薙刀式のよく練られた配列に感心しているわけなのですが、相対的にエラーの煩わしさが気になってきてしまい...
今週末、頑張って作業してみます。
自作キーボードのレイヤーが一番手っ取り早そうですね。
DvorakJはたまーに謎挙動しますね。
AutoHotKeyがv2になったのもその取りこぼしを防ぐため?
かもしれないです。
OSから来ているキーリピートとぶつかってるのかもです。
そもそもこんだけヘンテコな同時押し(しかも相互シフトで)を使うのは薙刀式だけなので、
「そんなの想定してない」のかもしれないですねー……
Thread, Interrupt, 33, 1000 ; キー入力から約33ミリ秒ないし1000行以内の割り込みを禁止
と宣言すると、キー上げの取りこぼしはなくなると思います。
(初期値は15ミリ秒なんですが、たいていのパソコンのタイマーは15〜16ミリ秒ごと進むので、ただの1行処理するだけでも16ミリ秒進んで割り込み解除、ほかの処理が始まる……なんてことがザラに起きます)
ただ、Autohotkeyの誤動作が悪化したりするので、気をつけないといけません。
たとえば、DrorakJに施すと3キー同時押しを長押しした時、おかしな繰り返しになったりします。
そうそうAutohotkey v2では動きが遅すぎて、上に書いた対策は効き目がないんですよー。
詳しい情報ありがとうございます。
原理的な問題で、
あちらを立てればこちらが立たずってことか。
クロックの速いCPUなら問題ないのかなー。
しかしAHKv2になってからあんまり聞かなくなったのは、
遅いからというのも影響してたり?