linux-keyassign-pseudoHOWTO
Linux キーアサイン うそHOWTO (JF モドキ)

はじめよりも前に (01.05.15)

最近新しく JF に追加された Linux Backspace/Delete mini-HOWTO が面白いので是非読んでください。(これで、このテクストもゴミと化してしまった。)

はじめに

この文書は Linux でキーボードドライバレヴェルでキーアサイン(スキャンコードアサイン)をカスタマイズする方法を解説します。以下英語版 (101) キーボードをベースにしますが、日本語版などでも簡単に応用できるはずです。

Linux のキーアサインに関して正確で詳しい情報は、JFKeyboard-and-Console-HOWTO を参照してください。

なぜ Xkb (xmodmap) ではないのか? いつも xdm からログインして GNOME アプリをガンガン使うような newtype には、すでに余計な話になっているのかもしれません。でもたまにコンソールから emacs 上げて XF86Config 書き変えることあるし、何より Xkb をオフにしておけば (XkbDisable) 、コンソールと X で全く同じキーマップになって気持ちがいいのであります。(なぜキーアサインを変える必要があるのか? これは聞くまでもないでしょう。:-)

ただし少々の危険を伴います。 Xkb なら Ctrl + Alt + Backspace なり再起動なりでコンソールに落ちればとりあえずなんとかできますが、ここで間違えるとひょっとしたらどうにもならなくなるかも知れません。この文書は無保証です(不親切な上に)。

手順

スキャンコードを調べる

コンソール上で showkeys を実行します。キーを押すと press, release ごとにスキャンコード(数字)が表示されます。

これはコンソール上でなければなりません(Keyboard-and-Console-HOWTO 参照)。しかし、このために X を終了してコンソールに落ちるのは手間ですし、調べたコードから kmap を書き変えるのに X があった方が便利ですし、コンソールが1つしかないと、後述の loadkeys を実行した時に kmap ファイルが間違っていた時に結構ブルーなことになります。そこで、仮想コンソールを使うことにしましょう。

仮想コンソールについて、JFLinux-FAQ の7章にちょっと書いてあります。普通は F2 〜 F6 のコンソールが余っているはずなので、Ctrl + Alt + F2~6 を押してどれかに切り替えます。普通、7番に切り替える (Ctrl + Alt + F7) と X に戻ります。

出てきた仮想コンソールにはログインプロンプトが出ているはずなので、一般ユーザでログインして showkeys を実行し、アサインを変えたいキーと変える先のキーを押して数字を覚えておきます。

showkeys 実行中は、showkeys がキー入力の全てを捕捉してしまうので仮想コンソール切り替えできません。10秒経って終了するのを待ちましょう。

kmap ファイルを書き変える

まず、書き変えるベースとなる kmap ファイルを準備します。今使っているものがいいでしょう。場所は(おそらく)ディストリビューションによってまちまちなので、locate jp106 とでもして探します。FTP版 KondaraMNU/Linux 1.2 では /usr/lib/kbd/keymaps/i386/qwerty/ にありました。RedHat 系は同じのようです。us.kmap (英語キーボード)や jp106.kmap (日本語 JIS キーボード)を別名でコピーして叩き台とします。ここでは mykeys.kmap としておきます。gzip 圧縮されていたら、書き変えるために一度解凍しておきます。

普通は書き変えもとのエントリをコメントアウトした後で書き変え先のエントリをコピー&ペーストしてスキャンコードを書き変えもとのものにしておけばいいと思います。例えば CapsLock (58) を左 Ctrl (29) にするときは、keycode 58 の行をコメントアウトしてから keycode 29 のエントリをコピー&ペーストして番号を 58 に書き変えれば OK です。エントリの詳しい説明は man keymaps を参照してください。

loadkeys で読み込む

先ほど使った仮想コンソールで loadkeys mykeys とすると読みこまれます。押してテストしてみましょう。

OS 起動時に読み込む kmap を変える

ここはたぶんディストリビューションによって最も違うところなのではないでしょうか。だから説明しにくいのですけれど、基本は起動時実行スクリプトで上記 loadkeys 実行と同じことをしているはずなので、/etc/rc.d の下あたりで(これすらもディストリビューションによって違う)grep して、sh スクリプトを追ってください。FTP版 Kondara 1.2 では /etc/rc.d/init.d/keytable で loadkeys が実行されていて、そこで読んでいる /etc/sysconfig/keyboard の KEYTABLE= 行を書き変えてうまくいきました。これも、RedHat 系はだいたい同じのようです。

あるいは、 .login なりに loadkeys 実行を書いておくのが簡単でいいかも知れません。

最後に

失敗して、普通のアルファベットが打てなくなったりしたら、(しかもその状態で OS 再起動してしまったら、)結構悲惨な事態になると思います。この文書は無保証です。自己責任でお願いします。まあシングルユーザモードに落ちれば何とかなるでしょう...;(

Windows ならフリーソフトの AltIME を使うとスキャンコード変換できます。その際、レジストリを手で書き換えないといけません。付属文書にやり方が詳しく書いてあります。

ただし、NT 系 (NT4.0SP6 および Win2k で確認) であれば、Caps -> Ctrl くらいならレジストリの書き換えだけでいけます。方法はネット上で多数紹介されているので、探してみてください。くれぐれもキーボードドライバの書き換えはお控え下さい。特に大学とか共用のマシンで。後で使う人が泣きを見ます。
参考: NTのキーマップを変える ツール紹介およびレジストリ書き変えの解説

永野圭一郎 <knagano@sodan.org>