setxkbmap 또는 xmodmap을 사용하여 특정 키에 대한 Hyper 및 Super 수정자 설정

setxkbmap 또는 xmodmap을 사용하여 특정 키에 대한 Hyper 및 Super 수정자 설정

문제: 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, 키코드 66
  • Pause|Break, 키코드 128
  • Left Windows key, 키코드 133
  • Num Lock, 키 코드 77

2. 스위처 키 설정

이것은 제가 선택한 설정이지만 사용자가 직접 설정을 선택할 수도 있습니다. 나는 이것을 파일로 저장했습니다 $HOME/.xmodmap.

~/.xmodmap
keycode  66 = Mode_switch
keycode 127 = Multi_key
keycode 133 = Super_L
...

이런 식으로 , 에 및 왼쪽 키를 에 Caps Lock바인딩 했습니다 . 키 는 두 개의 키를 합자로 결합할 수 있으므로 특히 유용합니다. 예를 들어 상표 기호 뒤에 및 결과가 표시됩니다 .Mode_switchPause BreakComposeWinSuper_LComposeComposeTM

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.bak3번째, 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
...

이것이 도움이 되었기를 바랍니다!

관련 정보