XKB: Shift 또는 Ctrl + Numpad = 아래쪽, Shift 없음

XKB: Shift 또는 Ctrl + Numpad = 아래쪽, Shift 없음

2(Numlock이 켜져 있을 때) 2라는 숫자 패드 키가 2를 생성 하도록 키보드를 매핑하고 싶지만 KP_2Shift 또는 Control을 누르면 Down아래쪽 키와 마찬가지로 동일한 키가 이벤트를 생성하기를 원합니다.

그래서 다음 줄을 추가하여 새 유형을 만들었습니다.

    modifiers= Shift+Control+NumLock+LevelThree;
    map[Shift+NumLock]= Level1;
    preserve[Shift+NumLock]= None;
    ...
    map[Control+NumLock]= Level1;
    preserve[Control+NumLock]= None;

따라서 전체 유형은 다음과 같습니다.

type "FOUR_LEVEL_MIXED_KEYPAD_CUST" {
    modifiers= Shift+Control+NumLock+LevelThree;
    map[Shift+NumLock]= Level1;
    preserve[Shift+NumLock]= None;
    map[NumLock]= Level2;
    map[Shift]= Level2;
    map[LevelThree]= Level3;
    map[NumLock+LevelThree]= Level3;
    map[Shift+LevelThree]= Level4;
    map[Shift+NumLock+LevelThree]= Level4;
    map[Control+NumLock]= Level1;
    preserve[Control+NumLock]= None;
    level_name[Level1]= "Base";
    level_name[Level2]= "Number";
    level_name[Level3]= "Alt Base";
    level_name[Level4]= "Shift Alt";
    };

KP_2이를 고려하여 섹션을 변경했습니다 .

    key  <KP2> {
        type= "FOUR_LEVEL_MIXED_KEYPAD_CUST",
        symbols[Group1]= [         Down,            KP_2,           U2193,           U21D3 ]
    };

( 그룹명이 KP_Down바뀐 걸 보고 바꿨어요)Down

xkbcomp preserve_none.xkb $DISPLAY불행하게도 LibreOffice Calc에서 실행 하면 (모두 드롭다운하여 선택했음에도 불구하고 ) Shift + (NumLock) + KP2와 같은 결과가 생성되고 이를 누르면 기본적으로 아무 일도 일어나지 않으며 움직이지도 않습니다.Shift + Downpreserve[...]=NoneCtrl + KP2

내가 뭘 잘못했는지 알아? 감사해요!

참고: 여기에서 전체 파일을 찾을 수 있습니다.http://paste.debian.net/1063341

답변1

글쎄, 나는 이 답변을 기반으로 한 것을 사용하여 해결책을 찾은 것 같습니다.https://superuser.com/questions/801611/how-to-make-all-applications-Respect-my-modified-xkb-layout/1000320#1000320

그래서 우선 왜 그런지는 모르겠지만 가끔은 효과가 type[Group1]=...있는데도 왠지 대신 사용해야 할 것 같습니다.type=...

그런 다음 핵심은 몇 가지 새로운 기호 코드를 도입하는 것입니다(이것이 좋은 단어인지 확실하지 않음) osfDown/osfUp/.... 예를 들어 여기서 기호 코드는 키를 누를 osfLeft때로 해석되어야 한다고 말합니다 <LEFT>. Shift키가 해제되었습니다(적어도 이것이 제가 이해한 것입니다):

    interpret osfLeft {
        repeat= True;
        action = RedirectKey(keycode=<LEFT>, clearmodifiers=Shift);
    };

수정자를 해제하려면 로 Control바꾸 거나 둘 다 지우려는 경우에도 가능합니다. 그런 다음 이전 기호 코드를 방금 만든 코드로 바꿔야 합니다 .ShiftControlControl+ShiftKP_Left

    key  <KP4> {
        type[Group1]= "FOUR_LEVEL_MIXED_KEYPAD",
        symbols[Group1]= [ osfLeft,            KP_4,           U2190,           U21D0 ]
    };

따라서 KP_Left를 생성하는 대신(그리고 궁극적으로 누른 항목에 따라 관련 항목을 생성하는 대신) 수정자를 Shift/Control제거합니다 (다시, 에서 구성한 내용에 따라).Shift/ControlosfLeft

따라서 이 단계의 첫 번째 해결 방법은 다음과 같습니다.

# Load with xkbcomp shift_numpad.xkb $DISPLAY
# List modifiers: xmodmap -pm
xkb_keymap {
    xkb_keycodes { 
        include "evdev+aliases(azerty)"
    };
    xkb_types { 
        include "complete"  
    };
    xkb_compat { 
        include "complete"
        interpret osfLeft {
            repeat True;
            action = RedirectKey(keycode=<LEFT>, clearmodifiers=Shift);
        };
        interpret osfRight {
            repeat= True;
            action = RedirectKey(keycode=<RGHT>, clearmodifiers=Shift);
        };
        interpret osfUp {
            repeat= True;
            action = RedirectKey(keycode=<UP>, clearmodifiers=Shift);
        };
        interpret osfDown {
            repeat= True;
            action = RedirectKey(keycode=<DOWN>, clearmodifiers=Shift);
        };
    };
    xkb_symbols { 
        include "pc+fr(oss)+fr(bepo):2+inet(evdev)+ctrl(swapcaps)"
        key  <KP8> {
            type= "FOUR_LEVEL_MIXED_KEYPAD",
            symbols[Group1]= [ osfUp,            KP_8,           U2191,           U21D1 ]
        };
        key  <KP4> {
            type= "FOUR_LEVEL_MIXED_KEYPAD",
            symbols[Group1]= [ osfLeft,            KP_4,           U2190,           U21D0 ]
        };
        key  <KP5> {
            type= "FOUR_LEVEL_MIXED_KEYPAD",
            symbols[Group1]= [ osfDown,            KP_5,           U2194,           U21D4 ]
        };
        key  <KP6> {
            type= "FOUR_LEVEL_MIXED_KEYPAD",
            symbols[Group1]= [ osfRight,            KP_6,           U2192,           U21D2 ]
        };
        key  <KP2> {
            type= "FOUR_LEVEL_MIXED_KEYPAD",
            symbols[Group1]= [ osfDown,            KP_2,           U2193,           U21D3 ]
        };

    };
    xkb_geometry { 
        include "pc(pc105)" 
    };
};

하지만 유형 "FOUR_LEVEL_MIXED_KEYPAD"에 대해 정의된 것이 없다는 점에 유의 Control하십시오. 제 경우에는 (예: 선택) Shift+2과 같아야 하지만 수정자 없이 a를 생성 해야 합니다. 따라서 수정자를 제거 하고 수정자가 이미 있는 경우 수정자를 유지 하려면 업데이트된 정의가 필요합니다 . 그런 다음 레벨 1에도 매핑되는 사용자 정의 유형을 정의해야 합니다.Shift+DownControl+2DownosfLeftControlShiftCtrl

    type "FOUR_LEVEL_MIXED_KEYPAD_CUST" {
        modifiers= Shift+NumLock+LevelThree+Control;
        map[Shift+NumLock]= Level1;
        map[Control+NumLock]= Level1;
        map[NumLock]= Level2;
        map[Shift]= Level2;
        map[Control]= Level2;
        map[LevelThree]= Level3;
        map[NumLock+LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[Shift+NumLock+LevelThree]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Number";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };

그것들을 합치면 다음과 같은 결과를 얻습니다.

# Load with xkbcomp shift_numpad.xkb $DISPLAY
# List modifiers: xmodmap -pm
xkb_keymap {
    xkb_keycodes { 
        include "evdev+aliases(azerty)"
    };
    xkb_types { 
        include "complete"
        type "FOUR_LEVEL_MIXED_KEYPAD_CUST" {
            modifiers= Shift+NumLock+LevelThree+Control;
            map[Shift+NumLock]= Level1;
            map[Control+NumLock]= Level1;
            map[NumLock]= Level2;
            map[Shift]= Level2;
            map[Control]= Level2;
            map[LevelThree]= Level3;
            map[NumLock+LevelThree]= Level3;
            map[Shift+LevelThree]= Level4;
            map[Shift+NumLock+LevelThree]= Level4;
            level_name[Level1]= "Base";
            level_name[Level2]= "Number";
            level_name[Level3]= "Alt Base";
            level_name[Level4]= "Shift Alt";
        };
    };
    xkb_compat { 
        include "complete"
        interpret osfLeft {
            repeat= True;
            action = RedirectKey(keycode=<LEFT>, clearmodifiers=Control);
        };
        interpret osfRight {
            repeat= True;
            action = RedirectKey(keycode=<RGHT>, clearmodifiers=Control);
        };
        interpret osfUp {
            repeat= True;
            action = RedirectKey(keycode=<UP>, clearmodifiers=Control);
        };
        interpret osfDown {
            repeat= True;
            action = RedirectKey(keycode=<DOWN>, clearmodifiers=Control);
        };
    };
    xkb_symbols { 
        include "pc+fr(oss)+fr(bepo):2+inet(evdev)+ctrl(swapcaps)"
        key  <KP8> {
            type[Group1]= "FOUR_LEVEL_MIXED_KEYPAD_CUST",
            symbols[Group1]= [ osfUp,            KP_8,           U2191,           U21D1 ]
        };
        key  <KP4> {
            type[Group1]= "FOUR_LEVEL_MIXED_KEYPAD_CUST",
            symbols[Group1]= [ osfLeft,            KP_4,           U2190,           U21D0 ]
        };
        key  <KP5> {
            type[Group1]= "FOUR_LEVEL_MIXED_KEYPAD_CUST",
            symbols[Group1]= [ osfDown,            KP_5,           U2194,           U21D4 ]
        };
        key  <KP6> {
            type[Group1]= "FOUR_LEVEL_MIXED_KEYPAD_CUST",
            symbols[Group1]= [ osfRight,            KP_6,           U2192,           U21D2 ]
        };
        key  <KP2> {
            type[Group1]= "FOUR_LEVEL_MIXED_KEYPAD_CUST",
            symbols[Group1]= [ osfDown,            KP_2,           U2193,           U21D3 ]
        };

    };
    xkb_geometry { 
        include "pc(pc105)" 
    };
};

참고: Super/LWIN 키를 사용하려는 경우 정확히 동일하지만 Mod4대신 사용 Shift하고 다음 사항이 있는지 확인하십시오.

            modifier_map Mod4 { <LWIN> };

기호 섹션에서!

관련 정보