web-dev-qa-db-ja.com

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

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

例えば。

キーコード61は、通常押したときに「マイナス」(-)を生成し、Shiftキーを押しながら押したときに「アンダースコア」(_)を生成します。最初の修飾子グループ(AltGr)で押すと、「dead_belowdot」と「dead_abovedot」が生成されます(シフトなし/あり)。

私が欲しいのは、Super(win)キーも押したままキーを押したときの左のparanthesisまたは右のparanthesis(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/capslockは-/ _になります。

また、/ 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)
10
Aron Cederholm

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 LockMode_switchに、Pause BreakComposeに、左側のWinキーをSuper_Lにバインドしました。 Composeキーは、2つのキーを組み合わせて合字にすることができるため、特に便利です。例えば。 Composeの後にTMが続くと、商標記号になります。

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、およびシフト)を有効な文字に変更しました( を参照)有効な文字のリストについては、こちらをご覧ください )。

~/.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.キーボードレイアウトがxinitにロードされていることを確認します

これを$HOME/.xinitrcに追加しました:

~/.xinitrc
...
[-f $HOME/.xmodmap] && xmodmap $HOME/.xmodmap
...

これがお役に立てば幸いです。

11
Aron Cederholm