Was ist falsch an diesen XKB-Regeldateien?

Was ist falsch an diesen XKB-Regeldateien?

Ich spiele mit xkeyboard-config. Derzeit versuche ich, die Regeldateien zu verstehen.

Ich habe xkbcompdie aktuelle Tastenbelegung vom X-Server abgerufen und in eine Datei geschrieben. Diese Tastenbelegung ist die Standardtastenbelegung, die ohne Fehler geladen wird, wenn setxkbmapsie 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 setxkbmapund 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 -printOption zu hinzufüge setxkbmapund 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 ( +test2oder +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 -printund 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.

  • %lund %vsind Variablen mit demmüber undgegenariant ( %mkann 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]( %lfunktioniert nicht)
  • Wenn mehrere Layouts/Varianten definiert sind, fügen Sie :2(oder :3oder :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 setxkbmapund 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" };
};

verwandte Informationen