私はずっと英語キーボードを使っています。特に思想上の拘りがあるわけではなくて、慣れているというのが理由。初めて本格的にプログラミングを始めた SUN のワークステーションが英語キーボードったのでした。
日本語キーボード(JIS配列)は、記号(:;+など)の位置が異なっていることと、無変換など余分なキーが付いているところが違う。(これは英国式をベースにしているということのようです。日本には、英式標準にしてしまってマイナーになってしまったもの結構ありますね)
デスクトップでは、キーボードは自分の好きなのを買えば良いので気になりませんが、ラップトップでは日本語キーボードのしか売っていない上に、あっても取り換えが難しいので始末が悪い。(デスクトップで英語キーボードの人は結構多いと思う。海外向けに英語キーボードパーツも生産しているのに、オプションにしてくれないのは不満だ)
おまけに、私はあまりタイピングがうまくないので、交代交代で使っていると英語キーボードまで打てなくなってしまう。
したがって、個人で買う場合にはなんとか英語ノートを探すのであるが、今回会社から支給されたものには選択肢がなかった。
そこで、日本語キーボードを英語キーボードとして使えるように、キーマップを入れ換えてみることにした。 ターゲット環境は Linux(console, X)、Windows2000。
今迄、この方法で、会社支給のパソコンを使ってきましたが、今回のThinkpadを入手したのを期に見直してみました。これは家族が使うので、仮名漢字変換や、Win Key, menu Keyを加えないとならなかったからです。
まず、単純に英語キーマップに近付けることを考える。単にキーボードドライバを入れ替えるだけで は、 '[`]'(grave/backquote)と '[~]' (asciitilde)のキーが なくなってしまう。この不足は、Windowsではまだしも、UNIXを使う上ではありえないため、若干のキーマップ変更は必須である。
さて、どのように変更しようか。
以前、無変換のところに '[`]' '[~]'
があるキーボードを 使っていたことがあり、親指で押せるキーは結構便利に思っていたのと、基本的に「無変換」とかの
Spaceの横にある日本語キーは 使わないので、有効に割り当てようと思っていた。しかし、Xmodemap を眺めていたら、これらに個別の
scancodeを 割り当てているようなので、そのまま生かすことにした。(これを使っているイカしたアプリケーションがあるかもしれない)。
キーが共通なのは英語を生かす (例えば'[6][&]'→'[6] [^]'、
'[^] [~]'→'[=]
[+]'として、 '[`]'、'[~]'
が足りなくて、 '[}]'、'[]]'が余っている。また、
'[¥] [|]'と'[-]
[_]'が あるので、'[¥]'と'[_]'は重複している。また、英語キーボードでは Enter が縦長ではなくて横長なので、日本語キーボードを使うときに '[}][]]'を Enterと間違えて叩いてしまうことが多い。
というわけで、以下のようにすることに決定。
Windows XP以降(Windows 7迄)ではキーボードドライバが、「101/102英語キーボードまたはMicrosoft Natural PS/2キーボード」に統一されていて、日英等の配列の違いはレジストリで設定されるようになっています。
さて、必要なキーですが、このThinkpad R40eは、Win Key、Menu Keyがないので、追加することにします。また、英語キーボード設定にしてみると、[半角/全角]が左上にあって、スキャンコード0x29(英語キーボードでは'[`]' '[~]'を、[無変換]は、0x7B (仮想キーコードVK_OEM_PA1)を、[変換]は0x79 (仮VK_Fn)、[カタカナひらがな]が0x70 を出している。そこで、仮想キーコードVK_OEM_PA1をIMEオン/オフのトグルに使おうと思い設定してみますと、何故か安定して動作しない。(無視されることがある)
そこで更に調査して、「AXキーボード」として使うことにした。こちらには、日本語向けの仮想キーコードを吐くキーがかなり揃っており、「無変換」「変換」「漢字」「カナ」がある。残念ながら「半角/全角」がないのだが、IMEオン/オフのキーとして上記の内から「カタカナ」を流用することにする。
これらを踏まえて、以下のように設定する。
キーボードドライバは、システム設定で変えて下さい。
レジストリをいじらなくてはなりません。具体的には、regedit を立ち上げて、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
に、"Scancode Map"を作成し、hex で以下を書き込みます。
00000000 00000000(手順に関しては下に詳しいのがあります)
06000000 1d003a00
3a001d00 1c002b00
29007300 2b007d00
00000000
と、ここまで書きましたが、「変換」とかのキーが 効いていないようです。使わないので気が付きませんでした。それで構わない方のみ実行して下さい。
これを解決するためには、日本語キーボードドライバから出発しないとならないと思われます。ですが、ここで紹介したレジストリの方法では、shift修飾だけを変えることができなくて、キーを入れ換えることしかできないのです。キーボードドライバを書き直したほうが良いかもしれません。どうもDDKが必要なようで無料では作れないようです。
まず、Linuxのほうですが、こちらXmodmap_jp2us.zipが新しいXmodemapです。なるべく日本語を生かすようにしてみました。使い方は上記の通りです。
次がWindowsになります。Windows XP以降(Windows 7迄)ではキーボードドライバが、「101/102英語キーボードまたはMicrosoft Natural PS/2キーボードとなっているのを確認した後、レジストリを以下のように変更します。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters] "PollingIterations"=dword:00002ee0 "PollingIterationsMaximum"=dword:00002ee0 "ResendIterations"=dword:00000003 "LayerDriver JPN"="KBDAX2.DLL" "LayerDriver KOR"="KBD101A.DLL" "OverrideKeyboardType"=dword:00000007 "OverrideKeyboardSubtype"=dword:00000001 "OverrideKeyboardIdentifier"="PCAT_105KEY"変更が必須なのは、「LayerDriver JPN」と「OverrideKeyboardSubtype」、「OverrideKeyboardIdentifier」が必要なようです。(レジストリファイルi8042prt_param_ax.zipを使って下さい。
次に、scancode Mapをレジストリに入れます。レジストリファイルはjp2ax_reg.zipです。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] "Scancode Map"=hex:00,00,00,00,00,00,00,00,\ 0d,00,00,00,\ 1d,00,3a,00,3a,00,1d,00,\ 1c,00,2b,00,\ 2b,00,7d,00,\ 1d,e0,29,00,\ 29,00,73,00,\ 38,e0,70,00,\ 39,00,79,00,39,00,7b,00,\ 5b,e0,38,e0,\ 5d,e0,1d,e0,\ 5a,00,6a,e0,\ 5b,00,69,e0,\ 00,00,00,00
この後、テキスト サービスと入力言語 → Microsoft Office IME 2010のプロパティ → 全般タブ:編集操作:キー設定:変更 → IME2010 の詳細プロパティ で、「IME-オン/オフ」に設定されている[半角/全角]キーを「カタカナ」キーに変更します。 これにより、「半角/全角」を押すと、かな漢字変換がON/OFFトグルするようになります。
なお、もしもキープリント通りに「変換」「無変換」を設定したい場合は、一部を変えます。[39,00,79,00,39,00,7b,00,] → [5b,00,79,00,5a,00,7b,00,]。
さて、考えた通りのことは概ねできましたが、やっぱりなんだか使い難いなぁ。キートップ印字が違っていること以外は、私としてはこれで充分な感じです。キー数も(無駄に)多いので、色々に設定できて楽しいかも。
※*.zip なファイルは解凍して使って下さい。
検索エンジンからこのページにいらっしゃる方が多いのですが、多分Windowsのキーマップの入れ換え方を捜しているんではないかと 思い、詳細を記載しておきます。
なお、行った変更を元に戻したい場合は、registryから"Scancode Map"のキーを削除します。
構成は、ヘッダと中身、フッタからなります。
項目 |
サイズ |
内容 |
ヘッダ |
LONG x 2 |
全部0 |
データ長 |
LONG |
フッタを含む残りのデータのLONG数 |
データ |
SHORT x 2 |
前SHORT=スキャンコード、後SHORT=キーコード |
データ |
繰り返し |
|
フッタ |
LONG |
全部0 |
記述はLONG(=4バイト)、SHORT(=2バイト)です。注意しなくてはならないのは、Intel CPUはリトルエンディアンなので、byte orderがひっくり返っていることです。[12AB]は、[B,A,2,1]となります。
例を1つ、
この例では、記述は3つで、CapsLock(003A)を左Control(001D)と入れ替え、右ALT(E038)を押すと左WIN(E05B)のキーコードを吐くようにしています。
なお、スキャンコードは、マイクロソフトの文書ms-scancode.pdfに記載されています。最新はMSのサイトscancode.docにあります。