xkeyboard-config를 사용하고 있습니다. 현재 규칙 파일을 이해하려고 노력 중입니다.
저는 xkbcomp
X 서버에서 현재 키맵을 가져와서 파일에 기록하곤 했습니다. 이 키맵은 setxkbmap
인수 없이 실행될 때 오류 없이 로드되는 기본 키맵입니다 . 그런 다음 개별 구성 요소를 자체 파일로 끌어오고 xkb 구성 디렉터리 구조와 유사한 디렉터리 구조에 파일을 배치했습니다.
다음과 같습니다.
xkb
├── compat
│ └── current
├── geometry
│ └── current
├── keycodes
│ └── current
├── rules
│ ├── current
│ ├── current.lst
│ └── current.xml
├── symbols
│ └── current
└── types
└── current
단일 레이아웃을 로드할 수 있는 최소한의 규칙 파일 세트를 생성하려는 시도로 규칙 하위 디렉토리에 파일을 직접 생성했습니다.
이 디렉토리를 가리키고 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아니면 그이 최신 버전의 규칙 섹션. Doug Palmer의 신뢰할 수 없는 가이드약간 오래되었지만 좋은 자료이기도 합니다.
다음을 시도했습니다.
! model layout variant = keycodes types compat symbols geometry
current current current = current current current current current
특히, 오른쪽에는 =
단일 인수가 사용됩니다. 줄 에서 !
오른쪽은 단일 유형의 파일입니다.키코드, 유형, compat, 기호, 기하학}이 허용됩니다. 다른 줄에서 오른쪽은 다음을 의미하는 단일 인수입니다.
- 에서 발견된 단일 파일유형하위 디렉토리(
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
다음과 같은 변수입니다.엘너와Variant(%m
는 다음에도 사용할 수 있습니다.중오델)%(v)
확장을 괄호로 묶어서%l%(v)
결과를 얻습니다 .layout(variant)
- 여러 레이아웃/변형이 정의된 경우 배열로 액세스할 수 있으며 색인을 추가해야 합니다.
%l[1]
(%l
작동하지 않음) - 여러 레이아웃/변형이 정의된 경우
: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" };
};