Définition de modificateurs Hyper et Super pour certaines clés avec setxkbmap ou xmodmap

6

Problème: je souhaite modifier / redéfinir la disposition de mon clavier (pc105 se) de sorte que lorsque j'appuie sur certaines touches avec mod3 (super) et mod4 (hyper), un caractère différent est renvoyé.

Par exemple.

Le code clé 61 produit un «moins» (-) lorsqu'il est enfoncé normalement et un «soulignement» (_) lorsqu'il est enfoncé avec une touche Maj. Lorsque vous appuyez sur le premier groupe de modificateurs (AltGr), "dead_belowdot" et "dead_abovedot" sont générés (sans / avec décalage).

Ce que je veux, c'est une parenthèse gauche ou droite (sans / avec décalage) lorsque j'appuie sur la touche avec la touche Super (win) également enfoncée, ainsi qu'une barre oblique / barre oblique inverse pour la clé Hyper (configurée avec le verrouillage majuscule).

J'ai essayé d'ajouter un .Xmodmap dans mon répertoire personnel et l'exécuter avec xmodmap ~/.Xmodmap en utilisant la syntaxe suivante

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

Cependant, cela entraînera c / d dans AltGr, alors que le verrouillage des victoires / majuscules ne donnera toujours que - / _

J'ai également essayé de modifier directement / usr / share / X11 / xkb / symboles / se et essayé les modifications suivantes:

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

Mais tout ce qui se passe, c’est '* ´ ×' * '* (respectivement pour normal, altgr, win et maj lock) J'ai aussi essayé

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

Mais dès qu'il y a plus de quatre champs spécifiés, il semble que la clé soit totalement cassée et la clé revient au comportement par défaut pc105 (us?).

Comme je n'ai rien trouvé sur stackoverflow, super-utilisateur ou google sur la façon de gérer mon scénario, je pose la question ici.

C'est mon 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)
Aron Cederholm
la source
2
Si vous trouvez quelque chose, pourriez-vous s'il vous plaît poster votre réponse ici? (c’est-à-dire répondre à votre propre question). Je suis surpris par la complexité d'une tâche aussi triviale et par le manque d'informations sur le net. C'est juste fou.
Cedric Martin
Je vais. Mais pour l'instant, je n'en suis encore qu'au stade des essais et des erreurs et de la lecture manuelle constante.
Aron Cederholm
Je suis toujours curieux de savoir pourquoi le AltGr par défaut ne fonctionnera pas de la même manière pour toutes les touches ... unix.stackexchange.com/questions/249122/…
Pavel Šimerda

Réponses:

8

Deux ans plus tard, je suis enfin fier de répondre à ma propre question.

J'ai trouvé la méthode la plus simple, la plus fiable et la plus extensible consiste à ne compter que xmodmap.

1. Obtenir les codes clés des clés spéciales

Courir xev pour déterminer le code de clé que vous souhaitez utiliser pour changer de mode. Appuyez ensuite sur les touches qui vous intéressent et notez le 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

Le code clé se trouve sur la troisième ligne, code clé 66.

Pour moi, ce sont les clés qui m'ont particulièrement intéressé et les codes correspondants pour moi:

  • Caps Lock, code clé 66
  • Pause|Break, code clé 128
  • Left Windows key, code clé 133
  • Num Lock, code clé 77

2. Définir les touches du sélecteur

C’est la configuration que j’ai choisie, mais vous pouvez choisir votre propre configuration. Je l'ai sauvegardé dans un fichier $HOME/.xmodmap.

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

De cette façon j'ai lié Caps Lock à Mode_switch, Pause Break à Compose et la gauche Win la clé de Super_L. le Compose key est particulièrement utile car elle permet de combiner deux clés pour la ligature. Par exemple. Compose suivi par T et M résultats dans le signe de la marque .

3. Obtenir les liaisons de clavier actuelles de xmodmap

Afin de ne pas détruire la disposition de mon clavier, je voulais garder mes touches aussi proches que possible de ma disposition d'origine. Pour ce faire, j'ai imprimé le keymap actuel et cherché les keycodes que je voulais changer.

$ xmodmap -pke | ag 'keycode  51' 

Bien sûr, vous pouvez tout aussi facilement utiliser grep ou ack, selon l'outil que vous préférez utiliser.

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

Le résultat est au même format que celui que vous spécifiez dans votre ~/.xmodmap comme ça:

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

4. Sauvegardez votre existant xmodmap

Juste au cas où quelque chose se passerait mal, ce n’est jamais une mauvaise idée d’avoir votre xmodmap disponible pour se replier facilement.

$ xmodmap -pke > ~/.xmodmap.bak

5. Ajoutez des caractères aux 2e, 3e et 4e niveaux de vos clés

Pour autant que je sache, le format de la .xmodmap le fichier est comme ça:

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

Maintenant, je ne comprends pas tous ces niveaux mais Mode_Switch ( Caps Lock dans mon cas) vous donnera le niveau 2 et Alt Gr me donne le niveau 3, et c’est à peu près tout ce qui m’intéresse alors j’ai laissé le reste de cette ligne ~/.xmodmap.bak et vient de remplacer les 3ème, 4ème, 5ème et 6ème colonnes (niveaux 2 et 3, plus décalage) par des caractères valides ( Voir ici pour une liste de caractères valides ).

~/.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. Testez votre .xmodmap

Maintenant, laisse xmodmap exécuter votre .xmodmap et testez votre nouvelle disposition de clavier.

$ xmodmap /home/user/.xmodmap

7. Assurez-vous que votre clavier est chargé sur x init

J'ai ajouté ceci à mon $HOME/.xinitrc:

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

J'espère que cela a été utile!

Aron Cederholm
la source