generated at
英字モードでもシフト2種類使う
2020-01-13
英字モードでも2種類のシフトが使えれば実現できるはずだ、とLacaille改造してみた



とりあえずLacailleを改造してかな入力でないモードでも2種類の親指シフトで文字を変えることはできた(今はどのキーでどのシフトをしても中括弧が出るけど)
次は自分のやりたいキーマップをどうやって指定するか、というところだな。
一つ問題点があって、スペースキーの初回無効がオンの場合、プログラムやコマンドで頻出するスペースに二回押しが必要になって不便

英字モードで、右親指シフトでqを押すとQになって、左親指シフトで押すと1になる、それぞれのキーで2種類のシフトで文字を出し分ける、というところまでできた
が、これを実運用しようとするとKarabinerでorzしてるのとぶつかるので、KarabinerでやるのをやめてLacaille単体でorzするように変える必要がある。
なおこのバージョンは自分でコンパイルしないとキーマップを変えられないのでバイナリリリースをする予定はありません。
Macのキーコード、なぜasdfhgzxという並びなのか謎だけど、歴史的経緯がなんかだから考えても仕方ないものなのかな?

これを使って解説記事を書くのがゴール
step2まではフリック入力だったが、ここからLacaille単体での親指シフト
Scrapboxのブラケットが入力しやすくなって嬉しい(vの左シフト)
Lacaille単体での親指シフトはプログラムを書き換えなくても実現できる
この方針でやろうかと思ったがキーマップの一部がソースコード、一部がGUIでの設定(plistに保存される)という状態は気持ち悪いので全部ソースコードにした
というわけで上記のGUIは現状ただの飾り

仕組みの解説
LacailleはkeyUpDownEventCallbackという300行ちょいの関数の中で色々な場合分けをしている
かなモードかどうかでの分岐もここでやる
今回僕はこれをいじって、英字モードでもかなモード同様に「2つのシフトとの同時押し判定」を行うようにした
同時押しの判定には色々分岐があるが、最終的にはtimerFiredの中でgetKeyDataForOya(keycode, gOya)を読んで変換後のキーを取得する
ここでかなモードかどうかによる分岐を入れた
なので4バイト以上送信できない
この3バイトはASCII文字列ではなく、keycodeの列
人間が直接編集するのは大変だから生成スクリプトを作った

今後やりたい
(英数)(開き角括弧)(かな) で、かなモードでも直接ブラケット入力
3バイト制限を外せたら色々面白いことができる
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", " <,", " >.", "#?/"]]