私は 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" };
};