超漢字V(BTRON)に付属の小物「キー配列変更」が吐くファイルフォーマット&編集方法メモ。
それっぽい情報であってかつ役に立ちそうなもの……というのはなかったので、とりあえずメモ*1。
BTRONの「キーボード配列変更」小物は、思いっきり「人間が配列を【新規に】設計することについて、さっぱり考えてないッぽい」ところがあります。
微調整をするには「キーボード配列変更」でもいけるのですが、その範囲を超えるととたんに「定義ファイルの直接書き換え」が必要になってしまいます。
#もっとも、人間にとっての都合が微妙なだけで、機械にとっての都合はいいし、順当だと思う。結果として「キーマップが読めるヤツだけ、自由に変更していいよ」っていう感じになってるような。キー入れ替えの範疇を超えるような「マッピングそのもの』の変更はUIでやりやすくすると被害が大きくなりそうだから、この仕様は妥当かも。
……と、少々面倒なことになっているので、とりあえず以下に簡単な解析結果を書いておくことにします。
超漢字V(BTRON)の予備知識。
超漢字V(BTRON)のテキストデータは、バイナリーレベルでは「トロン・アプリケーション・データバス」という仕様になっていて、これがただファイル形式になっている……という感じのようです。
ファイルを編集するためには、超漢字に付属の「原稿用紙」が使われるようです。ちなみにTRONでは「データを扱うアプリ=紙」「データを扱わないアプリ=小物」「何かをまとめたもの=箱」という考え方で物事が扱われています……ので、結果としてWebブラウザは「ブラウザ用紙」だったり。
ファイルの内容が「全角英字」で書かれているので、なんか間の抜けた印象はある……のですが、全角で書こうが「太文字」にしようが、いずれにせよそういった編集差異は「キーボード配列変更」では無視されるようです。
あと、超漢字(BTRON)のテキストエディタが使いづらい……という場合には、一旦Windowsで使い慣れたエディタにコピペしてから修正して、修正後のデータを超漢字(BTRON)へとコピペで戻せばよさそうです。データをやり取りする方法については、以下のヒントが役立つかもしれません。
- 超漢字V(BTRON)をネイティブインストールしてしまった場合──超漢字(BTRON)をネイティブインストールしたパソコンに【FAT系フォーマットのUSBメモリー】を刺す方法がいちばんマシかも。『ファイル変換』小物経由でFAT系フォーマットのUSBメモリーへとアクセスできます。
- ネイティブインストールでは「笑っちゃうほど周辺機器用デバイスドライバが少ない」ことに注意。パソコンに内蔵されてるネットワークデバイスやオーディオデバイスなどは「まず動かないと思って間違いない」くらいです。うちではPen4ノートに突っ込んでみたのですが、やっぱりネットワークからしてダメで、結局は「NE2000互換のPCカードLANアダプタ(Corega/PCC-TXD)」を取り付けて使っています。(DHCPサーバがあるネットワーク環境を用意してから)ネットワークケーブルを接続した状態のPCカードを挿して、これが認識不良になってるのは無視して「小物箱→システム環境設定→機器→機器情報→ネットワークアダプタ→表示→NE2000互換[PCカード]→設定」とたどって再起動すれば、あとは勝手にIPアドレスとかを取得して動いてくれます。
- 超漢字V(BTRON)をマニュアル指示通りに導入して、Windows上の仮想マシンとした場合──この場合は超漢字全体が『ひとつのMDIアプリケーション』のように動くので、単純にコピペでいけるみたいです(未検証)。導入時にインストールすることになる「超漢字Vサービス」というアプリケーションがその機能を提供しているらしく。
「キーボード配列変更」小物の予備知識。
設定をファイルへと書き出すときには「右クリック→保存→実身に保存」と操作します。
ファイルに書かれた設定を呼び出すときには、ファイルの仮身を「キーボード配列変更」小物にドラッグ&ドロップします。
編集対象とするキーボードを変更するときには「右クリック→キーボード」で選択します。ここは使っているキーボードにあわせてください。
編集対象とする入力方式は「右クリック→入力方式」で指定します。
「キーボード配列変更」小物が吐き出すファイルの構造。
まずは予備知識として。
- 大きな分類として、まず巨大な【kana_mode】があり、続いて同じフォーマットの【roma_mode】がある、ということ。
- 各テーブルの冒頭で【table=25】と指定していて、実際のキーテーブルは「ゼロから24番まで」の25枚が使われていること。これは【kana_mode】と【roma_mode】のそれぞれに25枚ずつ定義されるので、全体で50枚が存在すること。
- 実際の定義を書き出してもらうとわかりますが、以下に示すのは「限界まで使った場合の例」であって、実運用定義は10枚前後ずつしか使われていません。
- つぎに【map00】〜【map63】のそれぞれについて、どのキーテーブルを使うかという指示が書かれていること。
- 【map**】の数字部は、複数状態を圧縮記述しているものであり、以下の項目の合計値を指している。したがって、【map**】の中の数字はゼロから63までの値しか存在しない。
- ひらがなキー押下後の「ひらがな」モードでは【+0】、英字キー押下後の「英字モード」では【+1】。
- CapsLockが有効である場合は【+2】。
- 左シフト(赤シフト)が押されている場合は【+4】。
- 右シフト(青シフト)が押されている場合は【+8】。
- Altキーが押されている場合は【+16】。
- 右Ctrlキーが押されている場合は【+32】。
- 【map**】の状態は63個取りうるにもかかわらず、実際のキーテーブルは25面までしか記述できないため、一つのキーテーブルが複数のマップ(というか、マスク)から呼び出されるように使うことになる。
- 【map**】の数字部は、複数状態を圧縮記述しているものであり、以下の項目の合計値を指している。したがって、【map**】の中の数字はゼロから63までの値しか存在しない。
- 【key00:000=0000】の数字部分は、はじめがキーテーブル番号(0〜24)を・次がキー位置(0-158)を、最後がTRONコード(の1面にある文字のみ、16進数4桁)をそれぞれ指定する。
- 各テーブルの冒頭で【table=25】と指定していて、実際のキーテーブルは「ゼロから24番まで」の25枚が使われていること。これは【kana_mode】と【roma_mode】のそれぞれに25枚ずつ定義されるので、全体で50枚が存在すること。
仕様を見ると「かなり複雑な条件で」使い分けるような定義を書くことが出来る(ロマかな/和英/CapsLock/左シフト/右シフト/Alt/右Ctrlの組み合わせのすべてを想定できる)……という仕様なのだけれど、実際にはそのすべてに別々の機能を割り当てることはないだろう、という考えで、こういった不思議な「テーブルのリマップ」という実装方法がとられた……と。
従来の入力法をほんの少し弄る程度という使い方であれば、これは結構親切かつ実用的な考え方だと思う……のだけれど、ちょっと変わったことをやろうとすると困るかも。
上の予備知識がなんとなく理解できてから、以下の定義をごらんください。
ちなみに、【map**】の部分は圧縮記述の解析用に改造したままとなっています。そのため、【map00】〜【map24】まではmapとキーテーブルを一致させています。また、【map32】(右Ctrlマスク確認用)は確認のためにキーテーブル01へとリマップし、【map63】(全マスク確認用)はキーテーブル02へとリマップし、それ以外のmapはすべてキーテーブル00へとリマップしています。
それと、文字コードの指定部分は、実際の値を入れてると理解しづらくなるので「0000」で埋めています。
kana_mode table=25 map00=00 map01=01 map02=02 map03=03 map04=04 map05=05 map06=06 map07=07 map08=08 map09=09 map10=10 map11=11 map12=12 map13=13 map14=14 map15=15 map16=16 map17=17 map18=18 map19=19 map20=20 map21=21 map22=22 map23=23 map24=24 map25=00 map26=00 map27=00 map28=00 map29=00 map30=00 map31=00 map32=01 map33=00 map34=00 map35=00 map36=00 map37=00 map38=00 map39=00 map40=00 map41=00 map42=00 map43=00 map44=00 map45=00 map46=00 map47=00 map48=00 map49=00 map50=00 map51=00 map52=00 map53=00 map54=00 map55=00 map56=00 map57=00 map58=00 map59=00 map60=00 map61=00 map62=00 map63=02 key00:000=0000 key00:001=0000 〜〜〜〜中略〜〜〜〜 key00:157=0000 key00:158=0000 key01:000=0000 key01:001=0000 〜〜〜〜中略〜〜〜〜 key01:157=0000 key01:158=0000 key02:000=0000 key02:001=0000 〜〜〜〜中略〜〜〜〜 key02:157=0000 key02:158=0000 key03:000=0000 key03:001=0000 〜〜〜〜中略〜〜〜〜 key24:157=0000 key24:158=0000 roma_mode table=25 map00=00 map01=01 map02=02 map03=03 map04=04 map05=05 map06=06 map07=07 map08=08 map09=09 map10=10 map11=11 map12=12 map13=13 map14=14 map15=15 map16=16 map17=17 map18=18 map19=19 map20=20 map21=21 map22=22 map23=23 map24=24 map25=00 map26=00 map27=00 map28=00 map29=00 map30=00 map31=00 map32=01 map33=00 map34=00 map35=00 map36=00 map37=00 map38=00 map39=00 map40=00 map41=00 map42=00 map43=00 map44=00 map45=00 map46=00 map47=00 map48=00 map49=00 map50=00 map51=00 map52=00 map53=00 map54=00 map55=00 map56=00 map57=00 map58=00 map59=00 map60=00 map61=00 map62=00 map63=02 key00:000=0000 key00:001=0000 〜〜〜〜中略〜〜〜〜 key00:157=0000 key00:158=0000 key01:000=0000 key01:001=0000 〜〜〜〜中略〜〜〜〜 key01:157=0000 key01:158=0000 key02:000=0000 key02:001=0000 〜〜〜〜中略〜〜〜〜 key02:157=0000 key02:158=0000 key03:000=0000 key03:001=0000 〜〜〜〜中略〜〜〜〜 key24:157=0000 key24:158=0000
既存定義を流用して新規に配列を書く場合の注意点。
モードキーの状態はすべて把握しつつ、そのうちいくつかのモードマップを同じキーテーブルへと「リマップ」する、というのが超漢字V(BTRON)のやり方なので、まずその点を把握すること。
それと、「既存定義を流用」する場合には、「既存定義のキーテーブルには、文字配列(NumLockの有無も含む)と制御配列が一緒くたに定義されている」という点にも注意。
たとえば親指シフト系配列を作ろうとする場合、問題になるのは「左(赤)シフトキーと、右(青)シフトキーとが、区別されず同じキーテーブルへとリマップされていること」になる。
この場合、どちらか片方についてはリマップ状態を弄らずに、もう片方だけのリマップ先を弄ってやればいいことになる。
たとえば「106JP/109JPキーボード」かつ「かな入力」のモードでは、実際に使われているキーテーブルは10枚(key00〜key09)のみ。
この状態で、「日本語(かな)モード【+0】」かつ「左(赤)シフトキー【+4】」のみ押下されているときは、map番号でいうところの【map04】になる。デフォルトでは【map04=01】ってかいてあるから、結果として左(赤)シフトキーを押したときには【key01:***】のキーマップが採用される……と。
同じ理由で、「日本語(かな)モード【+0】」かつ「右(青)シフトキー【+8】」のみ押下されているときは、map番号でいうところの【map08】になる。デフォルトでは【map08=01】ってかいてあるから、結果として右(青)シフトキーを押したときにも、左(赤)シフトキーを押したときと区別されることなく【key01:***】のキーマップが採用される……と。
ここまで書けばあとはいらないような気もするのだけれど、とりあえず書いておくと……。
「飛鳥カナ配列、あるいはかえであすか、またはTRONかなをJISキーボードで使いたい」って場合には、少なくとも次の操作が必要になる。
まずは定義の書き出しまで。
- まず小物箱から、「キー配列変更」小物を呼び出す。
- いま調整済みの定義を作って使っている場合には、「右クリック→保存→実身へ保存」として設定をファイルへと保存しておくこと。
- 「右クリック→キーボード→106日本語キーボード」と「右クリック→入力方式→かな入力」と「右クリック→編集→標準キー配列読み込み」をして、設定を一旦リセットする。
- 「□一括変更」が赤く選択されている状態にしてから、次の操作を行う。
- 「無」をドラッグし「左下にある、赤色に太い白抜きの↑(左Shift)」のところでドロップする……この2つが交換される。
- 「変」をドラッグし「中央下にある、赤色に太い白抜きの青色の↑(右Shift)」のところでドロップする……この2つが交換される。
- ここまでやったら「右クリック→保存→実身に保存」とする……名前はデフォルトのままでは紛らわしいので、作ろうとする配列の名前に置き換えておくべき。
次に、定義の改造。
- 左シフトと右シフトを分離するためには、まずキーテーブルを一つ増やす必要がある。先に保存した「新しい配列の名前をつけたファイル」では、先頭の【kana_mode】直下に【table=10】と書かれているので、これを【table=11】に書き換えて、11個目のキーテーブル(key10:000〜key10:158)を使えるようにする。
- つぎに、右シフトか左シフト(実際どちらでもいい)のうち片方を押したときに、新しい11個目のキーテーブル(key10:000〜key10:158)を読み込むように、map**を書き換える。今回はとりあえず「右(青)シフトキー【+8】」を新しい11個目のキーテーブル(key10:000〜key10:158)へと誘導することにして……右シフトだけ押下の場合は【map08】になるので、上から10行目にある【map08=01】という記述を【map08=10】へと書き換える。
- あと、「CapsLock【+2】」が入っていても、同じ文字が出てくれないと困る……ので、8と2を足した結果であるmap10も編集が必要。【map10=03】って書いてあると思うけど、これも先と同じく【map10=10】へと書き換え。
- 「左(赤)シフトキー【+4】」で使われているキーテーブルは【map04=01】と指定されていたので、「key01:000〜key01:158」が実際に使われていることになる。文字領域はいらないにしても、機能キー領域はわざわざ再設定するのが大変なので、「key01:000〜key01:158」までの158行を「トレーへ複写」してから、1650行目近くにある【roma_mode】という記述をさがして「rという文字の左側」にカーソルを置いて、「トレーから複写」をする、と。
- で、ここがいちばん面倒……なのだけれど。【roma_mode】直前にコピーした定義は、158行すべてが「key01:」で始まっている……のだけれど、この158行すべてを「key10:」に書き換えなきゃいけない。ホイールを回すとかしていま貼った定義の先頭を出して、その一行上に書かれている【key09:158=0000】の行で一回マウスをクリックして、その行にカーソルが来るようにする。それから「右クリック→編集→検索/置換」を選んで、検索ワードを「key01:」に&置換ワードを「key10:」としてから、1回「検索」ボタンを押す。その後157回がんばって「置換」を押す。あと1回だけでコピーした部分の置換が終わることを確認してから、最後にもう一回「置換」を押す。そうすると、全く別のところ(たぶん、key00:158=0000の真下にあるkey01:000=0000)が出てくるのだけれど、そこはもう弄ってはダメなところなので、この時点で「検索/置換」は閉じる。
- ここまで終わったら、この編集結果を「右クリック→保存→もとの実身へ」で保存して、この文書を閉じる。
改造した定義を「キー配列変更」小物に読み込ませる。
- 「キー配列変更」小物を立ち上げる。
- 先ほど編集した「新しい配列の名前をつけたファイル」を、「キー配列変更」小物へとドラッグ&ドロップする。
- 「日本語」の状態で「右(青)シフト」だけをONにした時と、「右(青)シフト」&「CapsLock」の2つだけをOnにした時に、キーテーブル「10」が選ばれているという表示が出れば、ようやく左右シフトの分離はできた……と。このとき、「左(赤)シフト」だけをONにした時に出るキーテーブル「01」と見た目は全く同じですが、ここまでの作業をしていれば「きちんと別々のキーテーブルになっている」ので、左右のシフト面を独立して編集することが出来ます。
- もっとも、キー配列の定義自体は、ここが「スタート地点」なのですがorz。
- ここまで来た時点で、ようやく【超漢字(BTRON)で「かえであすか」を定義するためのテスト1。 - 雑記/えもじならべあそび】に書いたデータを埋める準備が出来た、ということ。
以上、たぶん永遠に役立つことはないであろうメモは、ここでおしまい。
疲れた……定義を埋める余力がなくなってしまったようなorz。