前回のバージョンアップで、確定操作中の操作キーを有効にしましたが、いくつか問題が出てきました。
特に確定操作のEnterキーの振る舞いが望ましくないので、回避方法を検討していましたが、根本的な考え方を変えることにしました。
以下、少しアプリケーションの中身の話なので、ユーザーには興味が無いでしょうが、仕組み的には興味深い点もありましたので紹介します。
1.確定操作中にしていたこと
当初は、辞書登録していた単語とマッチングしたときに、そこで1文字入力を行うようにしていました。このとき、ユーザーが入力したキー入力を横取りすることにより、余計な動作をしないようにし、以下のキー入力だけを判定していました。
(1)確定 :登録した単語に置き換える
(2)続行 :続けて文字を入力すれば続行する
(3)中断 :エスケープによりマッチング状態から抜ける
(4)バックスペース :バックスペースで文字を消す
2.前回のバージョンアップ
そこで、前回のバージョンアップでは、確定操作中に全てのキー操作を横取りせずに、そのままスルーすることにしました。
カーソルキーなどがそのまま反映されるので、確定操作に影響があることは分かっていましたが、半角/全角キーを有効にすることを優先しました。
が、肝心のEnterキーの影響が非常に大きいことが分かりました。Enterキーを押したとたんに実際に改行が発生し、その後でDaigoの確定操作が行われるようになりました。
これは、一部のアプリでは致命的なので、回避策を検討することにしました。
3.回避策とホームポジションキーパー競合
試みたことは、Enterキーだけ別扱いにして、スルーさせずに横取りすることをAutohotKeyの機能ではなく、アプリケーション側で行うようにしました。
つまり、確定操作に入ると、Enterキーを無効にして、確定操作が終わると再び有効にするといたことにより、横取りするといった方法です。その手順は以下の通りです。
①マッチング Enterキーを無効にする
②1文字入力 Enterキーなら確定操作
③Enterキーを有効にする。
これはうまく動作したのですが、私にとって大きな問題が発生しました。それはホームポジションキーパーが動いているとアプリケーションの横取りができず、実質問題回避ができないことが分かりました。なぜそうなるのかは、以下の通りです。
①Daigoによるマッチング Enterキーを無効にする
②Enterキー入力
③ホームポジションキーパーによるEnterキー処理で、Enterが発生
④Daigoによる確定操作
⑤Daigoにより Enterキー有効
つまり、キー入力があると、先にホームポジションキーパーが横取りして処理するためにDaigoでのEnterキー無効化は無意味になるのです。
では、ホームポジションキーパーよりDaigoを優先して処理するようにすればいいのですが、そうするとDaigoの確定操作のキー操作(Enter、Escape、BackSpace)がホームポジションキーパーで入力できなくなります。
これは、私にとっては非常に大きな問題で、Daigoの確定操作中だけは本当のEnterキー、本当のEscapeキー、本当のBackSpaceキーを押さなければなりません。
どれも、ホームポジションからは相当遠くにあるので、そのような操作はホームポジションキーパーで行いたいというジレンマに陥りました。
4.根本的な回避策
ここで大きな壁に当たり、どうすれば回避できるか悩みました。やはり副作用を出さない、ホームポジションキーパーとの競合を避けるためには根本的な考え方の変更が必要だと考えました。
そこで思いついたのは、再びDaigoでキー入力を横取りして、全ての操作キーをDaigo側で処理するという強引な方法にすることにしました。
つまり、Daigoでの確定操作中の処理を以下のようにしたのです。
(1)確定 :登録した単語に置き換える
(2)続行 :続けて文字を入力すれば続行する
(3)中断 :エスケープによりマッチング状態から抜ける
(4)バックスペース :バックスペースで文字を消す
(5)特殊操作 :半角/全角、カーソルキー、ファンクションキーなど
この(5)での処理のため、AutohotKeyでは、以下のような一文になってしまいました。
Input,iC,L1 T%CancelTime%,{vk1D}{vk1C}{vkF3}{vkF4}{vkF2}{Escape}{BS}{LControl}{RControl}{LAlt}{RAlt}{LWin}{RWin}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}
しかも、これらのキー入力は、一度Inputで横取りした後、上のように例外として検出し、改めてその操作をそのまま出力するようにしています。(VkF3などは半角/全角キーなどの特殊なキー)
前回のバージョンアップでは、横取りを止めて、自前で横取りするという方針でしたが、この方法ではホームポジションキーパーに先に横取りされるという問題があったわけです。処理としては、こちらの方が素直なので、最初はこの方法を取ってしまいました。
処理として記述量が少なく素直であっても、実際の動作では不具合が生じるというケースで、勉強になりました。
日付け時間入力を例えば
H31.3.18 9:30
平成31年3月18日 9時30分
2019/3/18 9:30
というような現在の日時入力を登録できませんでしょうか
日付は{date}でしたので{hour}{minute}{sec}などで実現できそうです。
少し先になるかもしれませんが、次回のバージョンアップで対応したいと思います。