XKB 규칙 파일에 어떤 문제가 있나요?

XKB 규칙 파일에 어떤 문제가 있나요?

저는 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" };
};

관련 정보