web-dev-qa-db-ja.com

xmodmapを使用してctrlとcapslockを入れ替える方法

私はこのxmodmapスクリプトがctrlとcapslockを交換できることを知っています:

remove Lock = Caps_Lock
remove Control = Control_L
keysym Caps_Lock = Control_L
keysym Control_L = Caps_Lock
add Lock = Caps_Lock
add Control = Control_L

よくわかりません。だから私はこれを試しました:

remove Lock = Caps_Lock
remove Control = Control_L
add Lock = Control_L
add Control = Caps_Lock

そして、このスクリプトは機能しません。
これを簡単な言葉で説明できますか(最初のスクリプトが機能し、他のスクリプトが機能しない理由)。

5
David Dai

From Remap Caps Lock:

man xmodmapは、左のコントロールキーとCapsLockキーを交換する方法を示しています。

!
! Swap Caps_Lock and Control_L
!
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

これらのkeysym行は、キーコードを反対のキーにマッピングするものであるため、重要です。つまり、 Capslock に行く Control L およびその逆。

xmodmap manページからの抜粋*

   keysym KEYSYMNAME = KEYSYMNAME ...
           The KEYSYMNAME on the left hand side is translated into matching 
           keycodes used to perform the corresponding set of keycode 
           expressions.  Note that if the same keysym is bound to multiple 
           keys, the expression is executed for each matching keycode.

効果を見る

ツールxevを使用して、キーが文字通り再マッピングされていることを確認できます。そう Capslock 今のスキャンコードを送信します Control L

押す Capslock 送る Control L

$ xev
KeyPress event, serial 36, synthetic NO, window 0x3e00001,
    root 0x86, subw 0x0, time 890946390, (803,237), root:(804,294),
    state 0x2, keycode 66 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x3e00001,
    root 0x86, subw 0x0, time 890946462, (803,237), root:(804,294),
    state 0x6, keycode 66 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

押す Control L 送る Capslock

$ xev
KeyPress event, serial 36, synthetic NO, window 0x3e00001,
    root 0x86, subw 0x0, time 891083183, (793,9), root:(794,66),
    state 0x0, keycode 37 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x3e00001,
    root 0x86, subw 0x0, time 891083302, (793,9), root:(794,66),
    state 0x2, keycode 37 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

参考文献

4
slm

正しい。 「削除」および「追加」の行は、キーを無効/有効にします。実際に切り替えを行うコマンドは、keysymコマンドです。したがって、keysymコマンドなしでは動作しません。

1
Altair-IV