Festlegen von Hyper- und Super-Modifikatoren für bestimmte Tasten mit setxkbmap oder xmodmap

Festlegen von Hyper- und Super-Modifikatoren für bestimmte Tasten mit setxkbmap oder xmodmap

Problem: Ich möchte mein Tastaturlayout (pc105 se) so ändern/neu definieren, dass beim Drücken bestimmter Tasten mit mod3 (super) und mod4 (hyper) ein anderes Zeichen zurückgegeben wird als üblich.

Z.B

Der Tastencode 61 erzeugt bei normalem Drücken ein Minuszeichen (-) und bei gleichzeitigem Drücken mit Umschalt einen Unterstrich (_). Bei gleichzeitigem Drücken mit der ersten Modifikatorgruppe (AltGr) werden (ohne/mit Umschalt) die Tasten „dead_belowdot“ und „dead_abovedot“ erzeugt.

Was ich möchte, ist eine linke oder rechte Klammer (ohne/mit Umschalt), wenn ich die Taste drücke, während ich gleichzeitig die Super-Taste (Win) drücke, und einen Schrägstrich/Backslash für die Hyper-Taste (die ich auf Feststelltaste konfiguriert habe).

Ich habe versucht, ein zu meinem Home-Verzeichnis hinzuzufügen .Xmodmapund es mit xmodmap ~/.Xmodmapder folgenden Syntax auszuführen

keycode 61 = minus underscore a b c d e f g h i j k l m n o p

Allerdings führt AltGr dazu, dass c/d ausgegeben wird, während win/caps lock weiterhin nur -/_ ergibt.

Ich habe auch versucht, /usr/share/X11/xkb/symbols/se direkt zu ändern und habe die folgenden Änderungen ausprobiert:

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

Aber alles was passiert ist ' * ´ × ' * ' * (für normal, altgr, win und Caps Lock). Ich habe auch versucht

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

Sobald jedoch mehr als vier Felder angegeben sind, scheint der Schlüssel vollständig beschädigt zu sein und kehrt zum Standardverhalten von pc105 (us?) zurück.

Da ich weder bei Stackoverflow, Superuser noch bei Google etwas zur Lösung meines Szenarios finden konnte, frage ich hier.

Das ist meinxmodmap -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)

Antwort1

Zwei Jahre später bin ich endlich stolz, meine eigene Frage beantworten zu können.

Ich habe festgestellt, dass die einfachste, zuverlässigste und erweiterbarste Methode darin besteht, sich ausschließlich auf zu verlassen xmodmap.

1. Holen Sie sich die Keycodes der Sondertasten

Führen Sie den Befehl aus xev, um den Tastencode der Tasten zu ermitteln, die Sie als Modusschalter verwenden möchten. Drücken Sie dann die gewünschten Tasten und notieren Sie sich denkeycode

$ 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

Der Schlüsselcode steht in der dritten Zeile, Schlüsselcode 66.

Für mich waren das die Tonarten, die mich besonders interessierten, und die dazugehörigen Tonartencodes:

  • Caps Lock, Schlüsselcode 66
  • Pause|Break, Schlüsselcode 128
  • Left Windows key, Schlüsselcode 133
  • Num Lock, Schlüsselcode 77

2. Umschalttasten einstellen

Dies ist das Setup, für das ich mich entschieden habe, aber Sie können Ihr eigenes Setup wählen. Ich habe dies in einer Datei gespeichert $HOME/.xmodmap.

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

Auf diese Weise habe ich Caps Lockan Mode_switch, Pause Breakan Composeund die linke WinTaste an gebunden Super_L. Die ComposeTaste ist besonders nützlich, da sie die Kombination zweier Tasten zu einer Ligatur ermöglicht. ComposeGefolgt von Tund Mergibt beispielsweise das Markenzeichen .

3. Aktuelle Keymap-Bindungen vonxmodmap

Um mein Tastaturlayout nicht zu zerstören, wollte ich die Tasten so nah wie möglich an meinem Originallayout halten. Dazu druckte ich die aktuelle Tastaturbelegung aus und suchte nach den Tastencodes, die ich ändern wollte.

$ xmodmap -pke | ag 'keycode  51' 

Natürlich können Sie genauso gut grepoder verwenden ack, je nachdem, welches Werkzeug Sie bevorzugen.

$ xmodmap -pke | grep 'keycode  41' 
$ xmodmap -pke | ack 'keycode  31' 

Die Ausgabe erfolgt im gleichen Format wie das von Ihnen angegebene, und ~/.xmodmapzwar wie folgt:

keycode  31 = i I i I rightarrow idotless rightarrow idotless i I rightarrow idotless i I rightarrow idotless

4. Sichern Sie Ihre bestehendenxmodmap

Für den Fall, dass etwas schief geht, ist es nie eine schlechte Idee, die aktuelle Version xmodmapzur Hand zu haben, auf die man einfach zurückgreifen kann.

$ xmodmap -pke > ~/.xmodmap.bak

5. Fügen Sie Zeichen zur 2., 3. und 4. Ebene Ihrer Schlüssel hinzu

Soweit ich es verstanden habe, .xmodmapist das Format der Datei wie folgt:

keycode <keycode> = <1st level> <Shift+1st> <2nd level> <shift+2nd> <3rd level> <shift+3rd level> <4th level> <shift+4th> ...

Nun, ich verstehe nicht alle diese Ebenen, aber Mode_Switch( Caps Lockin meinem Fall) gibt Ihnen Ebene 2 und Alt Grmir Ebene 3, und das ist so ziemlich alles, was mich interessiert, also habe ich den Rest dieser Zeile so gelassen, wie er in meinem war, ~/.xmodmap.bakund nur die 3., 4., 5. und 6. Spalte (Ebene 2 und 3, plus Umschalt) in gültige Zeichen geändert (Eine Liste der gültigen Zeichen finden Sie hier).

~/.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. Testen Sie Ihre.xmodmap

Lassen Sie uns jetzt Ihr brandneues Tastaturlayout xmodmapausführen und testen..xmodmap

$ xmodmap /home/user/.xmodmap

7. Stellen Sie sicher, dass Ihr Tastaturlayout bei x init geladen wird

Ich habe dies zu meinem hinzugefügt $HOME/.xinitrc:

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

Ich hoffe, das war hilfreich!

verwandte Informationen