top page > Klaviatur > here

X Window System におけるキーボード


概要

対象は次のようなものです.

  1. キーボードは PC-98 専用,および AT 互換機 (PS/2 および USB)
  2. FreeBSD は 4 系以降
  3. X Window System (XFree86 4 系, X.Org 6 系, 7 系)
    (X.Org 7 系に関しては付け足しのような記述です.そのうち分離したいです.)

目的は次のようなものです.

  1. X Window System におけるキーボードに関する予備知識を提示する.
  2. 標準で用意されていない自前の設定を行なう際の資料を提示する.

私は以下のような改造を XFree86 3.3.6 (FreeBSD 3.4) の頃から始めました. (ここでは XFree86 3 系は取り扱いません. 混乱するので,対比する気も起こりません.) その後 X Window System が大きく変化したこと,私の取り組みが間欠的であったことなどから,知識が少々混乱しています. また,過去にできないと確認したことを新たな環境で試していないなど,動作試験が十分とは言えません. 「できる」と書いてあっても疑う,「できない」と書いてあっても試してみるという姿勢で参考にして下さい.

なお,動作試験をやり直すのは X.Org 6.9.0 でなく X.Org 7 系にてと考えておりますが,まだ install したばかりです.


目次

1. 予備知識
1.1 設定ファイルの構成
1.2 rules の読み方 (1)
1.3 rules の読み方 (2)
1.4 group の記述法
1.5 補足
2. PC-98
3. AT 互換機
4. 参考資料

1. 予備知識

1.1  設定ファイルの構成

X Window System におけるキーボードに関連した設定ファイルは /usr/X11R6/lib/X11/xkb/ の中にあります. 以後の説明では,directory や file はここから参照するものとします. PC-98 と AT 互換機 (us101, jp106) に関連したものは次表のように配置されています. (X.Org 特有のものは赤色で示します.)

directory file(s) 役割
rules xfree86, xorg XF86Config, xorg.conf と以下のファイルを対応付ける.
keycodes xfree98, xfree86 "keycode" と "keycode 名" とを対応付ける.
symbols
symbols/nec
symbols/pc
symbols

jp
pc, jp
jp
"keycode 名" と "keysym 名" とを対応付ける.
PC-98 用.
us101 用.X.Org (6.9.0) jp106 用.
XFree86 や X.Org (6.7.0-6.8.2) の jp106 用.
compat pc98, completeLED 等を設定する.
types complete修飾キーの効き方を設定する.
geometry pc, nec キーボード上のキーの幾何学的な配置を記述する.
keymap xfree98, xfree86 現在の X Window System では使用しません.
compiled 使用していません.
semantics 使用していません.

X.Org 7.4.0 では,一部の構成が変わっています.

directory file(s) 備考
rules base, xorg xorg は base の synbolic link です.
symbols
symbols/nec_vndr
pc, jp
jp
pc はディレクトリーでなくファイルになりました.
ディレクトリー名が nec から変わりました.
compat japanjp106 の [Kana] キーに対応する LED を設定します.

重要な項目は,directory で言えば rules は当然として,あと keycodessymbols です.

1.2  rules の読み方 (1)

X Window System におけるキーボードの設定は,XFree86 の XF86Config および X.Org の xorg.conf の中の次の箇所で行ないます. (以後,ファイルの中身を引用して当方で説明を書き加える際には,矢印 "", "" を用います.)

PC-98 :

Section "InputDevice"
   Identifier "Keyboard1"
   Driver     "keyboard"
   Option     "XkbRules"   "xfree86"    → rules/xfree86 を参照する.
   Option     "XkbModel"   "pc98"
   Option     "XkbLayout"  "nec/jp"     ← "jp" ではないので要注意です.
EndSection

AT 互換機 (jp106), Option "XkbModel", "XkbLayout" の部分のみ :

   Option     "XkbModel"   "jp106"
   Option     "XkbLayout"  "jp"

AT 互換機 (us101), Option "XkbModel", "XkbLayout" の部分のみ :

   Option     "XkbModel"   "pc101"      ← "us101" ではないので要注意です.
   Option     "XkbLayout"  "us"

AT 互換機 (us101), 英語 (us) とドイツ語 (de) を併用する場合.

   Option     "XkbLayout"  "us,de"
   Option     "XkbOptions" "grp:caps_toggle"

AT 互換機 (us101), ロシア語 (ru) を使う場合.

   Option     "XkbLayout"  "ru"
   Option     "XkbOptions" "grp:caps_toggle"

jpru を設定した場合は,自動的に us と併用するように設定されます. 複数の言語を併用する場合に関しては,次節以降で説明します.

なお,これらの例では使いませんでしたが,次のような Option もあります.

   Option     "XkbVariant"

XkbRules は,rules/ の中にある file 名を指定しています. この file はメニューのようなもので,その中から XkbModel, XkbLayout (および XkbVariant, XkbOptions) に記述した内容に応じて,目的ごとに参照する file 名やその file の中の参照先が決まります.

rules/xfree86 の内容から,上述の設定に関連する部分を抜粋すると,次のようになります. ただし複数の言語を併用する場合は除きました. (文字間隔を変えました. また右矢印で参照する file 名を示しました.)

! $pcmodels = pc101 pc102 pc104 pc105

! model              = keycodes                   keycodes/ の中の
  pc98               = xfree98(pc98)           → xfree98(pc98)
  jp106              = xfree86(jp106)          → xfree86(jp106)
  *                  = xfree86                 → xfree86

! model              = geometry                   geometry/ の中の
 $pcmodels           = pc(%m)                  → pc(pc101)
  jp106              = pc(jp106)               → pc(jp106)
  pc98               = nec(pc98)               → nec(pc98)

! model    layout    = symbols                    symbols/ の中の
  pc98     nec/jp    = nec/jp(pc98)            → nec/jp(pc98)
  *        jp        = jp                      → jp
 $pcmodels *         = pc/pc(%m)+pc/%l%(v)     → pc/pc(pc101), pc/us

! model    layout    = compat                     compat/ の中の
  pc98     nec/jp    = pc98(basic)             → pc98(basic)
  *        *         = complete                → complete

! model              = types                      types/ の中の
  *                  = complete                → complete

ここで "*" は正規表現におけるそれと同じ役割であり,例えば "! model = keycodes" の所の model は,上からマッチングしていって,適合しなかったものすべて (この場合には pc101) がここに適合します. また,"$pcmodels" は,= の後に書かれた四組の文字列を統べています.

また,「右辺」の "%m", "%l", "%(v)" は各々 model, layout, () 付きの variant が具体的に展開されます. ((%m) のように (%v) ではない!) 上の例では,variant は設定していないのでそこは Null string になります.

また,xfree86(jp106) のように参照するファイル名の後に () で括られた部分は,そのファイルの中で次のように参照する範囲を限定するために使われています.

xkb_keycodes "jp106" {

一方,xorg.conf では,Option "XkbRules" は次のようにします.

   Option     "XkbRules"   "xorg"       → rules/xorg を参照する.

X.Org 6.9.0 以後の rules/xorg は,上に引用した範囲では rules/xfree86 とは以下の点が異なります.

! model    layout    = symbols                                symbols/ の中の
  *        jp        = pc/pc(pc102)+pc/jp(latin)+pc/jp:2   → pc/pc(pc102), pc/jp

すなわち,jp106 に対して X.Org が使うのは,XFree86 のように symbols/jp でなく symbols/pc/pcsymbols/pc/jp です. ここで pc/jp:2 は,pc/jp の半角カナを group2 に設定するものです.
(ややこしいですが,X.Org においても rules/xfree86 は存在します. ただしそれは rules/xorg の symbolic link,すなわち同一のものです. ここでは rules/xfree86 と書いたら XFree86 のそれしか指さないことにします. )

1.3  rules の読み方 (2)

この節では XkbLayout によって指定する言語について述べます.

unix の command は ASCII code (半角の英数字,記号) で入力するので,英語のような Latin 系の言語は絶対に必要です. したがって,使用する言語の選択には次のような制約があります.

  • Latin 系の言語は,それ単独で使用することができる.
  • 非 Latin 系の言語は,Latin 系の言語と切り換えられる形で併用しなければならない.

ここで「非 Latin 系」の言語は,rules/xfree86rules/xorg の次の部分に列挙されています.

//! $nonlatin = am ar ben bg by dev el ge_la ge_ru guj gur il il_phonetic\
//              ir iu kan lo mk mm ml ori ru sr syr syr_phonetic tel th\
//              tj tml ua

ただし,日本語 (jp) はこの中にありません.[1] 以下では,これらを総称する場合は「非 Latin 系」,区別する必要がある場合には各々 "$nonlatin", "jp" と記すことにします.

実際に XkbLayout で指定する際には,もう少し取り決めや制約が増えます. すなわち,

  • 非 Latin 系は自動的に英語 (us) と組み合わされます. したがって例えば,"us,ru" とか "us,jp" のように us を記述する必要はありません.
    (XFree86 のどの version かは記録に残っていませんが,もっと不親切な時期もありました. うっかり "ru" と指定すると英字が打てなくて command が入力できなくなりました.)
  • 日本語 (jp) は,使える K/B が限られています. (それゆえ $nonlatin に入っていないのです.)

次に,日本語 (jp) を指定する場合の K/B との関係を示します.

  • PC-98 では,"nec/jp" 以外の選択肢はありません.
  • AT 互換機 + jp106 では "jp" 以外の選択肢はありません.[2]
  • us101 にはカナの「ロ」のキーや種々の変換キーがなく,"jp" の内容を完全には実現できません.

rules/xorg の中から AT 互換機に対して今の話題に関連する部分を抜粋すると,次のようになります.
! $nonlatin 以下の三行は行頭の // により comment out されています. そこに列挙された言語を使う場合には,その // をはずします.

jp $nonlatin とは別扱いだったり,それらに対して自動的に us を付加していることが見て取れます. (困ったことに,この記述だと「jp はあらゆる K/B にて指定可能」ということになってしまいます.)

! $nonlatin = am ar ben bg by dev el ge_la ge_ru guj gur il il_phonetic\
              ir iu kan lo mk mm ml ori ru sr syr syr_phonetic tel th\
              tj tml ua

! $pcmodels = pc101 pc102 pc104 pc105

! model    layout    = symbols                               pc/pc は共通な部分です.
  *        jp        = pc/pc(pc102)+pc/jp(latin)+pc/jp:2  → pc/pc, pc/jp
 $pcmodels $nonlatin = pc/pc(%m)+pc/us+pc/%l%(v):2        → pc/pc, pc/us, pc/ru
 $pcmodels *         = pc/pc(%m)+pc/%l%(v)                → pc/pc, pc/us

! option             = symbols
  grp:caps_toggle    = +group(caps_toggle)                → group(caps_toggle)

ここで "group" の "caps_toggle" とは,[CAPS] キーによって Group を切り換えることです. (console における alock に相当します.) こうした場合,本来の [CAPS] の機能は,[SHIFT] + [CAPS] によって実現できます.[3]

[1] X.Org 7.4 では,jp もこの一覧に加えられています.

//! $nonlatin = am ara ben bd bg bt by cs deva ge gh gr guj guru il \
//              in ir iku jp kan kh kr la lao lk mk mm mn mv mal ori pk \
//              ru scc sy syr tel th tj tam ua uz

! model    layout    = symbols
  *        $nonlatin = pc+us+%l%(v):2      ← comment をはずした場合の jp の扱い
  *        *         = pc+%l%(v)           ← comment をはずさない場合の jp の扱い

comment out をはずす必要があるのは AT 互換機 + us101 の場合です. jp106 では,これをはずしてはいけません.
  (PC-98 はこれには無関係です.)
[2] X.Org 7 系では事情が変わっているふしもあるのですが,まだ十分に調べておりません.
[3] X.Org 7.4 では,"caps_toggle" は未だ正常に動かないとのことです.

1.4  group の記述法

symbols の中の file の記述法は,Group の扱いで分類すれば二通りあります.

1. 一つの file に二つ (あるいはさらに多数) の Group を記述する.
  Group 名を記述しない例として symbols/nec/jp の抜粋を示します.

default xkb_symbols "pc98" {

    key <AD01> { [ q, Q        ], [ kana_TA ]  };    ← 二つの [] が,二つの Group に相当する.
    key <AD02> { [ w, W        ], [ kana_TE ]  };

  Group 名を記述する例として symbols/jp の抜粋を示します.

default xkb_symbols "jp106" {
    name[Group1]= "US/ASCII";
    name[Group2]= "Japanese";

    key <AD01> { [ q, Q        ], [ kana_TA ]  };    ← 二つの [] が,二つの Group に対応する.
    key <AD02> { [ w, W        ], [ kana_TE ]  };

2. 一つの file に一つの Group のみを記述し,複数の file を組み合わせて複数の Group を実現する.
 上記の例 Option "XkbLayout" "ru" では,以下の二つの file を組み合わせます.
 以下に symbols/pc/us の抜粋を示します.

    name[Group1]= "U.S. English";

    // Alphanumeric section
    key <TLDE> {       [     grave,    asciitilde      ]       };
    key <AD01> {       [         q,    Q               ]       };
    key <AD02> {       [         w,    W               ]       };

 また,以下に symbols/pc/ru の抜粋を示します.

    name[Group1]= "Russia";

    key <TLDE> {       [     Cyrillic_io,     Cyrillic_IO      ]       };
    key <AD01> {       [ Cyrillic_shorti, Cyrillic_SHORTI      ]       };
    key <AD02> {       [    Cyrillic_tse,    Cyrillic_TSE      ]       };

 ついでに,以下に symbols/pc/jp の抜粋を示します. (X.Org 6.9.0 以降.)

    name[Group1]= "Japan";

    key <AD01> {       [ kana_TA              ]       };
    key <AD02> {       [ kana_TE              ]       };

1.5  補足

/usr/X11R6/lib/X11/xkb には,各々の directory の内容を示す,拡張子 .dir の付いた file があります. これは単なる directory/file 名の一覧表ではないので,更新する方法がわかりません. ただ,これを更新しなくても,また消してしまっても,なぜか (現時点では) 問題は生じておりません.

2. PC-98

ここでは,PC-98 にて英日以外の言語を扱えるようにするための指針を示します.

標準で用意されているのは「英語 + 日本語」環境のみです. (「日本語」と言っても,かなのみですが.[1]) 日本語以外の言語を使いたければ,次の選択肢があります. いずれにしても,すべて自力でやる必要があります.

  1. symbols/nec/jp と同じ書式で,その言語に対応する file を作成する.
  2. us101 のように,単一の Group を記述した file を複数用意する形式にする.

参考までに,私は両方のやり方を試しています.

1. の場合,jp そのものを書き直すか,または jp も新たな file も別の名にして,それらを jp の symbolic link として切り換えるようにすると,それ以外の変更が不要なので圧倒的に楽です.

1. の場合だが XF86Configxorg.confOption "XkbLayout" を使って切り換えたいのならば,または 2. の場合には,rules/xfree86 または rules/xorg の書き換えが必要になります. これらの内容は極めて複雑なので [2],先ず PC-98 専用に抜粋した file を作ってからそれを書き換える方が合理的でしょう.

後者の方法に基づく改良例の入ったファイルを,L'Internationale の localization にて配布しています.

なお,Group の切り換えには AT 互換機のように Option "XkbOptions" "grp:caps_toggle" は必要なく,その機能は既に [かな] (Mode_switch) で実現できています.

[1] [かな] が ON の場合,かな入力の状態になり,次のように動作します.

私はローマ字入力しかできないので,これ以上追求するつもりはありません.

[2] 以前のこの file の中身は極めて単純だったので,PC-98 と AT 互換機のための記述が無理なく共存できました. 今なら rules/xfree98 とかを作って分離した方が合理的でしょう.

3. AT 互換機

ここでは,AT 互換機にてその標準以外の言語を扱えるようにするための指針を示します.

us101 は標準で多くの言語に対応されています. 従って,この K/B を選択することができる状況にあるならば,そうするのが一番楽です. ただし,jp には未対応です.

一方 jp106 ですが,少なくとも XFree86 や X.Org (6.7.0-6.8.2) では日本語以外の対応がなされていません. これを使いたいのであれば,必要なことは前節の PC-98 と同様です. また,せっかく us101 にない種々の「変換キー」があるのですから,先述の例のように Group の切り換えのために [CAPS] を潰すのでなく,それらのキーを利用した方が良いでしょう.

なお,PC-98 配列 K/B を使う場合には,既存の設定ファイルを改変するのでなく,別の名前で専用のものを作成した方が良いでしょう. 特に,X.Org 6.9.0 からは従来一つであった設定ファイル (symbols/jp) が複数 (symbols/pc/pc,jp) になっており,修正が面倒なので,この K/B だけ単一ファイルの形式に戻すことを検討しても良いでしょう.

4. 参考資料

X.Org 6.9.0 の文書 xorg-documents-6.9.0.tbzpkg_add すると,XKB に関連した文書として二ヶ所に二つのファイルが置かれますが,内容は header 部分を除いて同一です.

XFree86 ですが,少なくとも 4.3.0 以後はこれらと同名のファイルが同じところに置かれています.
大抵の目的に対してはこれらの文書で十分だと思います.

なお,これらには二つの URL が書かれていますが,要注意です. (ここからの link は張りません.)

一方,X Window System の source の中には ports/packages の一部として install されない,FreeBSD user にとって隠された文書もあります.

XFree86 4.4.0 の source の一部 (XFree86-4.4.0-src-7.tgz) を解凍すると,xc/doc/hardcopy/XKB の中に XKBproto.ps.gz, XKBlib.ps.gz があります. こちらの方が上記の資料よりも詳しいですが,逆に分量が多過ぎるのが難点です. それと,日付が少々古い (1998.9.27) ことも気になります.
なお,XFree86 4.7.0 (XFree86-4.7.0-src-7.tgz) にも同じ文書がありますが,日付も内容も同じです.

一方,X.Org 6.9.0 (X11R6.9.0-src7.tar.gz) にも同じ文書があります. これらの日付は 2003.11.15 ですが,内容は XFree86 のものと同じです. (file size まで一緒!)

X.Org 7 系では配布ファイルの形態も配布物も置き場も大きく変更されました.