これらの XKB ルール ファイルの何が問題なのでしょうか?

これらの XKB ルール ファイルの何が問題なのでしょうか?

私は xkeyboard-config で遊んでいます。現在、ルール ファイルを理解しようとしています。

xkbcomp私は、X サーバーから現在のキーマップを取得してファイルに書き込むために使用しました。このキーマップはデフォルトのキーマップであり、引数なしでsetxkbmap実行するとエラーなしでロードされます。次に、個々のコンポーネントを独自のファイルに取り出し、そのファイルを xkb config ディレクトリ構造に似たディレクトリ構造に配置しました。

次のようになります:

xkb
├── compat
│   └── current
├── geometry
│   └── current
├── keycodes
│   └── current
├── rules
│   ├── current
│   ├── current.lst
│   └── current.xml
├── symbols
│   └── current
└── types
    └── current

単一のレイアウトをロードできる最小限のルール ファイル セットを作成するために、rules サブディレクトリにファイルを自分で作成しました。

このディレクトリを指定しsetxkbmapてキーマップをロードしようとすると、コンポーネントの内容をまったく変更していないにもかかわらず、エラーが発生します。

$ setxkbmap -Ixkb -v 10 -rules current -layout current -model current -variant current
Setting verbose level to 10
locale is C
Warning! Multiple definitions of rules file
         Using command line, ignoring X server
Warning! Multiple definitions of keyboard model
         Using command line, ignoring X server
Warning! Multiple definitions of keyboard layout
         Using command line, ignoring X server
Trying to load rules file ./rules/current...
Trying to load rules file /usr/share/X11/xkb/rules/current...
Trying to load rules file xkb/rules/current...
Success.
Applied rules from current:
rules:      current
model:      current
layout:     current
variant:    current
Trying to build keymap using the following components:
keycodes:   current
types:      current
compat:     current
symbols:    current
geometry:   current
Error loading new keyboard description

-printオプションを に追加してキーマップをロードしsetxkbmap、その結果を にパイプするとxkbcomp、キーマップはエラーなしでコンパイルされ、ロードされます。

X サーバーがキーマップをロードする方法と私がキーマップをロードする方法で大幅に変更されたのは、使用されているルール ファイルとコンポーネントの構成だけなので、エラーの原因はそこにあると推測しています。作成したセットアップの何が問題なのでしょうか? を使用してキーマップを再ロードしようとすると、なぜエラーが発生するのでしょうかsetxkbmap?

参考までに、ルール ファイルの内容を以下に示します。

xkb/ルール/現在

! model layout variant = keycodes types compat symbols geometry
  current current current = current current current current current

xkb/ルール/current.lst

! layout
  current Current Layout

xkb/ルール/current.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xkbConfigRegistry SYSTEM "xkb.dtd">
<xkbConfigRegistry version="1.1">
  <modelList>
    <model>
      <configItem>
        <name>current</name>
        <description>Current Model</description>
        <vendor>Zistack</vendor>
      </configItem>
    </model>
  </modelList>
  <layoutList>
    <layout>
      <configItem>
        <name>current</name>
        <description>Current Layout</description>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>current</name>
            <shortDescription>current</shortDescription>
            <description>current</description>
            <languageList>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
  </layoutList>
</xkbConfigRegistry>

答え1

フォーマットが間違っています。この古いドキュメントのセクション4.3またはこの新しいバージョンのルールセクションダグ・パーマーの信頼できないガイド少し古いですが、良いリソースでもあります。

試みたこと:

! model layout variant = keycodes types compat symbols geometry
  current current current = current current current current current

具体的には、 の右側には=1 つの引数があります。!行の右側には、1 つのファイル タイプ ({キーコード、タイプ、互換性、シンボル、ジオメトリ} が許可されます。他の行では、右側は単一の引数であり、次の意味を持ちます。

  • 見つかった1つのファイルタイプサブディレクトリ ( test1)
  • 1つのスタンザこのようなファイルで定義される(test1(foo)
  • 以前の一致への追加(+test2または+test2(bar)
  • 複数のファイル/スタンザを結合する ( test1+test1(foo)+test2(bar)+test3(baz))

左側はフィルターです。フィルターは必要な数だけ含めることができます。

基本的に、ルールはそれぞれのタイプごとに個別のファイルセットを構築します。

// KEYCODES SECTION
// load keycodes based on model specified
! model = keycodes
  test1  = test1
// ^^^^^^^^^^^^^^ 
//        "if model=test1, 
//         load the default in the file keycodes/test1"

// load keycodes based on layout specified
! layout = keycodes
  test1  = +test1(us)
// ^^^^^^^^^^^^^^
//        "if layout=test1, 
//         also load stanza "us" in the file keycodes/test1"


// all at once
! model layout variant option = keycodes
  test2 test2  test2   test2  = test1+test1(de)+test1(var2)+test1(opt2)
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//        "if model=test2 and layout=test2 and... ,
//         load the default stanza in file keycodes/test1,
//         then load stanza "de" in file keycodes/test1, ...


////////////////
// GEOMETRY SECTION
// load geometry based on model specified
! model = geometry
  test1 = test1
  *     = test3  // any other model

setxkbmap -printこれらのルールを定義したら、実際にルールが機能しているかどうか確認してみましょう。

$ setxkbmap -I/path/to/my/xkb -rules test1 -model test1 -print
xkb_keymap {
        xkb_keycodes  { include "test1" };
        xkb_geometry  { include "test1" };
};
// no xkb_symbols or other sections of the map with only the rules above

$ setxkbmap -I/path/to/my/xkb -rules test2 -model test1 -layout test1 -print
xkb_keymap {
        xkb_keycodes  { include "test1+test1(us)"       };
        xkb_geometry  { include "test1" };
};

$ setxkbmap -I/path/to/my/xkb -rules test2 -model test2 -layout test2 -variant test2 -option test2 -print
xkb_keymap {
        xkb_keycodes  { include "test1+test1(us)+test1(var1)+test1(opt2)" };
        xkb_geometry  { include "test3" };
};

これがルールの仕組みの基本ですが、もちろん、さらに複雑になることもあります。

  • %l%vおよびは、lアユウトとariant(%mまた、メートルオデル)
  • %(v)展開を括弧で囲むと%l%(v)layout(variant)
  • 複数のレイアウト/バリアントが定義されている場合は、配列としてアクセスでき、インデックスを追加する必要があります: %l[1](%lは機能しません )
  • 複数のレイアウト/バリアントが定義されている場合は、:2(または:3または:4)を追加して、ロードされるファイルを2番目(または3番目または4番目)のレイアウトに制限します。

複数のレイアウトを適切に取り込むための非常に基本的なルール セクションを次に示します。

// setxkbmap -layout foo -variant foo1
! model    layout      =   symbols                                                                                                                                         
   *       *           =   %l%(v)                                                                                                                                                   

// setxkbmap -layout foo,bar -variant foo1,bar1                                                                                                                                                                                     
! model   layout[1]    =   symbols                                                                                                                                         
   *       *           =   %l[1]%(v[1])                                                                                                                                             

// setxkbmap -layout foo,bar -variant foo1,bar1                                                                                                                                                                                     
! model   layout[2]    =   symbols                                                                                                                                                 
   *       *           =   +%l[2]%(v[2]):2                                                                                                                                             

// setxkbmap -layout foo,bar,baz -variant foo1,bar1,baz1                                                                                                                                                                                     
! model   layout[3]    =   symbols                                                                                                                                                 
   *       *           =   +%l[3]%(v[3]):3                                                                                                                                             

// setxkbmap -layout foo,bar,baz,bat -variant foo1,bar1,baz1,bat1                                                                                                                                                                                     
 ! model   layout[4]   =   symbols                                                                                                                                             
   *       *           =   +%l[4]%(v[4]):4

これで、テストレイアウトをロードしてsetxkbmap、追加されていることを確認できます。

$ setxkbmap -I/path/to/my/xkb -rules test -model test1 \
            -layout test1,test2,test3                  \
            -variant test1,testA,testB -print
xkb_keymap {
        xkb_keycodes  { include "test1+test1(us)" };
        xkb_symbols   { include "test1(test1)+test2(testA):2+test3(testB):3" };
        xkb_geometry  { include "test1" };
};

関連情報