문제: mod3(super) 및 mod4(hyper)로 특정 키를 누를 때 평소와 다른 문자가 반환되도록 키보드 레이아웃(pc105 se)을 수정/재정의하고 싶습니다.
예:
키코드 61을 사용하면 정상적으로 누르면 '마이너스'(-)가 생성되고 Shift와 함께 누르면 '밑줄'(_)이 생성됩니다. 첫 번째 수정자 그룹(AltGr)을 누르면 'dead_belowdot' 및 'dead_abovedot'가 생성됩니다(shift 없음/with).
내가 원하는 것은 Super(win) 키를 누른 상태에서 키를 누를 때 왼쪽 괄호 또는 오른쪽 괄호(shift 없음/있음)와 Hyper 키(Caps Lock으로 구성함)에 대한 슬래시/백슬래시입니다.
내 홈 디렉터리에 a를 추가하고 다음 구문을 사용하여 .Xmodmap
실행하려고 했습니다.xmodmap ~/.Xmodmap
keycode 61 = minus underscore a b c d e f g h i j k l m n o p
그러나 AltGr을 사용하면 c/d가 발생하지만 win/caps lock은 여전히 -/_만 발생합니다.
또한 /usr/share/X11/xkb/symbols/se를 직접 수정하고 다음 변경 사항을 시도했습니다.
key <BKSL> { [apostrophe, asterisk, acute, multiply], [a,b,c,d], [e,f,g,h], [i,j,k,l]};
그러나 일어나는 모든 일은 ' * ' × ' * ' *입니다(각각 일반, altgr, win 및 Caps Lock의 경우). 나는 또한 시도했다
key <BKSL> { [apostrophe, asterisk, acute, multiply, a,b,c,d, e,f,g,h, i,j,k,l]};
그러나 지정된 필드가 4개 이상이면 키가 완전히 손상되는 것처럼 보이고 키는 기본 pc105(us?) 동작으로 되돌아갑니다.
내 시나리오를 처리하는 방법에 대해 stackoverflow, 수퍼유저 또는 Google에서 아무것도 찾지 못했기 때문에 여기에 질문합니다.
이것은 나의xmodmap -pm
xmodmap: up to 3 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3 Hyper_L (0x42), Hyper_L (0xcf)
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
답변1
2년 후, 마침내 나는 내 질문에 답하게 된 것을 자랑스럽게 생각합니다.
나는 가장 쉽고, 가장 안정적이고, 가장 확장 가능한 방법이 전적으로 xmodmap
.
1. 특수 키의 키코드 받기
xev
모드 전환기로 사용하려는 키의 키 코드를 결정하려면 실행하세요 . 그런 다음 관심 있는 키를 누르고 해당 내용을 기록해 두십시오.keycode
$ xev
KeyRelease event, serial 40, synthetic NO, window 0x2600001,
root 0x2a6, subw 0x0, time 1221887800, (885,743), root:(3447,805),
state 0x2010, keycode 66 (keysym 0xff7e, Mode_switch), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
키코드는 세 번째 줄인 키코드 66에 있습니다.
저에게 있어 특히 관심이 있었던 키와 그에 해당하는 키 코드는 다음과 같습니다.
Caps Lock
, 키코드 66Pause|Break
, 키코드 128Left Windows key
, 키코드 133Num Lock
, 키 코드 77
2. 스위처 키 설정
이것은 제가 선택한 설정이지만 사용자가 직접 설정을 선택할 수도 있습니다. 나는 이것을 파일로 저장했습니다 $HOME/.xmodmap
.
~/.xmodmap
keycode 66 = Mode_switch
keycode 127 = Multi_key
keycode 133 = Super_L
...
이런 식으로 , 에 및 왼쪽 키를 에 Caps Lock
바인딩 했습니다 . 키 는 두 개의 키를 합자로 결합할 수 있으므로 특히 유용합니다. 예를 들어 상표 기호 뒤에 및 결과가 표시됩니다 .Mode_switch
Pause Break
Compose
Win
Super_L
Compose
Compose
T
M
™
3. 현재 키맵 바인딩을 가져옵니다.xmodmap
키보드 레이아웃을 파괴하지 않기 위해 키를 원래 레이아웃에 최대한 가깝게 유지하고 싶었습니다. 그러기 위해 현재 키맵을 인쇄하고 변경하려는 키코드를 찾았습니다.
$ xmodmap -pke | ag 'keycode 51'
물론 사용하려는 도구에 따라 grep
또는 를 쉽게 사용할 수도 있습니다.ack
$ xmodmap -pke | grep 'keycode 41'
$ xmodmap -pke | ack 'keycode 31'
이것의 출력은 다음과 같이 지정한 것과 동일한 형식입니다 ~/.xmodmap
.
keycode 31 = i I i I rightarrow idotless rightarrow idotless i I rightarrow idotless i I rightarrow idotless
4. 기존 파일을 백업하세요.xmodmap
xmodmap
만약 문제가 발생할 경우를 대비해 현재 상태를 쉽게 복구할 수 있도록 하는 것은 결코 나쁜 생각이 아닙니다 .
$ xmodmap -pke > ~/.xmodmap.bak
5. 키의 2, 3, 4레벨에 문자를 추가하세요.
내가 아는 한 파일 형식은 .xmodmap
다음과 같습니다.
keycode <keycode> = <1st level> <Shift+1st> <2nd level> <shift+2nd> <3rd level> <shift+3rd level> <4th level> <shift+4th> ...
이제 저는 그 레벨을 모두 이해하지 못하지만 Mode_Switch
( Caps Lock
제 경우에는) 여러분에게 레벨 2를 주고 Alt Gr
저에게 레벨 3을 줍니다. 그것이 제가 관심 있는 전부이므로 나머지 줄은 그대로 두었습니다. ~/.xmodmap.bak
3번째, 4번째, 5번째 및 6번째 열(레벨 2 및 3, Shift 포함)을 유효한 문자(유효한 문자 목록은 여기를 참조하세요.).
~/.xmodmap
...
keycode 51 = apostrophe asterisk dollar ampersand acute multiply acute multiply apostrophe asterisk acute multiply apostrophe asterisk acute multiply
keycode 59 = comma semicolon parenleft parenright dead_cedilla dead_ogonek dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek
keycode 60 = period colon bracketleft bracketright periodcentered dead_abovedot periodcentered dead_abovedot period colon periodcentered dead_abovedot period colon periodcentered dead_abovedot
keycode 61 = minus underscore braceleft braceright slash backslash braceleft braceright
keycode 65 = space space space space space underscore space space
...
6. 테스트해 보세요.xmodmap
이제 새로운 키보드 레이아웃을 xmodmap
실행 하고 테스트해 보겠습니다..xmodmap
$ xmodmap /home/user/.xmodmap
7. x init에 키보드 레이아웃이 로드되었는지 확인하세요.
나는 이것을 내 $HOME/.xinitrc
:
~/.xinitrc
...
[-f $HOME/.xmodmap] && xmodmap $HOME/.xmodmap
...
이것이 도움이 되었기를 바랍니다!