keyhacでNICOLA配列を実現する

macOS Sierraにアップデートしたところ、キー配列をカスタマイズするKarabinerが利用できなくなってしまいました。


Karabinerは非常に様々なカスタマイズに対応していたため、不便な思いをしている人も多そう。
私はNICOLA配列(いわゆる親指シフト入力)で日本語を入力するのにKarabinerを使っていたのですが、これができなくなっていました。
親指シフトは同時押し(シフトキーを押しながら文字キーを押すだけでなく、文字キーを押してからシフトキーを押し下げても良い)が特徴のため、単純なキーの置き換えだけができるツールでは再現ができません。

そんな折、以下のページでkeyhacという、Pythonで高度にキー配列をカスタマイズできるツールを知りました。


macOS SierraでKarabinerが動かなくて困っている人に贈る代替ソフトウェア


Keyhac - Pythonによる柔軟なキーカスタマイズツール - craftware


これならというわけで、JIS配列キーボード/ローマ字設定の環境向けにNICOLA配列を実現する設定を書いてみました。設定といっても普通にPythonのプログラムです。この記事も、これでNICOLA配列にした状態で書いています。

設定の仕方

keyhacを起動し、メニューバーに表示されたアイコンメニューから"設定の編集"を選ぶと、TextEditで設定ファイルが開きます。そこに、本記事末尾のコードをコピペして上書きします。デフォルトの設定はいろんな機能のサンプルが入っていて意図しない動作になったりするので消すか無効化したほうがいいでしょう。
なお、TextEditは勝手にクォート("")を“”などと置き換えてしまうので、編集→自動置換→スマート引用符の設定は切ってから編集したほうがいいでしょう。
シフトキーの設定は SHIFT_KEY = ["左親指シフトキー", "右親指シフトキー"] のように書きます。キーの名称は、keyhacのメニューから"端末を表示"し、同じくメニューから"内部ログ ON"にしてタイプしてみれば確認できます。
設定を書いたら保存して、再度メニューから"設定のリロード"を選べば準備完了です。

使い方

かなキーを押すとNICOLA配列が有効化され、英数キーを押すと無効化されます。
親指シフトキーは同時押しが可能です。具体的には、親指シフトキーの押下前後40ms以内に文字キーが押されると一回だけ効くようになっています。文字キーの後でシフトキーを押下した場合に対応するため、文字キー単体で入力された場合は最大40msだけキーダウンが遅延されます(キーアップするか親指シフトキーが押されれば直ちに入力されます)。この判定時間はSHIFT_MSとSHIFT_DURATIONを両方とも変更することで、個々人の好みに合わせて調整が可能です。
一応これでそれなりに機能しているようですが、文字キー → 親指シフトキー → 文字キー と高速打鍵すると意図しない方の文字にシフトが効いたりすることも稀にあるため、まだ改善の余地があるかもしれません*1

さらなるカスタマイズ…

キー配列は TABLE という辞書を編集することでカスタマイズが可能です。各文字に対して/(スラッシュ)区切りで'シフトなし/左親指シフト/右親指シフト'という順にローマ字表記、または""でくくったキー名を書くようになっています。頑張ればorz配列等にも対応できるはずです。

この設定は下記のNICOLA-J配列を参考にしてますが、"[", "]", "^", "\" キーはそのままにしてあります。
http://nicola.sunicom.co.jp/image/nicola-j-implementation-sample.png


なおドキュメントはメニューのヘルプで見られますが、delayedCall などの一部の低レベルの機能は載っていないので、そういう細かい部分はkeyhacやその下位ライブラリのpyauto, ctkitのソースを見る必要があるかもしれません。

GitHub - crftwr/keyhac: python based key customization utility
GitHub - crftwr/pyauto: windows low-level feature library
GitHub - crftwr/ckit: craftware's base library

*1:文字キーを離す前に親指シフトキーを押した場合、どう判定するべきかが難しいところ。近い方の文字キーにすべきなのかもしれませんが、これを実現するには入力をタイマーで遅延させる必要があり、かなり複雑なことになりそう……。