また少しキーボードを弄った
以前、「もう微調整をすることはあっても、大きく変更することはないだろう」とか言った側から、また大幅な変更を敢行してしまいました。
変更の直接的動機
直接的な動機はひとことで言ってしまえば、「仕事で部分的にUS配列を使わざるを得ない状況に晒された」ってことになります。ちなみに普段はJIS配列ユーザーでした。
「部分的に」というのが曲者です。
普段は日本語のWindowsをJISキーボード設定で使っています。しかし、ネットワーク越しに別の端末に入るとその端末がUSキーボード設定だった、なんてことが最近の仕事環境で起こり始めた。しかもそれは共有環境なので、勝手に設定を変えるわけにも行かない。
端末ごとにJISとUSの配列を使い分けるのが地味に面倒だった。なので、「JISとUSの違いをファームウェアで吸収できれば楽じゃね?」と思い始めたのですね。
これが直接のきっかけ。
キャップの刻印と出力を一致させたい
そうなると、それに絡んで色々と気になり始めたのです。
私は仕事環境の都合もあって、普段JIS設定で使ってますが、世の中の自作キーボードのパーツはUS配列が前提になっているものが多い。
キーキャップなどは、その最たるものです。私もJIS設定ユーザーでありながら、やむなくUS配列用のキーキャップを使ってますが…
たとえば、これはUS配列用のセミコロンキー。キーの刻印上は、Shiftと一緒にコレを押すとコロン「:」になるはずですが、JIS設定で使っている私の環境では「+」が出力されていました。OSをUS設定にすれば、刻印通りの出力が得られます。
このあたりは、実はレイヤー管理でうまく誤魔化してはいたのですが、前述のようなJIS設定とUS設定が混在するような状況になると、もうわけがわからなくなってきた。
なので、「JIS設定だろうとUS設定だろうと、キーキャップの刻印通りに出力できるキーボード」にしたいという願望が生まれたのです。
これを実現するために、やらねばならないことは大きく二つありました。
JIS設定で使うモードとUS設定で使うモードを簡単に切り替えることができる
JIS設定モードでは、キーキャップの刻印通りに出力されるよう、出力キーコードをオーバーライドする
これらを、qmk firmwareのkeymap.cを修正して、結構無理矢理実現させました。
そしてこれにより、前述した「レイヤー管理でうまく誤魔化し」が不要になってしまいました。
よってこれを機に、大幅にキーマップとレイヤ構成を見直すことになったのです。
で、その結果がコレです。
配置の意図
各種特殊キー
デフォルトのレイヤーを見ると、結局、一周回ってアルファベット以外の各キーの位置が標準に近い位置に戻っています。
良く使うモディファイアキー(Shift, Ctrl)を親指の担当範囲に収めてみたものの、結局いくら使っても慣れなかったので、標準的な位置に戻すことにしました。
どうせ40%オーソリニアなら、端に指を伸ばすくらい大した労力ではないので、変則的な配置に慣らすコストをかけるほどのものではないという結論になりました。
それに伴い、無理に両側に各モディファイアキーを配置するのをやめ、Shift以外は左側のみとし、代わりに右下隅にカーソルキーを配置しました。
記号類
これまでは、記号入力用のレイヤーを用意して、レイヤー切り替えキーとの最大2キー押下で全記号を出力できるよう拘っていました。
今回はその方針を破棄し、USキーボードにおけるキーキャップの刻印通りになることを優先しています。そのため、レイヤー切り替え+Shiftキーとの3キー押下が必要になる記号がそれなりにあります。
まあ、これは後々新しいキーボードが欲しくなったときに、USキーボード的なキー構成に慣れておこうという意図もふくんだ妥協です。JISキーボードだと、どうしても選択肢が狭くなってしまいますからね。おしゃれでクールなデザインのキーボードは、だいたいUSなんですよこれが。
このような構成にした結果、数字キーと記号類がまとまってしまったのと、カーソルキーが単体キーとして独立したのもあって、数字、記号、ファンクションキー回りの構成を全面的に見直してます。
スペースの両隣にFn1とFn2を配置。Fn1を押すと数字/記号、Fn2を押すと各ファンクションキーとマクロキーにアクセスできます。
モード切替
そして、両方のFnキーを押下するとデバッグレイヤとなり、ここでモード切替が出来ます。
両Fnキーを押しながら右上のキーを押すとJIS設定モード、その下のキーを押すとUS設定モードになります。
OSがJIS配列設定になってる場合はJIS設定モード、US配列設定になってる場合はUS設定モードを使うことで、常に同じ打鍵出力が得られるようになってます。
JIS/USの設定は、EEPROMと呼ばれるキーボード基板上の不揮発メモリに記録し、ケーブルを抜いても設定が維持されます。
また、アルファベットの配列であるAstarte/QWERTYの切り替えもここで行うようにしました。
出力統一を実現するために
ここからは、ちょっと難しい話。
さきほど、実現しなければならないことの一つとして、以下を挙げました。
JIS設定モードでは、キーキャップの刻印通りに出力されるよう、出力キーコードをオーバーライドする
実はこれがなかなか面倒だったのです。
例として、US配列慣れしていないITエンジニアがUS配列に向き合う際に、最初に戸惑うであろうこのキーで説明しましょう。
使い慣れたJISキーボードを、何も知らずにUS配列設定の環境に繋いで、「”」を入力しようとして、Shiftを押しながら「2」キーを叩くと、「@」が出てきてビビることになります。
この場合、JISキーボードでもUSキーボードでも、OSに送られた信号(キーコード)は同じです。そのキーコードに対して、「”」を出力するのか「@」を出力するのかは、OS側の判断です。つまり、JIS配列設定なら「”」を、US配列設定なら「@」を出力するという判断を、OSがしています。
今回の目標は、JISモードキーボード&JIS配列設定OS、またはUSモードキーボード&US配列設定OS、どちらの組み合わせであっても、USキーボードの刻印に準拠した出力を得ることです。
(JISモードキーボード&US配列設定OS、みたいな組み合わせは考えません。わざわざそんなことする意味も無いですし)
US&USの組み合わせなら、キーボード側は何もする必要はない。
問題はJIS&JISの時で、「Shift」と「2」を押したときに、そのままなら「”」が出るところを、うまいことOSに「@」を出力させなければならない。
それを実現するために、まずはJIS&JISの組み合わせで「@」を出力させるにはどのキーを押せばいいのかを考えます。
これですよね。このキーのキーコードを受け取った時、JIS配列設定のOSは「@」を出力します。
なので、キーボードがJISモード時は、「Shift」と「2」が押されたときに、ファームウェアで上図の赤いキーのキーコードに変換してOSに送るようにするわけです。これでOS側は赤いキーが押されたと「誤認」し、「@」を出力してくれるというわけです。
こういった処理を、JISとUSで差異がある全てのキーについて、ファームウェアに仕込んでます。
このような設定は、VIAやREMAPといったコンフィグツールだけではおそらく無理で、C言語を読み書きできる強みが活きた形となりましたね。