setxkbmap または xmodmap を使用して特定のキーにハイパーおよびスーパー修飾子を設定する

setxkbmap または xmodmap を使用して特定のキーにハイパーおよびスーパー修飾子を設定する

問題: キーボード レイアウト (pc105 se) を変更/再定義して、mod3 (スーパー) および mod4 (ハイパー) で特定のキーを押すと、通常とは異なる文字が返されるようにしたいと考えています。

例えば

キーコード 61 は、通常押すと「マイナス」(-) を生成し、Shift キーを押しながら押すと「アンダースコア」(_) を生成します。最初の修飾子グループ (AltGr) とともに押すと、「dead_belowdot」と「dead_abovedot」が生成されます (Shift キーの有無にかかわらず)。

私が欲しいのは、Super (win) キーも押した状態でキーを押すと左括弧または右括弧 (Shift なし/あり) が表示され、Hyper キー (Caps Lock に設定) の場合はスラッシュ/バックスラッシュが表示されることです。

.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、CapsLock)だけです。私はまた、

key <BKSL>  { [apostrophe, asterisk, acute, multiply, a,b,c,d, e,f,g,h, i,j,k,l]};

しかし、指定されたフィールドが 4 つを超えると、キーは完全に壊れてしまい、キーはデフォルトの pc105 (us?) の動作に戻ります。

私のシナリオに対処する方法について、stackoverflow、superuser、または 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

キーコードは 3 行目、キーコード 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をに、左キーを にバインドしました。キーは、2 つのキーを組み合わせて合字にすることができるので特に便利です。たとえば、の後に と を続けると、商標記号 になります。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_SwitchCaps Lock私の場合)はレベル2を返し、Alt Grレベル3を返します。これが私が興味を持っていることのほとんどすべてなので、その行の残りの部分はそのままにして、~/.xmodmap.bak3番目、4番目、5番目、6番目の列(レベル2と3、およびシフト)を有効な文字(有効な文字のリストについてはこちらをご覧ください)。

~/.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
...

これが役に立つことを願っています!

関連情報