저는 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
특히 의 오른쪽은 =
단일 인수를 사용합니다. 온라인 !
오른쪽에는 단일 유형의 파일이 있습니다.키코드, 유형, 호환성, 기호, 기하학} 허용된. 다른 줄에서 오른쪽은 단일 매개변수입니다. 즉, 다음을 의미합니다.
- 다음에서 단일 파일이 발견되었습니다.유형하위 디렉토리(
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" };
};