xkb: 기능 키에 새로운 교대 레벨 할당

xkb: 기능 키에 새로운 교대 레벨 할당

기능키를 더 많이 활용하려고 합니다. 창 관리자에서 기능을 할당할 수 있도록 물리적 F1키가 F12나타나기를 원합니다 (예: 을 누를 때마다 활성 채팅 창으로 전환 ).F21F32F21F22

하지만 여전히 일반 기능 키에 액세스하고 싶기 때문에 물리적 Caps Lock키를 누른 상태에서 키 누르기 F1를 생성 할 수 있기를 원합니다. F1다른 수정자에 관한 한 동일하게 유지되면 좋을 것이므로 Shift+ 는 (가 아님 ) F1을 산출합니다 . 간단히 말해서:Shift + F1Shift + F21

  • F1->F21
  • Caps+ F1->F1
  • Shift+ F1-> Shift + F1(변경되지 않음)
  • Alt+ F1-> Alt + F1(변경되지 않음)
  • 등.

따라서 처음 두 점만 기본 레이아웃을 변경하면 됩니다.

다음 XKB 조각으로 이것을 시작하려고 시도했는데 F21F 키를 생성하는 동안 F1누르고 있으면 원래 F 키가 생성되지 않습니다.Caps Lock

partial
xkb_types "hyper" {
    virtual_modifiers Alt,Hyper;
    type "HYPER" {
        modifiers= Hyper+Control+Alt;
        map[Hyper]= Level2;
        map[Control+Alt]= Level3;
        level_name[Level1]= "Extra";
        level_name[Level2]= "Normal";
        level_name[Level3]= "Normal+Ctrl+Alt";
    };
};

partial function_keys
xkb_symbols "hyper_f21" {

    replace key <FK01> {
        type= "HYPER",
        symbols[Group1]= [           F21,             F1, XF86Switch_VT_1 ]
    };
    replace key <FK02> {
        type= "HYPER",
        symbols[Group1]= [           F22,             F2, XF86Switch_VT_2 ]
    };
    ...
};

partial modifier_keys
xkb_symbols "caps_hyper" {
    replace key <CAPS> {
        [ Hyper_L, Hyper_L ]
    };
    modifier_map Lock { <KPDL> };  # Not sure how to clear modifiers, so assign an unused key
    modifier_map Mod3 { <CAPS> };
};

로드하려고 하면 다음 경고가 표시됩니다.

Warning:          Type "HYPER" has 3 levels, but <FK01> has 5 symbols
                  Ignoring extra symbols

<FK01>기본적으로 5개의 레벨이 있지만 3개만 재정의했기 때문에 왜 오류가 발생하는지 정말 이해가 되지 않습니다 .

F21이 구성을 테스트했을 때 물리적 키를 눌렀을 F1Hyper_L(및 Mod3) 설정이 되었는지 확인했습니다 Caps Lock. 그러나 Caps Lock+를 누르면 대신 F1가 생성됩니다 .Mod3 + F21F1

답변1

언제나 그렇듯, 이 문제는 문제가 게시된 직후에 수정되었습니다. 문제는 간단했습니다. Hyper_L에 할당된 기본값을 사용하고 있었습니다. 반대로 Mod4변경하면 작동했습니다. 그러나 실제 수정자가 여전히 필요하기 때문에 여전히 바인딩되어야 합니다 .Caps LockHyper_RMod3

이제 원하는 동작을 생성하는 업데이트된 구성은 다음과 같습니다.

partial
xkb_types "hyper" {
    virtual_modifiers Alt,Hyper;

    type "HYPER" {
        modifiers= Shift+Control+Alt+Hyper;

        map[Shift]= Level2;
        preserve[Shift]= Shift;

        map[Control]= Level2;
        preserve[Control]= Control;

        map[Shift+Control]= Level2;
        preserve[Shift+Control]= Shift+Control;

        map[Alt]= Level2;
        preserve[Alt]= Alt;

        map[Shift+Alt]= Level2;
        preserve[Shift+Alt]= Shift+Alt;

        map[Control+Alt]= Level3;
        preserve[Control+Alt]= Control+Alt;

        map[Shift+Control+Alt]= Level2;
        preserve[Shift+Control+Alt]= Shift+Alt;

        map[Hyper]= Level2;

        level_name[Level1]= "Extra";
        level_name[Level2]= "Normal";
        level_name[Level3]= "Ctrl+Alt";
    };
};


partial function_keys
xkb_symbols "hyper_f21" {

    replace key <FK01> {
        type= "HYPER",
        symbols[Group1]= [           F21,             F1, XF86Switch_VT_1 ]
    };
    replace key <FK02> {
        type= "HYPER",
        symbols[Group1]= [           F22,             F2, XF86Switch_VT_2 ]
    };
    ...
};

partial modifier_keys
xkb_symbols "caps_hyper" {
    replace key <CAPS> {
        [ Hyper_R ]
    };
    # Remove Hyper (Hyper_L/Hyper_R) from Mod4, was added by "pc" layout
    modifier_map none { <HYPR> };
    # Now make physical caps lock (mapped to Hyper_R above) control Mod3.  Mod3 is
    # associated with the virtual modifier "Hyper" because the existing XKB config
    # links Hyper_L and Hyper_R with this virtual modifier.  Therefore Mod3 becomes
    # the virtual modifier "Hyper" because they both share the same keysym Hyper_R.
    modifier_map Mod3 { <CAPS> };
};

다시 말하면 다음과 같습니다.

  • F1->F21
  • Caps+ F1->F1
  • Shift+ F1-> Shift + F1(변경되지 않음)
  • Alt+ F1-> Alt + F1(변경되지 않음)
  • 기타 - 나머지는 변경되지 않음

관련 정보