xmodmap で Caps Lock を再マッピングしても機能しない

xmodmap で Caps Lock を再マッピングしても機能しない

プログラミングをするときは、次のキーを入れ替えるのが好きです:

EscTab CtrlCapsLock

では~/.xmodmap、次の再マッピングを指定しました。

keycode 66 = Control_L
keycode 37 = Caps_Lock
keycode 23 = Escape
keycode 9 = Tab

とキーEscapeが入れ替わっても問題はありませんが、と が入れ替わるTab代わりに、両方のキーが になります。Caps_LockControl_LCaps_Lock

何をやっても、コントロール キーはCaps_Lock(キーコード 66) に割り当てられません。 をそのままにしておくとkeycode 66 =、キーは割り当てられず、Control_LまたはControl_Rを割り当てても機能しません。ただし、 などの他のキーを割り当てると、keycode 66 = Tab割り当てられ、問題はありません。

xmodmap は Caps Lock キーと Control キーの入れ替えを望まないようです。本当にイライラします。どんな助けやアドバイスでも本当に助かります。

PS: 私はArchlinuxを使用しています。

答え1

xmodmap(1) マニュアルページまさにこの例がある

   !
   ! 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

しかし、最初にやった通りに終わらせたいのであれば、少なくともと行を追加する必要があると思いremoveますadd

   remove Lock = Caps_Lock
   remove Control = Control_L
   keycode 37 = Caps_Lock
   keycode 66 = Control_L
   add Lock = Caps_Lock
   add Control = Control_L

この段落から判断すると、そうだろうと思います

   add MODIFIERNAME = KEYSYMNAME ...
           This adds all keys containing the given keysyms  to  the  indi‐
           cated  modifier  map.  The keysym names are evaluated after all
           input expressions are read to make it easy to write expressions
           to swap keys (see the EXAMPLES section).

つまり、修飾子の変更 (Shift、Control など) もそれを実行するまで適用されないようです。

(論理的には も同様ですremove

このkeycodeバージョンにはべき等性があるという利点があり、xmodmap を複数回実行しても効果は変わりません。

答え2

関連する回答: Caps Lock キーを左コントロールに再マップし、実際の左コントロールはそのままにしておきたいと思いました。xmodmap のマニュアル ページにも解決策が示されています。

    keycode 66 = Control_L
    clear Lock
    add Control = Control_L

関連情報