窓使いの憂鬱プログラミングもしくは英語キーボードの素晴らしさを語る(読み飛ばし推奨)もしくは中薬指飛鳥

世の中は広い*1です。補助ツールに過ぎないはずのMakeでプログラミングする人もおられるぐらいです。キーカスタマイズツールに過ぎないはずの窓使いの憂鬱でプログラムが書けたっておかしくありません。
プログラミング言語に最低限必要なものは、入力と出力と計算能力です。入力はキーボードからのキー入力、出力はアプリへ渡すキー入力、あとは計算ができれば.mayuでアプリが書けちゃいます。
例えば、足し算をしてみましょう。

key D-~L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-_1 = _1 &Toggle(LOCK0, on)
key D-~L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-_2 = _2 &Toggle(LOCK1, on)
key D-~L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-_3 = _3 &Toggle(LOCK0, on) &Toggle(LOCK1, on)
...

key D-L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-_1 = _2 &Toggle(LOCK0, off) &Toggle(LOCK1, on)
key D-L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-_2 = _3 &Toggle(LOCK1, on)
...

key D-~L0-L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-_1 = _3 &Toggle(LOCK0, on)
...

key enter = &Toggle(LOCK0, off) &Toggle(LOCK1, off) &Toggle(LOCK2, off) ...
#debug
key a = &DescribeBindings

押されたキーを加算した結果を入力します。1を3回押すと3になります。Enterがリセットです。
ポイントはロックキーで、本来トグルさせて使うものなのですが、窓使いの憂鬱では強制的にON/OFFさせることもできます。つまり1ビットの変数として使えます。嬉しいことにCaps LockとかScroll Lockとかとは別に、窓使いの憂鬱内部用のロックキーが0から9までありますので、窓使いの憂鬱は10ビットのレジスタを持っていると言えます。少ないですが、1023までの数ぐらいは数えられます。keymapでチェインさせられますので実際にはもっといけます。"D-"は、付けないとロックキーの動作が微妙なので付けてあります。
どちらかといえばプログラミングというより制御回路の設計に近いですが、窓使いの憂鬱を使う上での役には立ちそうです。
さて、何度か書きましたがKensingtonのそれを購入して以来私は英語キーボード使いです。
英語キーボードですと、言語設計者の想定した記号の打ち方ができるので大変良いのです。たとえばCのコメント/*...*/ですと、日本語キーボードのASCIIコードに忠実な記号配列ではひたすら右小指を酷使するのですが、英語キーボードですと右小指で/を捕らえたところで人差し指を思いっきり伸ばすとちょうど裏が*である8に届くとか。Pascalのコメント形式の一種(*...*) なんてアルペジオで打てます。普通{...}が使われますのであまり関係ないですが…。とにかく設計者の指使いが想像できてニヤニヤできます。
他にもアンダーバーが上に来るとかキーの絶対数が少ないとか使いもしないJISかなの刻印に惑わされないとか、英語キーボードは良いものです。
かくも素晴らしい英語キーボードの特徴のひとつに、変換と無変換が無いのでスペースバーが長いというのがあります。これもまたSandS使いの私には嬉しいのですが、全角/半角も無いのでIMEのON/OFFどーすんだというちょっとした問題も。私はPC-98よろしく右Altを潰して変換キー兼IMEのON/OFFに充てています。
さてさてここで飛鳥です。この配列は、親指シフト、それも、専用キーボードではなくて、変換と無変換を流用するのが前提です。
現実逃避に使いもしない定義ファイルを書くにあたって(←酷)、英語キーボードではどうしよう、と。まぁそんなわけです。Kensingtonのは左はAltとスペースバーの間に何故かバックスラッシュがあったりするのですが、それを使うにしても無変換よりは若干遠く親指が不自然に曲がります。
というわけで私はなにも考えず中指と薬指をシフトにしてみました。
元々の中指と薬指に割り当てられていた文字は…飛鳥は下手に弄れる配列ではなさそうでしたので、そのままです。つまりSandSよろしく、他のキーを押したらシフトで、なにもせず離したらそのキー自身とします。シフト面を出したい場合は反対側でシフト。連続シフト対応のため、他のシフトにも使うキーを押して元々押していたキーを離すとシフト状態が遷移するだけとします。また、その状態からキーを全て離すと、最初に押したシフトが有効な状態であとから押したキーが入力される、とします。じゃないと離す順番まで気を使わないといけなくやっとれんです。あとシフト兼用キーのリピートは殺す。あと(IMEオフではなくて)英数入力モードでは全部無効。
で、こんなややこしい条件も、窓使いの憂鬱は実装できちゃうのです。ロックキー全部使ってます。
http://panathenaia.halfmoon.jp/key/mmasuka.mayu
配列自体は記号の位置と、やっぱりBとTではBのほうが辛いので「へ」だけBからTへ移動してます。Pと/を入れ替えてもいいぐらいですのでTとBも入れ替えてもいいのでは…と弱気に。
…飛鳥自体は…とりあえず「あ」と「す」と「か」だけ覚えた。
どうでもいいですが、実はこれ作ってる間に飛鳥自体が329から330になって書き直す羽目になったのですが、今見たら331になってるし…。微妙に悔しい。
追記
使わない以上どうでもいいとわかっているにも拘らず、悔しいという理由だけで331対応しました。あとファイル名、mm(middleとmedicinal^^;)とか付けるよりyayoiのほうがファイル名並びで一番下に来て都合がいいという勝手な理由で、jisx6004さんの命名勝手に使わせていただきます。
http://panathenaia.halfmoon.jp/key/yayoi.mayu

参考URL:http://aumtyper.hp.infoseek.co.jp/asuka_ma.html

今日の飛鳥(←単なる動作テスト)
"あすか"は配列名だけあって中指と薬指だけで打てるみたいですね。動作確認に丁度いいです。…何か間違ってる予感が。

あとで読む

http://assam.cims.hokudai.ac.jp/ai/
http://assam.cims.hokudai.ac.jp/~k_mit/
ざっと見て…PrologはNFAシミュレータ(暴言)として、ETはなんなのだろう。イメージがさっぱり。
メモ。
GHCはGuarded Horn ClausesであってHaskellコンパイラではない、あとDルールが時々D言語表記されるがもちろんdmdではない。表記されてるように思えるが本当にdmdの場合もあるので要注意…。