Ich spiele mit xkeyboard-config. Derzeit versuche ich, die Regeldateien zu verstehen.
Ich habe xkbcomp
die aktuelle Tastenbelegung vom X-Server abgerufen und in eine Datei geschrieben. Diese Tastenbelegung ist die Standardtastenbelegung, die ohne Fehler geladen wird, wenn setxkbmap
sie ohne Argumente ausgeführt wird. Anschließend habe ich die einzelnen Komponenten in ihre eigenen Dateien gezogen und die Dateien in einer Verzeichnisstruktur abgelegt, die der Verzeichnisstruktur der xkb-Konfiguration ähnelt.
Es sieht aus wie das:
xkb
├── compat
│ └── current
├── geometry
│ └── current
├── keycodes
│ └── current
├── rules
│ ├── current
│ ├── current.lst
│ └── current.xml
├── symbols
│ └── current
└── types
└── current
Ich habe die Dateien im Unterverzeichnis „Regeln“ selbst erstellt, um einen minimalen Satz von Regeldateien zu erstellen, mit denen ein einzelnes Layout geladen werden kann.
Wenn ich auf dieses Verzeichnis zeige setxkbmap
und versuche, die Tastenbelegung dort zu laden, erhalte ich eine Fehlermeldung, obwohl ich den Inhalt der Komponenten überhaupt nicht geändert habe.
$ 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
Wenn ich die Tastenbelegung lade, indem ich die -print
Option zu hinzufüge setxkbmap
und das Ergebnis an weiterleite xkbcomp
, wird die Tastenbelegung ohne Fehler kompiliert und geladen.
Da sich im Vergleich zur Art und Weise, wie der X-Server die Tastenbelegung lädt, und meiner Art und Weise, wie ich die Tastenbelegung lade, nur die verwendeten Regeldateien und die Organisation der Komponenten wesentlich geändert haben, gehe ich davon aus, dass die Fehlerquelle dort liegt. Was ist falsch an dem Setup, das ich erstellt habe? Warum erhalte ich eine Fehlermeldung, wenn ich versuche, die Tastenbelegung mit neu zu laden setxkbmap
?
Als Referenz folgt der Inhalt der Regeldateien.
xkb/Regeln/aktuell
! model layout variant = keycodes types compat symbols geometry
current current current = current current current current current
xkb/Regeln/aktuell.lst
! layout
current Current Layout
xkb/Regeln/aktuell.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>
Antwort1
Ihr Format ist falsch. SieheAbschnitt 4.3 in diesem alten Dokumentoder derRegelabschnitt dieser neueren Version. Doug Palmers unzuverlässiger Leitfadenist etwas veraltet, aber auch eine gute Ressource.
Sie haben Folgendes versucht:
! model layout variant = keycodes types compat symbols geometry
current current current = current current current current current
Insbesondere =
nimmt die rechte Seite ein einzelnes Argument an. In der !
Zeile ist die rechte Seite ein einzelner Dateityp - nur einer von {Tastencodes, Typen, Kompatibilität, Symbole, Geometrie} ist erlaubt. In den anderen Zeilen ist die rechte Seite ein einzelnes Argument, das bedeutet:
- eine einzelne Datei in derTypUnterverzeichnis (
test1
) - AStrophein einer solchen Datei definiert (
test1(foo)
) - eine Ergänzung zu einem früheren Spiel (
+test2
oder+test2(bar)
) - mehrere Dateien/Strophen zusammengefügt (
test1+test1(foo)+test2(bar)+test3(baz)
)
Die linke Seite ist ein Filter; Sie können so viele davon einschließen, wie Sie möchten.
Grundsätzlich erstellen die Regeln für jeden dieser Typen separate Dateisätze.
// 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
Nachdem Sie diese Regeln definiert haben, können Sie damit experimentieren setxkbmap -print
und sie in Aktion sehen:
$ 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" };
};
Dies sind die Grundlagen der Regeln, aber es kann natürlich noch viel komplizierter werden.
%l
und%v
sind Variablen mit demmüber undgegenariant (%m
kann auch verwendet werden für dieMModell)%(v)
setzt die Erweiterung in Klammern und%l%(v)
ergibt solayout(variant)
- Wenn mehrere Layouts/Varianten definiert sind, sind sie als Array zugänglich und Sie müssen einen Index hinzufügen:
%l[1]
(%l
funktioniert nicht) - Wenn mehrere Layouts/Varianten definiert sind, fügen Sie
:2
(oder:3
oder:4
) hinzu, um die geladenen Dateien auf das 2. (oder 3. oder 4.) Layout zu beschränken
Hier ist ein sehr grundlegender Regelabschnitt, der mehrere Layouts ordnungsgemäß einbindet:
// 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
Jetzt können Sie Testlayouts laden setxkbmap
und sehen, dass sie hinzugefügt werden.
$ 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" };
};