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

4157
Aron Cederholm

Problem: Ich möchte mein Tastaturlayout (pc105 se) ändern / neu definieren, sodass 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 normaler Betätigung "Minus" (-) und bei gedrückter Shift-Taste "Unterstrich" (_). Wenn mit der ersten Modifikatorgruppe (AltGr) gedrückt wird, werden 'dead_belowdot' und 'dead_abovedot' (ohne / mit Shift) erzeugt.

Was ich möchte, ist eine linke Paranthesis oder eine rechte Paranthesis (ohne / mit Shift), wenn ich die Taste mit der Super (win) -Taste drücke und den Schrägstrich / Backslash für die Hyper-Taste (die ich für Caps Lock konfiguriert habe).

Ich habe versucht, a .Xmodmapzu meinem Home-Verzeichnis hinzuzufügen und 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 

Dies führt jedoch dazu, dass AltGr in c / d resultiert, während die Win / Caps-Sperre nur noch in / _ resultiert.

Ich habe auch versucht, / usr / share / X11 / xkb / symbols / se direkt zu modifizieren und folgende Änderungen vorgenommen:

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 es auch versucht

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

Sobald es jedoch mehr als vier angegebene Felder gibt, scheint der Schlüssel insgesamt zu brechen, und der Schlüssel wird auf das Standardverhalten von pc105 (us?) Zurückgesetzt.

Da ich bei stackoverflow, superuser oder google nichts über den Umgang mit meinem Szenario gefunden habe, frage ich hier.

Das ist mein 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) 
6
Wenn Sie etwas finden, können Sie Ihre Antwort hier posten. (das heißt: Beantworten Ihrer eigenen Frage). Ich bin erstaunt, wie kompliziert eine solche triviale Aufgabe zu sein scheint und es gibt kaum Informationen im Netz. Es ist einfach verrückt. Cedric Martin vor 12 Jahren 2
Ich werde. Im Moment bin ich aber immer noch nur auf der Stufe des Ausprobieren und des ständigen manuellen Lesens. Aron Cederholm vor 12 Jahren 0
Ich bin immer noch gespannt, warum der Standard-AltGr nicht für alle Tasten gleich funktioniert ... http://unix.stackexchange.com/questions/249122/why-do-my-xmodmap-binds-involving-altgr- Nur-arbeiten-einige-Tasten Pavel Šimerda vor 8 Jahren 0

1 Antwort auf die Frage

8
Aron Cederholm

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

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

1. Holen Sie sich die Schlüsselcodes der Sondertasten

Führen Sie xevden Befehl aus, um den Schlüsselcode der Tasten zu bestimmen, die Sie als Modusumschalter verwenden möchten. Drücken Sie dann die Tasten, an denen Sie interessiert sind, und notieren Sie diekeycode

$ 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 befindet sich in der dritten Zeile, Schlüsselcode 66.

Für mich waren dies die Schlüssel, die mich besonders interessierten, und die entsprechenden Schlüsselcodes für mich:

  • Caps LockSchlüsselcode 66
  • Pause|BreakSchlüsselcode 128
  • Left Windows keySchlüsselcode 133
  • Num LockSchlüssel 77

2. Stellen Sie die Umschaltertasten ein

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

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

So kann ich gebunden haben Caps Lockzu Mode_switch, Pause Breakzu Composeund die linke WinTaste Super_L. Der ComposeSchlüssel ist besonders nützlich, da zwei Schlüssel zu Ligatur kombiniert werden können. ZB Composegefolgt von Tund Mergibt das Markenzeichen .

3. Aktuelle Tastaturbelegbindungen von erhalten xmodmap

Um mein Tastaturlayout nicht zu zerstören, wollte ich meine Tasten so nahe wie möglich an meinem ursprünglichen Layout halten. Dafür habe ich die aktuelle Keymap ausgedruckt und nach den Keycodes gesucht, die ich ändern wollte.

$ xmodmap -pke | ag 'keycode 51' 

Off Natürlich könnte man genauso gut verwenden grepoder ack, je nach Werkzeug, das Sie verwenden möchten.

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

Die Ausgabe davon hat das gleiche Format wie das, das Sie in Ihrem Format wie folgt angeben ~/.xmodmap:

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

4. Sichern Sie Ihre bestehenden xmodmap

Nur für den Fall, dass etwas schief geht, ist es nie eine schlechte Idee, Ihren Strom xmodmapverfügbar zu haben, auf den Sie leicht zurückgreifen können.

$ xmodmap -pke > ~/.xmodmap.bak 

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

Soweit ich verstanden habe, ist das Format der .xmodmapDatei so:

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

Nun, ich verstehe nicht alle Ebenen, aber Mode_Switch( Caps Lockin meinem Fall) gibt Ihnen Stufe 2 und Alt GrStufe 3, und das ist so ziemlich alles, was mich interessiert, also habe ich den Rest dieser Linie so belassen, wie er in meiner war ~/.xmodmap.bakund hat gerade die 3., 4., 5. und 6. Spalte (Level 2 und 3 plus Shift) 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 xmodmapSie jetzt .xmodmapIhr neues Tastaturlayout ausführen und testen.

$ xmodmap /home/user/.xmodmap 

7. Stellen Sie sicher, dass Ihr Tastaturlayout unter x init geladen ist

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

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

Ich hoffe das war hilfreich!