디자인 소프트웨어(예: Blender)와 함께 사용하기 위해 숫자 패드/키패드를 어떻게 에뮬레이션합니까?

디자인 소프트웨어(예: Blender)와 함께 사용하기 위해 숫자 패드/키패드를 어떻게 에뮬레이션합니까?

문제

다음과 같은 특정 소프트웨어를 사용할 때블렌더, 사용자가 디자인 공간에서 방향을 잡는 등의 작업을 수행할 수 있도록 숫자 패드를 사용할 수 있는 것이 중요하지만 많은 노트북에는 실제 숫자 패드가 제공되지 않습니다.. 일반 숫자 막대 입력(키보드 상단에 있는 1-9)이 실제로 컴퓨터에 다른 "기호"를 나타내므로 이러한 종류의 소프트웨어에서는 완전히 다른 기능을 갖는 경우가 많기 때문에 이는 더욱 복잡해집니다.

시도한 솔루션

많은 노트북에는 숫자 패드가 제공되지 않기 때문에많은 플랫폼에서 일반적인 솔루션은 숫자 패드를 에뮬레이트하는 것입니다.예를 들어 키보드의 다른 키를 사용하는 동안 키를 누르고 있으면 됩니다(예: 123456789를 나타내는 jkluio789). 많은 노트북은 BIOS 수준(예: Fn 키 사용)에서 이를 구현합니다. 그러나 이러한 낮은 수준의 구현이 없으면 이 에뮬레이션을 구현하는 것이 매우 어렵습니다.

일부 솔루션은 온라인에 존재하지만디자인 소프트웨어와 함께 사용하기에는 종종 충분하지 않습니다.(올바른 기호를 구현하지 않고 수정자 키를 사용해야 하기 때문) 또는깊이 있게 설명되지는 않네요. 대부분의 솔루션은 다음을 사용하는 데 중점을 둡니다.xkb, 이는 사용을 시작하기가 복잡하고 악명 높은 아키텍처입니다.

좋은 솔루션을 위한 요구 사항

이 문제에 대한 좋은 해결책은 그래픽 소프트웨어가 실제 키패드 입력으로 받아들이고 사용하기 쉬운 에뮬레이트된 키패드가 될 것입니다. 추가적인 제한은 블렌더가 수정자 키(예 Shift: , Alt, Super("Command", "Windows 키" 등) 등 ) 의 사용을 감지한다는 사실입니다. Hyper심지어 xkb수정자가 분명하다고 말하더라도 따라서 "키패드 에뮬레이션을 해석하는 동안" 수정자 키를 사용하는 방법' 솔루션을 완전히 다른 입력으로 사용합니다(예: 단지 가 아닌 [ Numpad1+ ] ). 따라서 이상적인 솔루션은 수정자가 실수로 소프트웨어에 전달되지 않도록 유지 메커니즘(예: Shift 대문자 사용) 대신 잠금 메커니즘(예: Caps Lock 대문자 사용)을 실제로 포함하는 것입니다.AltNumpad1

답변1

빠른 시작

어떤 설명에도 관심이 없다면(말이 너무 길어질 수 있음을 압니다) 다음을 따르십시오.{중괄호 안의 굵은 숫자}일부 단락의 시작 부분에. 각 단계를 순서대로 수행하면 몇 분 안에 구현이 완료될 수 있습니다. 이 가이드에서는 어느 정도 Unix 역량(디렉토리 생성, 파일 생성, sudo루트 액세스 권한 상승 등)을 가정합니다. 또한표시된 경우에만 루트 액세스가 필요합니다sudo이므로 별도로 지시하지 않는 한 사용할 필요가 없습니다 .

솔루션에 대한 일반 설명

우리는 Linux에 "잠금"(예: Caps lock) 숫자 패드 에뮬레이션을 추가하기 위해 xkb를 사용할 것입니다. 내 키 "jkluio789"가 숫자 "123456789"의 숫자 패드 표현과 몇 가지 다른 포함("m,"->"0", "-=[]"->[numpad]")을 나타내기를 원합니다. -+*", "."->[숫자패드]"."). [ Shift+ Mod4+ [key]] 키 조합을 사용하여 이 "숫자 패드 모드"를 전환하겠습니다. 여기서 Mod4내 운영 체제 키의 수정자 코드("Command" 또는 "Windows 키"라고도 하며 때로는 Super또는 수정자 코드에 할당됨 Hyper) 는 다음과 같습니다. , [key]에뮬레이트된 숫자 패드(예: "j" 또는 "[")에 사용되는 키 중 하나입니다. 전체 솔루션을 읽은 후에는 이 설정에 대한 간단한 수정이 비교적 간단할 것입니다.

이를 위해 우리는 키패드 에뮬레이션을 초기화하는 데 사용할 다양한 수정자 키를 해석하는 방법을 xkb에 알려주는 사용자 정의 xkb "유형" 파일과 사용자 정의 xkb "기호" 파일을 정의합니다. 우리가 누르는 키는 정상적으로 작동해야 하며(그룹 1), 숫자 패드 에뮬레이션 중에 키가 어떻게 작동해야 하는지(그룹 2), 두 키 사이를 다시 전환하는 방법(두 그룹 모두에 대한 레벨 3 동작). 마지막으로 새 세션을 시작할 때마다 이를 현재 xkbmap에 통합하여 솔루션을 영구적으로 만들 것입니다 (그래서 업데이트될 sed때마다 솔루션이 지워지지 않도록 ).xkb

솔루션에 대한 자세한 설명

디렉토리 구조

{1}우리가 할 첫 번째 일은 다양한 파일을 보관할 디렉터리를 정의하는 것입니다. 여러분의 디렉터리는 거의 모든 것과 비슷해 보일 수 있지만 내 디렉터리는 다음과 같습니다.

/home
  +-<username>
    +-.xkb
      +-symbols
      +-types
      +-keymap
      +-log

파일 유형

디렉터리 트리가 있으면 솔루션에서 실제 파일을 정의해 보겠습니다. 가장 먼저 할 일은 "유형" 파일을 정의하는 것입니다. 이 파일은 xkb"레벨" 사이를 이동하는 방법( Shift문자를 대문자로 표시하는 방법, 소문자의 첫 번째 레벨에서 대문자의 대문자 레벨로 이동하는 방법 등) 을 알려줍니다 . 이러한 레벨은 특히 영어를 모국어로 사용하는 사람에게는 이해하기 다소 어렵지만, 국제 키보드에서는 이 레벨을 사용하여 발음 구별 기호뿐만 아니라 대체 문자 및 기호에 큰 효과를 줍니다.

우리는 이를 사용하여 키의 변경 사항을 표시하는 방법을 정의할 것입니다. 즉, 수정자를 누르지 않으면 "레벨 1" 동작(보통 "일반 모드"에서는 표준 소문자)이 예상되고, 키를 누르고 있으면 "레벨 2" 동작 Shift(보통 "일반 모드"의 표준 대문자) 및 Shift+ Mod4(키를 수정하는 데 사용될 때 키가 이제 모드 간 전환).

{2}이라는 새 파일을 엽니다 togglekeypad. 다음 코드 블록을 types여기 에 복사하고 \home\<username>\.xkb\types. 참고: "Command"/"Windows 키" 버튼에 해당하는 수정자로 모든 인스턴스를 변경해야 할 수도 있습니다. Mod4(실험이 필요할 수도 있습니다.이 웹페이지는 수정자 키 아래에 있습니다.지침) 또는 원하는 다른 수정자.

partial default xkb_types "togglekeypad" { // Name of this type file
        type "TOGGLEKEYPAD" { // Name of this "type"
                modifiers = Shift+Mod4; // The modifiers that this type concerns itself with
                map[Shift] = level2; // Shift brings us to level 2
                map[Mod4+Shift] = level3; // Windows key plus shift brings us to level 3
                level_name[Level1] = "Base"; // Human-readable names for each level (not really used, but convenient)
                level_name[Level2] = "Shift";
                level_name[Level3] = "Transfer";
        };
};

{삼}또한 이 파일을 디렉토리에 복사해야 합니다 /usr/share/X11/xkb/types/. 이를 위해서는 루트 권한이 필요합니다. 이는 불행하게도 사용자 공간 응용 프로그램의 목적에 어긋나지만 이를 수행하지 않으면 파일을 인식 xkb할 수 없는 것 같습니다 . setxkbmap제안을 환영합니다!

기호 파일

다음으로 할 일은 xkb유형 파일에서 설명한 각 방식으로 수정될 때 각 키가 수행해야 하는 작업을 알려 주는 것입니다.

우리는 기호 파일에서 두 개의 그룹을 사용하고 싶다고 말할 것입니다. 즉, 각 키에는 어떤 방식으로든 전환할 수 있는 두 가지 다른 일반 동작이 있습니다. 이러한 동작은 일반적인 입력 동작과 새로운 숫자 패드 에뮬레이션 동작입니다. 각 키에 대해 1) 유형을 사용하고 싶다고 말하고 TOGGLEKEYPAD, 2) 모든 수준에 대해 두 그룹의 각 물리적 키와 연관된 기호(즉, 컴퓨터가 보는 것)를 정의하고, 3) 다음을 정의합니다. xkb모든 레벨에 걸쳐 두 그룹의 각 키와 관련된 작업(해야 할 특별한 작업)을 정의합니다 . 이것은 다소 혼란스럽게 들리지만 예를 보면 좀 더 이해가 될 것입니다.

아래에 붙여넣은 기호 파일에서 볼 수 있는 첫 번째 키가 <AC07>키입니다. 이는 대부분의 키보드의 "J" 키에 해당합니다.여기 보이는 지도에 따르면(그림 2). 이 물리적 키의 경우 일반 모드에서는 레벨 1(유형 파일에 따라 수정자 없음)에서는 "j"만 입력하고 레벨 2( Shift수정자)에서는 "J"만 입력합니다. 레벨 3에서는 특별한 작업을 수행합니다. 레벨 3과 관련된 기호는 없지만 작업이 있고 해당 작업은 입니다 LockGroup(group=2). 즉, 두 번째 그룹인 "키패드" 그룹으로 변경합니다. 다음 몇 줄을 보면 동일한 키에 대해 그룹 2에 대해 더 많은 기호와 작업이 정의되어 있음을 알 수 있습니다. 레벨 1(수식자 없음)에서는 기호가 없지만 RedirectKey(keycode=<KP1>). 즉, 실제로 <KP1>키패드의 "1"에 해당하는 키를 누른 것처럼 이 키를 등록합니다. (참고: 다시 NoAction()을 넣고 KP_1키에 해당하는 기호인 기호를 사용할 수도 <KP1>있지만 이것이 최고의 호환성을 제공할 것이라고 생각했습니다.) 레벨 2의 경우 동일한 작업을 수행하되 Shift키에 수정자를 추가합니다. 마지막으로 레벨 3에서는 그룹 1, "표준" 모드로 다시 잠깁니다.

{4}이라는 새 파일을 엽니다 togglekeypad_symbols. 다음 코드 블록을 symbols여기 에 복사하고 \home\<username>\.xkb\symbols.

default partial
xkb_symbols "togglekeypad" {
    name[Group1]= "Standard";
    name[Group2]= "Keypad";

    key <AC07> { // J
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ j,  J, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP1>), RedirectKey(keyCode=<KP1>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AC08> { // K
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ k,  K, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP2>), RedirectKey(keyCode=<KP2>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AC09> { // L
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ l,  L, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP3>), RedirectKey(keyCode=<KP3>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD07> { // U
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ u,  U, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP4>), RedirectKey(keyCode=<KP4>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD08> { // I
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ i,  I, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP5>), RedirectKey(keyCode=<KP5>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD09> { // O
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ o,  O, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP6>), RedirectKey(keyCode=<KP6>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE07> { // 7
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 7,  ampersand, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP7>), RedirectKey(keyCode=<KP7>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE08> { // 8
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 8,  asterisk, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP8>), RedirectKey(keyCode=<KP8>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE09> { // 9
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 9,  parenleft, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP9>), RedirectKey(keyCode=<KP9>), LockGroup(group=1)]
    };
    
    // NumLock
    key <AE06> { // 6
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 6,  asciicircum, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<NMLK>), RedirectKey(keyCode=<NMLK>), LockGroup(group=1)]
    };
    
    // Bottom Row (and zero)
    key <AB07> { // M
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ m,  M, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP0>), RedirectKey(keyCode=<KP0>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE10> { // 0
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 0,  parenright, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP0>), RedirectKey(keyCode=<KP0>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AB09> { // .
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ period,  greater, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPDL>), RedirectKey(keyCode=<KPDL>, modifiers=Shift), LockGroup(group=1)]
    };
    
    // Arithmetic Operators
    key <AE11> { // -
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ minus,  underscore, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPSU>), RedirectKey(keyCode=<KPSU>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE12> { // +
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ equal,  plus, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPAD>), RedirectKey(keyCode=<KPAD>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD12> { // [
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ bracketleft,  braceleft, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPDV>), RedirectKey(keyCode=<KPDV>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD12> { // ]
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ bracketright,  braceright, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPMU>), RedirectKey(keyCode=<KPMU>, modifiers=Shift), LockGroup(group=1)]
    };
};

키패드 테스트

{5}키패드 구성을 그대로 테스트하려면 Terminal창을 열고 다음을 입력하세요.

setxkbmap -types complete+togglekeypad -print | sed -e '/xkb_symbols/s/"[[:space:]]/+togglekeypad_symbols(togglekeypad)&/' > $HOME/.xkb/keymap/customMap
xkbcomp -I$HOME/.xkb -R$HOME/.xkb keymap/customMap $DISPLAY

그러면 사용된 유형 (파일의 모든 항목 및 의 유형 파일 포함 )을 설정하는 동안 지도 의 현재 설정 xkb( 사용 )을 가져옵니다 . 그런 다음 이를 에 공급하여 파일의 기호를 사용된 기호 파일에 추가합니다. 마지막으로 새로운 키맵을 컴파일했습니다.setxkbmap - printcomplete+togglekeypad/usr/share/X11/xkb/types/complete/usr/share/X11/xkb/types/togglekeypadsedtogglekeypadtogglekeypad_symbolsxkbcomp

내 컴퓨터에서는 NumLock이 꺼져 있는 것으로 가정하므로(내 컴퓨터에 숫자 패드가 없기 때문에) 숫자 패드 키는 실제로 기본 기능(예: Home, End, PG Up, PG Down 등)을 컴퓨터로 보냅니다. 에뮬레이트된 숫자 패드를 사용할 때 숫자를 입력하려면 Shift를 누르세요. 나는 이 동작을 뒤집기 위해 다양한 방법을 시도했지만( modifers기호 파일의 수준 간 인수 교환, NumLock 키를 에뮬레이트하기 위한 새 키 할당 <NMLK>및 토글) 아직 아무것도 효과가 없었습니다. 하지만 다행스럽게도 Blender에서 테스트했을 때 Shift 키를 누르지 않고도 예상대로 정확하게 작동했습니다.

{6}이 시점에서 상황이 심각하게 잘못되었다면 걱정하지 마세요. 로그아웃/로그인(또는 최악의 경우 다시 시작)하고 디버그하고 다시 시도하세요. 모든 것이 작동한다면 영구적으로 만들겠습니다.

솔루션을 영구적으로 만들기

세션 간에 솔루션을 지속되게 만드는 좀 더 우아한 방법이 있지만, 저에게 가장 쉽고 가장 안정적인 방법은 위의 명령을 파일 끝에 넣는 것이었습니다 ~/.bashrc. 나는여기에 제안된 솔루션약간의 오류 검사를 추가하고 조금 더 추가했습니다(그래서 오류 출력을 볼 수 있습니다).

{7}파일을 엽니다 ~/.bashrc. 끝에 다음 스크립트를 추가합니다.

    # Setup custom keyboard remapping to emulate a number pad when "Shift+Cmd+numap_key" is pressed to initialize
if [ -d $HOME/.xkb/keymap ]; then
  setxkbmap -types complete+togglekeypad -print | \
    sed -e '/xkb_symbols/s/"[[:space:]]/+togglekeypad_symbols(togglekeypad)&/' > $HOME/.xkb/keymap/customMap 2> $HOME/.xkb/log/sedErrors
  xkbcomp -w0 -I$HOME/.xkb -R$HOME/.xkb keymap/customMap $DISPLAY > $HOME/.xkb/log/outputOfCommand 2>&1
fi

{8}다시 시작하면 이제 숫자 패드 에뮬레이션이 영구적으로 적용됩니다!

결론

설명은 길지만, 방법 자체는 비교적 짧습니다. 단점은 Blender가 제대로 작동하려면 잠금 방법이 필요하다는 것입니다. 반면에 저는 그 대신 고정 방법을 선호했으며 xkb어떤 이유로 사용자 정의 유형 파일을 인식하려면 루트 액세스가 필요하다는 점입니다. 그러나 전반적으로 이것은 나에게 잘 작동하는 것 같습니다. 질문이나 제안 사항이 있으시면 아래에 남겨주세요!

관련 정보