Я играю с 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/rules/current.lst
! layout
current Current Layout
xkb/rules/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
В частности, правая часть =
принимает один аргумент. В !
строке правая часть — это один тип файла — только один из {коды клавиш, типы, совместимость, символы, геометрия} разрешено. В других строках правая часть — это один аргумент, означающий:
- один файл найден втипподкаталог (
test1
) - астрофаопределено в таком файле (
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
являются переменными слайаут ив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" };
};