질문
특정 소프트웨어를 사용할 때.믹서, 사용자가 디자인 공간에서 위치 지정과 같은 작업을 수행할 수 있기 때문에 숫자 키패드를 사용할 수 있다는 것이 중요하지만 많은 노트북에는 실제 숫자 키패드가 제공되지 않습니다.. 이는 일반 숫자 막대 입력(키보드 상단의 1-9)이 실제로 컴퓨터에 다른 "기호"를 나타내므로 이러한 소프트웨어에서 완전히 다른 기능을 갖는 경우가 많기 때문에 더욱 복잡해집니다.
시도해 볼 수 있는 솔루션
노트북에는 숫자 키보드가 없는 경우가 많기 때문에많은 플랫폼에서 일반적인 솔루션은 숫자 패드를 에뮬레이트하는 것입니다., 예를 들어 키보드의 다른 키를 사용하는 동안 키를 누르고 있는 것과 같습니다(예: jkluio789는 123456789를 나타냄). 많은 노트북은 BIOS 수준에서 이 기능을 구현합니다(예: Fn 키 사용). 그러나 이러한 낮은 수준의 구현 없이는 이 시뮬레이션을 구현하는 것이 매우 어렵습니다.
온라인에는 몇 가지 해결 방법이 있지만디자인 소프트웨어와 함께 사용하기에는 부족한 경우가 많습니다.(올바른 기호를 구현하지 않고 수정자 키를 사용해야 하기 때문입니다) 또는깊게 설명하지 않았는데. 대부분의 솔루션은 다음을 사용하는 데 중점을 둡니다.xkb, 이는 시작하기 복잡하고 매우 어려운 아키텍처입니다.
좋은 솔루션을 위한 요구 사항
이 문제에 대한 좋은 해결책은 그래픽 소프트웨어가 실제 키보드 입력으로 처리하고 사용하기 쉬운 시뮬레이션 키보드를 사용하는 것입니다. 또 다른 제한은 블렌더가 Shift
명시적인 수정자 키에 대해 말해도 수정자 키(예: "Command", "Windows 키" 등)의 사용을 감지하므로 "수정자 키를 누른 상태에서 키보드 시뮬레이션"을 수행한다는 것입니다. 솔루션은 완전히 다른 입력(즉, 단지 가 아닌 [ + ])으로 해석됩니다. 따라서 이상적인 솔루션은 실제로 유지 메커니즘(예: Shift 대문자)보다는 잠금 메커니즘(예: Caps Lock 대문자)을 포함하므로 수정자 키가 없습니다. 실수로 소프트웨어에 전달되었습니다.Alt
Super
Hyper
xkb
Numpad1
Alt
Numpad1
답변1
빠른 시작
설명이 필요하지 않다면(말이 너무 길어질 수 있다는 걸 압니다) 그냥 따라오세요{중괄호 안의 굵은 숫자}특정 단락의 시작 부분에. 각 단계를 순서대로 수행하면 아마도 몇 분 안에 이를 달성할 수 있습니다. 이 가이드에서는 사용자가 어느 정도 Unix에 능숙하다고 가정합니다(디렉토리 생성, 파일 생성, sudo
루트 액세스 권한 상승 등). 또한 참고하시기 바랍니다루트 액세스는 지정된 상황에서만 필요합니다.sudo
이므로 별도로 지시하지 않는 한 사용할 필요가 없습니다.
솔루션에 대한 일반적인 설명
xkb를 사용하여 "잠긴"(예: Caps Lock) 숫자 키보드 에뮬레이션을 Linux에 추가합니다. 내 키 "jkluio789"가 다른 포함("m,"->"0", "-=[]"->[numpad]"-+와 함께 숫자 "123456789"의 숫자 키패드 표현을 나타내기를 원합니다) *" , "."->[숫자 패드]"."). [ Shift
+ Mod4
+ ] 키 조합을 사용하여 [key]
이 "숫자 패드 모드"를 전환 하겠습니다 . 여기서 Mod4
내 운영 체제 키의 수정자 코드("Command" 또는 "Windows 키"라고도 하며 때로는 Super
또는 수정자 코드 에 할당됨 Hyper
) 가 있습니다. , [key]
시뮬레이션된 숫자 패드(예: "j" 또는 "[")에 사용되는 키입니다. 전체 솔루션을 읽은 후 이 설정을 간단히 수정하면 비교적 간단해집니다.
이를 위해 키보드 시뮬레이션을 초기화하는 데 사용할 다양한 수정자 키를 해석하는 방법을 xkb에 알려주는 사용자 정의 xkb "유형" 파일과 키를 누를 때마다 xkb에 알려주는 사용자 정의 xkb "기호" 파일을 정의합니다. 아래의 키는 정상적으로 작동해야 하며(그룹 1), 숫자 키패드 에뮬레이션 중에 키가 어떻게 작동해야 하는지(그룹 2), 두 키 사이를 전환하는 방법(두 그룹 모두에 대한 레벨 3 작동). 마지막으로 새 세션이 시작될 때마다 솔루션을 현재 xkbmap에 통합하여 솔루션을 영구적으로 만들 것입니다 sed
(그래서 xkb
업데이트할 때마다 솔루션이 삭제되지 않습니다).
솔루션 세부정보
디렉토리 구조
{1}가장 먼저 해야 할 일은 다양한 파일을 보관할 디렉터리를 정의하는 것입니다. 귀하의 디렉터리는 거의 모든 디렉터리가 될 수 있지만 내 디렉터리는 다음과 같습니다.
/home
+-<username>
+-.xkb
+-symbols
+-types
+-keymap
+-log
유형 파일
디렉터리 트리가 있으면 솔루션에서 실제 파일을 정의할 수 있습니다. 가장 먼저 해야 할 일은 "유형" 파일을 정의하는 것입니다. 이 파일은 "레벨" 사이를 이동하는 방법을 알려줍니다 (예: 소문자의 첫 번째 레벨에서 대문자의 대문자 레벨로 문자를 대문자로 시작하는 xkb
방법 ). Shift
이러한 레벨은 특히 영어 원어민의 경우 마스터하기가 다소 어렵지만, 국제 키보드에서는 이 레벨을 사용하여 발음 구별 부호뿐만 아니라 대체 문자 및 기호에 큰 효과를 줍니다.
이를 사용하여 키에 대한 변경 사항을 표시하는 방법을 정의합니다. 즉, 수정자 키를 누르지 않으면 "레벨 1" 동작(보통 "일반 모드"에서는 표준 소문자)이 예상되고, 키를 누르고 있으면 "레벨 2" 동작 Shift
(일반적으로 "레벨 2" 동작)이 예상된다고 말합니다. , "일반 모드"의 표준 캡) 및 Shift
+를 동시에 누를 때의 "레벨 3" 동작 Mod4
(우리의 목적상 이것은 특별한 경우이며 키를 수정하는 데 사용될 때 해당 키가 이제 모드 간에 전환됩니다).
{2}새 파일을 열고 이름을 로 지정합니다 togglekeypad
. 다음 코드 블록을 복사하여 types
디렉터리 에 저장합니다. 참고: 모든 인스턴스를 모든 수정자에 해당하는 Command/Windows 키 버튼 \home\<username>\.xkb\types
으로 변경해야 할 수도 있습니다.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
모든 작업을 수행합니다. 모든 수준에서 두 그룹의 각 키(수행해야 하는 특수 작업)와 관련된 키가 정의됩니다 . 꽤 혼란스럽게 들리지만, 예를 보면 더 이해가 될 것입니다.
아래에 붙여넣은 기호 파일에서 볼 수 있는 첫 번째 키는 key 입니다 <AC07>
. 이는 대부분의 키보드의 "J" 키에 해당합니다.여기 보이는 지도에 따르면(그림 2). 이 물리적 키의 경우 일반 모드에서는 레벨 1(유형 파일에 따라 수정자 없음)에서는 "j"만 입력하고, 레벨 2( Shift
수정자)에서는 "J"만 입력합니다. 레벨 3에서는 특별한 작업을 수행합니다. 레벨 3과 관련된 기호는 없지만 에 대한 작업이 있습니다 LockGroup(group=2)
. 즉, 두 번째 그룹인 "Keyboard" 그룹으로 이동해 보겠습니다. 다음 몇 줄을 보면 동일한 키의 그룹 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 - print
)을 가져오고 지도에 사용되는 유형 complete+togglekeypad
(파일 /usr/share/X11/xkb/types/complete
에 있는 유형 파일을 포함하여 파일의 모든 것 /usr/share/X11/xkb/types/togglekeypad
)도 설정됩니다. 그런 다음 이를 로 가져와 파일의 기호를 사용된 기호 파일에 추가 sed
합니다 . 마지막으로 이를 사용하여 새 키맵을 컴파일합니다.togglekeypad
togglekeypad_symbols
xkbcomp
내 컴퓨터에서는 NumLock이 꺼져 있는 것으로 가정하므로(컴퓨터에 숫자 패드가 없기 때문에) 숫자 패드 키는 실제로 Home, End, PG Up, PG Down To와 같은 주요 기능을 컴퓨터로 보냅니다. 아날로그 숫자 키보드를 사용하여 숫자를 입력하고 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
어떤 이유로 사용자 정의 유형 파일을 인식하려면 루트 액세스가 필요합니다. 그러나 전반적으로 이것은 나에게 잘 맞는 것 같습니다. 질문이나 제안 사항이 있으시면 아래에 댓글을 남겨주세요!