超漢字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面までしか記述できないため、一つのキーテーブルが複数のマップ(というか、マスク)から呼び出されるように使うことになる。
    • 【key00:000=0000】の数字部分は、はじめがキーテーブル番号(0〜24)を・次がキー位置(0-158)を、最後がTRONコード(の1面にある文字のみ、16進数4桁)をそれぞれ指定する。

 仕様を見ると「かなり複雑な条件で」使い分けるような定義を書くことが出来る(ロマかな/和英/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。

以上、たぶん永遠に役立つことはないであろうメモは、ここでおしまい。

 疲れた……定義を埋める余力がなくなってしまったようなorz。

*1:2008年8月16日18:17:42追記……この記事は、超漢字の体験版しか触ったことのない人間が、超漢字Vのパッケージを開封した初日に書いています。従いまして、超漢字BTRONの作法的に見て変なことを書いていたりするかもしれません……そういった点がありましたら、どうかご容赦いただきたく。