키보드 레이아웃에 더 많은 레벨을 추가하고 싶어서 level5 키를 활성화하기로 결정했습니다. 레벨3을 설정했고 Menu
RAlt를 ISO_Level5_Shift에 매핑하고 싶습니다.
그러나 setxkbmap
선택의 여지가 없습니다. /usr/share/X11/xkb/rules/evdev.lst
lv5 스위치에 대한 다음 옵션만 포함됩니다.
lv5:lsgt_switch_lock
lv5:ralt_switch_lock
lv5:lwin_switch_lock
lv5:rwin_switch_lock
단순 키 매핑은 불가능한 것 같습니다. 이것은 이미 문제를 암시했습니다. 내부적으로 무슨 일이 일어나고 있는지 알면 setxkbmap
lv5 스위치를 활성화하고 오른쪽으로 설정하는 옵션을 쉽게 구성할 수 있습니다 Alt
.
-option "lv5:ralt_switch"
그리고 setxkbmap
이 옵션을 선택하고 성공적으로 반환되었음에도 불구하고 매핑이 없습니다.
비슷한 질문에 대한 답을 찾은 후여기사용자 정의 파일을 만들었습니다 xkbcomp
.
xkb_keymap {
xkb_geometry {
include "pc(pc104)"
};
xkb_keycodes {
include "evdev"
include "aliases(qwerty)"
};
xkb_types {
include "complete"
};
xkb_compatibility {
include "complete"
include "ledscroll(group_lock)"
};
xkb_symbols {
include "pc+us+ru:2+inet(evdev)"
include "group(rctrl_rshift_toggle)"
include "ctrl(swapcaps)"
include "keypad(oss)"
include "kpdl(dot)"
include "terminate(ctrl_alt_bksp)"
include "level3(modifier_mapping)"
include "level3(menu_switch)"
include "level5(modifier_mapping)"
include "level5(ralt_switch)"
key <AB06> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ n, N, n, n, u, i, o, p ],
symbols[Group2]= [ Cyrillic_te, Cyrillic_TE, n, n, u, i, o, p ]
};
};
};
메뉴 키를 ISO_Level3_Shift로, RAlt를 ISO_Level5_Shift로 할당해야 합니다. 키가 할당되었지만 오류가 발생합니다.
$ xkbcomp ~/new.xkbcomp.xkb :0
Error: Key <MDSW> added to map for multiple modifiers
Using Mod3, ignoring Mod5.
xkbcomp
오류에도 불구하고 코드 0이 반환됩니다.
키 매핑은 N
레벨 5에서 8까지 "u", "i", "o" 및 "p"를 만들어야 하지만 RAlt는 8개 레벨 모두에 일반적인 n 및 N을 보냅니다(레벨 > 4인 경우 실제로 작동함).
이 오류를 해결하는 방법을 알아보는 동안 <MDSW>
"pc"에 대한 규칙 파일에 오류가 설정되어 있음을 발견했습니다.
/usr/share/X11/xkb/symbols/pc
:
xkb_symbols "pc105" {
…
// Fake keys for virtual<->real modifiers mapping:
key <LVL3> { [ ISO_Level3_Shift ] };
key <MDSW> { [ Mode_switch ] };
modifier_map Mod5 { <LVL3>, <MDSW> };
…
};
여기 또 다른 이상한 점이 있습니다. pc104 키보드 모델을 포함했지만 이 코드는 pc105를 참조하므로 전혀 소스로 제공되어서는 안 됩니다. 그런데... xkb_symbols "pc104"
찾을 수가 없었습니다. 이 "symbols/pc" 파일은 Mod* 키 할당이 /usr/share/X11/xkb/
설정되거나 수정되는 <MDSW>
유일한 파일 입니다. 다른 파일은 "symbols/level5" 파일로, xkb_symbols "modifier_mapping"
.
// Ensure a mapping to a real modifier for LevelFive.
partial modifier_keys
xkb_symbols "modifier_mapping" {
replace key <MDSW> {
type[Group1] = "ONE_LEVEL",
symbols[Group1] = [ ISO_Level5_Shift ]
};
modifier_map Mod3 { <MDSW> };
};
이 충돌로 인해 lv3 스위치와 lv5 스위치가 동시에 작동하지 못할 수도 있다고 생각하지만 확실하지는 않습니다. 걱정스럽게도,또 다른 대답, Mode_switch
키가 Mod* 키에 존재합니다. 키를 로드한 후에는 new.xkbcomp.xkb
어디에도 표시되지 않습니다.
$ xmodmap -pm
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x25)
control Control_L (0x42), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3 ISO_Level5_Shift (0xcb)
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c)
답변1
다음은 Control_R에 ISO_Level5_Shift를 적용하는 작업 솔루션입니다. 동일한 논리를 적용해야 합니다.
xev
ISO_Level5_Shift와 연결될 키의 키 코드를 찾으려면 실행하세요 . 창의 작은 패닉 위로 마우스 커서를 이동하고 키를 누르면 출력에서 해당 키코드를 볼 수 있습니다. 제 경우에는 코드가 105입니다.- 둘째, 나는 도망쳤다
xmodmap
. Control_R이 mod4와 연결되어 있는 것을 확인했습니다. - 그래서
xmodmap -e "clear mod4
열쇠를 풀어줬어요. 모든 키가 해제되므로 필요한 경우 다른 키를 다시 연결해야 할 수도 있습니다. - 그런 다음
xmodmap -e "keycode 105 = ISO_Level5_Shift"
Control_R을 수정자와 연결합니다. - 마지막으로
xmodmap -e "add mod3 = ISO_Level5_Shift"
레벨 5를 활성화합니다.