XKB를 사용한 다중 수정자 레이어(일본어 키보드)

XKB를 사용한 다중 수정자 레이어(일본어 키보드)

나는 다음 키보드 (HHKB JP)를 가지고 있습니다.

영상

나는 Lubuntu 14.04를 사용하고 있으며 /usr/share/X11/xkb/symbols/us달성하기 위해 편집했습니다.맞춤 레이아웃.

이제 다음 키를 5, 6, 7, ... 및 20 레벨 수정자로 사용하고 싶습니다. (Windows에서는 AutoHotkey를 사용하여 이 작업을 수행했는데 이제는 AutoHotkey 없이는 살 수 없습니다(적어도 일부는).)

여기에 이미지 설명을 입력하세요.

두 가지 질문이 있습니다.

  1. 키보드의 일부 비표준 키에 대한 "이름"이 무엇인지 모르겠습니다(에 추가하기 위해 /usr/share/X11/xkb/symbols/us).
  2. 특히 xkb.xmodmap9

내 질문은 다음과 같습니다

  1. 미스터리 키의 이름/코드(예: )를 어떻게 알 수 있나요 key <AC01>?
  2. 특정 키에 수정자 레이어를 원하는 만큼 추가하는 방법은 무엇입니까?

참고: XKB에서는 이 작업이 불가능할 수 있습니다. 이를 달성할 수 있는 몇 가지 스크립팅 도구가 있다는 사실을 알게 되어 기쁩니다.

답변1

RMLVOXKB 레이아웃은 규칙, 모델, 레이아웃, 변형, 옵션이라는 모델에서 정의됩니다. 시스템 XKB 데이터베이스는 일반적으로 다음 위치에 있습니다 /usr/share/X11/xkb.

/usr/share/X11/xkb/
├── compat       # ??? dark magic here, avoid
├── geometry     # as in physical, eg for generating layout maps
├── keycodes     # helpful for translating keycodes (from xev) to <FOO>
├── rules        # "evdev" is the important one; *.lst & *.xml are descriptions
├── symbols      # main layouts, variants, optional overrides
└── types        # ??? dark magic here, avoid

keycodes디렉토리는정의키 이름은 키가 실제로 생성하는 스캔 코드와 유사하거나 파생됩니다 <CAPS>. 가 표시되면 현재 키맵을 빌드하기 위해 액세스한 파일을 정확하게 표시합니다. 파일과 파일 내의 섹션을 로드하는 중입니다 . 유사한 도구를 사용하여 특정 키가 생성하는 키코드를 확인하는 경우 이러한 파일에는 해당 코드에 매핑된 키 이름이 표시됩니다.<AC01>setxkbmap -query -verbose 10keycodes: evdev+aliases(qwerty)../keycodes/evdevqwerty../keycodes/aliasesxev


수정자 질문이 더 어렵습니다. 참고자료만 본다8ISO 수준, 이것이 XKB 제한인지 아니면 그것을 더 많이 사용하는 일반적인 레이아웃이 아닌지는 확실하지 않습니다. (추가 조사 결과 추가 항목을 추가하려면 XKB 코드를 변경해야 한다고 확신합니다.

            symbol    press this
level 1       a       key
level 2       A       shift+key
level 3       á       <level3>+key
level 4       Á       <level3>+shift+key
level 5       ??      <level5>+key
level 6       ??      <level5>+shift+key
level 7       ??      <level5>+<level3>+key
level 8       ??      <level5>+<level3>+shift+key

보시다시피, 8레벨 레이아웃에는 "새 수정자" 키 역할을 하는 키가 2개뿐입니다. /usr/share/X11/xkb/compat/level5및 를 참조하세요 /usr/share/X11/xkb/types/level5. 레벨 5 이동, 래칭 및 잠금 동작은 에 정의된 기호 옵션을 통해 키에 연결됩니다 /usr/share/X11/xkb/symbols/level5.

스스로 정의한다면level9그런 다음 수정자는 기존 레벨과 결합되어 8개의 추가 레벨을 제공하며, 그 다음에는 또 다른 레벨 수정자가 필요합니다.

            symbol    press this
level 9       ??      <level9>+key
level 10      ??      <level9>+shift+key
level 11      ??      <level9>+<level3>+key
level 12      ??      <level9>+<level3>+shift+key
level 13      ??      <level9>+<level5>+key
level 14      ??      <level9>+<level5>+shift+key
level 15      ??      <level9>+<level5>+<level3>+key
level 16      ??      <level9>+<level5>+<level3>+shift+key

보시다시피, 동시에 많은 키를 누르는 것으로 시작됩니다. 사용잠그다그리고걸쇠바꾸다변화줄일 수는 있겠지만 이는 매우 복잡한 레이아웃이 될 것입니다. 레벨 선택기를 추가하는 것을 상상해 보세요. 각각의 추가 선택기는 기존 레벨을 두 배로 늘립니다.


당신이 구상하는 "수정자"는 특정 레벨을 선택할 수 있으며, 이것이 바로 당신이 너무 많은 레벨이 필요하다고 생각하는 이유입니다. 이와 같이 선택 동작을 정의하고 해당 키의 레벨 3에 배치하면 동작이 level3+key9제공 level14_latch되고 다음에 누르는 키는 해당 키의 레벨 14가 됩니다.

편집하다:또 다른 문제제작에 관해 구체적으로 질문을 받고 ISO_Level4_{Shift,Latch,Lock}시연을 해봤습니다.가짜ISO_Level4_Latch기존 XKB 키 기호 및 작업을 사용합니다. 이 방법은 레벨 4, 6, 7, 8에서 작동합니다.

답변2

오래된 질문이지만 정답이 없고 저만의 이유로 문제에 관심이 있어서 시간을 내어 해결해봤습니다. XKB를 구성하는 것은 까다로울 수 있지만 확실히 완료할 수 있습니다.

첫 번째 질문의 경우 다음 마법 명령을 사용하여 현재 구성된 키보드의 모든 키 이름이 포함된 그림을 생성할 수 있습니다.

setxkbmap -print | xkbcomp - - | xkbprint -color -label name - - | ps2pdf - > keynames.pdf

pdf 파일 keynames.pdf를 확인하세요.

두 번째 질문의 경우 XKB 구성을 더 자세히 살펴봐야 합니다. 나는 정보의 가장 좋은 출처는 다음과 같다고 생각한다.개발자 문서. 즉, 키를 "실제 수정자" 조합에 매핑해야 하며 이러한 조합을 키 수준에 매핑해야 합니다.

기호 파일에서 우리는 예를 들어 다음과 같이 쓰고 싶습니다.

key <AC01>  { [ a, A, b, B, c, C, d, D, e, E, f, F, g, G,
                h, i, j, k, l, m, n, o, p, q, r, s, t, u]}; 

이는 A 버튼에 기호가 있음을 의미합니다.1층에는두번째,두번째세 번째 등은 키를 다양한 수준에 매핑합니다. 그러나 이 예에서 볼 수 있듯이 일부 수정자 키의 경우 다른 모든 레벨이 수정자 키 + Shift 키를 누르는 것과 일치하도록 하는 것이 합리적일 수 있으며 일부 키의 경우 Shift 키를 누르거나 누르지 않으면 동일한 기호가 생성됩니다. 이것이 우리가 달성하려는 것입니다.

XKB는 "실제" 및 "가상" 수정자를 사용하여 수정자 수준을 추적합니다. 가상의 이름은 무엇이든 가질 수 있으며 우리는 16개를 가질 수 있습니다. 그러나 각 키는 "실제" 수정자의 조합과 일치해야 하며, 많은 수의 키를 사용하여 작업하므로 실제 수정자도 즉시 사용할 수 있습니다.

상황을 복잡하게 만들기 위해 Shift, Lock, Control 및 Mod1부터 Mod5까지 8개의 "실제 수정자"의 고정된 목록이 있습니다. 그러나 이들의 조합을 사용할 수 있으므로 이론적으로 키당 2⁸ = 256개의 서로 다른 레벨이 있습니다. 하지만 실제로는 그 중 일부가 이미 운영체제나 프로그램에서 다양하게 사용되고 있기 때문에 선택에 조금은 주의가 필요하다. XKB의 각 키에 대한 기호 수준도 63 또는 64로 제한되어 있지만 사용할 수 있습니다.그룹그 숫자에 4를 곱하세요. 여기서는 그룹을 사용하지 않습니다.

Control 및 Mod1 = Alt 수정자는 운영 체제 및 프로그램에 공통되므로 사용하지 않습니다. Mod4 = Super도 사용되지만 다른 수정자와 함께 사용할 수 있습니다. 우리는 먼저유형수정자 조합을 레벨에 매핑하는 파일입니다. multimod_type이라는 파일에 다음 내용을 작성하고 /usr/share/X11/xkb/types에 넣습니다.

default partial xkb_types "multimod_type" {

 // We use real modifiers Shift, Mod2, Mod3, Mod4, Mod5.
 // Mod1 = Alt, so we do not use this.
 // In addition, Mod4 = Super is used by the OS, which causes
 // problems in four places. 

type "MULTIMOD" {
modifiers = Shift + Mod2 + Mod3 + Mod4 + Mod5;
map[None] = 1;
map[Shift] = 2;
map[Mod2] = 3;
map[Mod2 + Shift] = 4;
map[Mod3] = 5;
map[Mod3 + Shift] = 6;
map[Mod3 + Mod2] = 7;
map[Mod3 + Mod2 + Shift] = 8;
map[Mod4 + Mod3] = 9;
map[Mod4 + Mod3 + Shift] = 10;
map[Mod4 + Mod3 + Mod2] = 11;
map[Mod4 + Mod3 + Mod2 + Shift] = 12;
map[Mod5] = 13;
map[Mod5 + Shift] = 14;
map[Mod5 + Mod2] = 15;
map[Mod5 + Mod2 + Shift] = 16;
map[Mod5 + Mod3] = 17;
map[Mod5 + Mod3 + Shift] = 18;
map[Mod5 + Mod3 + Mod2] = 19;
map[Mod5 + Mod3 + Mod2 + Shift] = 20;
map[Mod5 + Mod4 + Mod3] = 21;
map[Mod5 + Mod4 + Mod3 + Shift] = 22;
map[Mod5 + Mod4 + Mod3 + Mod2] = 23;
map[Mod5 + Mod4 + Mod3 + Mod2 + Shift] = 24;
// Mod4 = Super is used
map[Mod4 + Shift] = 25;
// Mod4 + Mod2 is used
map[Mod4 + Mod2 + Shift] = 26;
// Mod5 + Mod4 is used
map[Mod5 + Mod4 + Shift] = 27;
// Mod5 + Mod4 + Mod2 is used
map[Mod5 + Mod4 + Mod2 + Shift] = 28;
// Level names are only for description. The values are not used.
level_name[1] = "Base";
level_name[2] = "Shift";
level_name[3] = "Alt1";
level_name[4] = "Alt1 + Shift";
level_name[5] = "Alt2";
level_name[6] = "Alt2 + Shift";
level_name[7] = "Alt3";
level_name[8] = "Alt3 + Shift";
level_name[9] = "Alt4";
level_name[10] = "Alt4 + Shift";
level_name[11] = "Alt5";
level_name[12] = "Alt5 + Shift";
level_name[13] = "Alt6";
level_name[14] = "Alt6 + Shift";
level_name[15] = "Alt7";
level_name[16] = "Alt8";
level_name[17] = "Alt9";
level_name[18] = "Alt10";
level_name[19] = "Alt11";
level_name[20] = "Alt12";
level_name[21] = "Alt13";
level_name[22] = "Alt14";
level_name[23] = "Alt15";
level_name[24] = "Alt16";
level_name[25] = "Alt17";
level_name[26] = "Alt18";
level_name[27] = "Alt19";
level_name[28] = "Alt20";
};
};

이름에서 알 수 있듯이 20개의 추가 정리 버튼이 있으며 그 중 처음 6개는 Shift와 함께 사용할 수 있습니다.

이를 사용하려면 기호 파일의 최소 작업 예제를 수정하십시오. 저는 그것을 multimod_se라고 부릅니다. 평소대로 /usr/share/X11/xkb/symbols에 저장하세요.

default partial alphanumeric_keys xkb_symbols "multimod_se" {

// Include your favourite symbols
include "se"

name[Group1]="Swedish with many modifiers on A";

key.type[Group1] = "MULTIMOD";

key <AC01>  { [ a, A, b, B, c, C, d, D, e, E, f, F, g, G,
                h, i, j, k, l, m, n, o, p, q, r, s, t, u]}; 

// ----- Modifiers -----
key.type = "ONE_LEVEL";
key.repeats = False;

// We will map F1-F10 and 1-9 and 0 to the modifier keys
// The keys F1-F6 produce different symbols with shift pressed
key <FK01> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2)]};
key <FK02> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3)]};
key <FK03> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3)]};
key <FK04> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod4)]};
key <FK05> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod4)]};
key <FK06> { [ Hyper_R ], actions = [SetMods(modifiers=Mod5)]};

// We can bind buttons to include shift in order to get a
// shortcut to a modifier button + shift
key <FK07> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod5)]};
key <FK08> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod5+Shift)]};
key <FK09> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod5)]};
key <FK10> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod5+Shift)]};
key <AE01> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod5)]};
key <AE02> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod5+Shift)]};
key <AE03> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod4+Mod5)]};
key <AE04> { [ Hyper_R ], actions = [SetMods(modifiers=Mod3+Mod4+Mod5+Shift)]};
key <AE05> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod4+Mod5)]};
key <AE06> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod3+Mod4+Mod5+Shift)]};

// The following four must be defined with shift
key <AE07> { [ Hyper_R ], actions = [SetMods(modifiers=Mod4+Shift)]};
key <AE08> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod4+Shift)]};
key <AE09> { [ Hyper_R ], actions = [SetMods(modifiers=Mod4+Mod5+Shift)]};
key <AE10> { [ Hyper_R ], actions = [SetMods(modifiers=Mod2+Mod4+Mod5+Shift)]};
};

이렇게 하면 F1~F10, 1~9 및 0이 추가 수정자 키인 키맵이 생성됩니다. 버튼 A와 함께 누르면 문자 au가 인쇄되고 Shift와 함께 AG도 인쇄됩니다. 명령을 사용하여 유형 파일과 함께 기호 로드

setxkbmap -types complete+multimod_type multimod_se

표준 유형 파일을 포함합니다.충분히포함된 기호 파일의 다른 유형과 함께 ONE_LEVEL 유형을 수정자 키로 사용하기 때문입니다.

일부 의견: 수정자를 처리하는 표준 방법은 규칙을 사용하는 것입니다.호환 가능파일이지만 이를 위해서는 각 수정자 키에 대해 다른 작업을 수행하지 않는 고유 기호가 필요합니다. 위에서 설명한 대로 기호 파일에서 직접 수정자 규칙을 정의하여 이 문제를 해결할 수 있습니다. 보시다시피 모든 수정자 키에는 Hyper_R 기호가 있습니다.

추가 키가 필요한 경우 운영 체제나 프로그램에서 다른 것을 나타내기 위해 사용하지 않는 Mod1, Control 및 Lock의 조합을 포함할 수도 있습니다.

관련 정보