2020-01-13 丸括弧・波括弧をホームポジションで打ちたい 英字モードでも2種類のシフトが使えれば実現できるはずだ、とLacaille改造してみた
- とりあえずLacailleを改造してかな入力でないモードでも2種類の親指シフトで文字を変えることはできた(今はどのキーでどのシフトをしても中括弧が出るけど)
- 次は自分のやりたいキーマップをどうやって指定するか、というところだな。
- 一つ問題点があって、スペースキーの初回無効がオンの場合、プログラムやコマンドで頻出するスペースに二回押しが必要になって不便
- 英字モードで、右親指シフトでqを押すとQになって、左親指シフトで押すと1になる、それぞれのキーで2種類のシフトで文字を出し分ける、というところまでできた
- が、これを実運用しようとするとKarabinerでorzしてるのとぶつかるので、KarabinerでやるのをやめてLacaille単体でorzするように変える必要がある。
- なおこのバージョンは自分でコンパイルしないとキーマップを変えられないのでバイナリリリースをする予定はありません。
- Macのキーコード、なぜasdfhgzxという並びなのか謎だけど、歴史的経緯がなんかだから考えても仕方ないものなのかな?
- Lacaille単体での親指シフトできた
- これを使って解説記事を書くのがゴール
- step2まではフリック入力だったが、ここからLacaille単体での親指シフト
- Scrapboxのブラケットが入力しやすくなって嬉しい(vの左シフト)
- Lacaille単体での親指シフトはプログラムを書き換えなくても実現できる
- この方針でやろうかと思ったがキーマップの一部がソースコード、一部がGUIでの設定(plistに保存される)という状態は気持ち悪いので全部ソースコードにした
- というわけで上記のGUIは現状ただの飾り
- この方針でやろうかと思ったがキーマップの一部がソースコード、一部がGUIでの設定(plistに保存される)という状態は気持ち悪いので全部ソースコードにした
仕組みの解説
- LacailleはkeyUpDownEventCallbackという300行ちょいの関数の中で色々な場合分けをしている
- かなモードかどうかでの分岐もここでやる
- 今回僕はこれをいじって、英字モードでもかなモード同様に「2つのシフトとの同時押し判定」を行うようにした
- 同時押しの判定には色々分岐があるが、最終的にはtimerFiredの中でgetKeyDataForOya(keycode, gOya)を読んで変換後のキーを取得する
- ここでかなモードかどうかによる分岐を入れた
- キーマップは1キーあたり3バイトの配列でハードコードしてる
- なので4バイト以上送信できない
- この3バイトはASCII文字列ではなく、keycodeの列
- 人間が直接編集するのは大変だから生成スクリプトを作った
今後やりたい
- (英数)(開き角括弧)(かな) で、かなモードでも直接ブラケット入力
- 3バイト制限を外せたら色々面白いことができる
- Unicode記号を入力したい
- 16進直接入力
- キーマップをJSONにする
old
- 不等号をマップし損ねている
:
[[" !1", " \"2", " #3", " $4", " %5", " ", " &6", " '7", " (8", " )9", " 00", " =-", " ~^"], ["1Qq", "2Ww", "3Ee", "4Rr", "5Tt", "|&!", "6Yy", "7Uu", "8Ii", "9Oo", "0Pp", " `@"], ["\u00a5Aa", "/Ss", "=Dd", "{Ff", "}Gg", " _-", "(Hh", ")Jj", "\u2423Kk", "\"Ll", " +;", " *:"], ["?Zz", "+Xx", "-Cc", "[Vv", "]Bb", "^$@", "*Nn", "_Mm", " <,", " >.", "#?/"]]