2020-01-13 丸括弧・波括弧をホームポジションで打ちたい 英字モードでも2種類のシフトが使えれば実現できるはずだ、とLacaille改造してみた image

step1

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

step2

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

step3

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

仕組みの解説

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

今後やりたい

old image

  • 不等号をマップし損ねている

:

[[" !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", " <,", " >.", "#?/"]]

keylayout