lundi 26 juin 2017

Créer son propre fichier de disposition clavier sous Linux

Comment créer son propre keymap

Quand on travaille dans un environnement international où les ordinateurs sont équipés de claviers qwerty, il nous faut souvent faire l'impasse sur les caractères spéciaux et par exemple utiliser un correcteur d'orthographe une fois le texte tapé.

Cependant, il existe une disposition clavier déjà intégré à Windows et Linux : le keymap US international. Cette disposition permet à partir du clavier qwerty le plus simple d'écrire les caractères spéciaux les plus utilisés. Elle est, par exemple, utilisée aux Pays-Bas où tous les claviers sont configurés en US-international même si la plupart des gens l'ignorent et apprennent les codes Windows tel que Alt+132=ä. Pourtant, le clavier international est assez intuitif et rapide.
Clavier US AltGr International

Clavier US International

C'est un hasard qui m'a amené à utiliser cette disposition : l'achat d'un thinkpad à clavier qwerty. J'ai lontemps chercher une configuration qwerty française (keymap "cf" sous linux) comme on le trouve au Canada, mais celui-ci a un agencement de touches différent pas forcement compatible avec un qwerty basique. Je me suis retrouvé à utiliser la configuration English (intl., with dead keys) (plus complète que la version US intl) sous X (et par extension wayland car les fichiers xkb sont compatibles).

Voici quelques exemples d'utilisation du clavier us-intl sous X :
Alt+e é
Alt+' puis e é
Alt+` puis e è
Alt+6 puis e ê
Alt+, ç
Alt+5 €
Alt+[ «
Alt+] »
Alt+z æ
Alt+6 puis 9 ⁹
J'ai toutefois eu un problème quand j'ai voulu utiliser le clavier dans une console Linux (en dehors de X). Je n'ai trouvé aucun keymap (/usr/share/kbd/keymap) us-intl.

Un keymap proche est us-acentos qui est une disposition qui a tenté de rajouter les lettres de l'encodage latin1 sur les claviers US. Cela n'a pas marché à cause de l'encodage ISO8859 (latin1) (latin9) qui a donné naissance a us-intl.iso15.map.gz et us-intl.iso1.map.gz. Cependant, j'ai pu le trouver : us-intl.iso15.kmap.gz mais il ne fonctionne pas de la même manière que sous X : il n'utilise pas Alt-Gr comme touche de modification, mais Ctrl+. ; pas pratique..

Il a donc fallu que je le fasse, vous trouverez deux versions à la fin de mes notes.

Un peu de théorie

Une touche de modification, modificatrice ou plus simplement un modificateur est une touche de clavier d'ordinateur qui permet de modifier le comportement d'une ou plusieurs autres touches auxiliaires lorsqu'elles sont enfoncées simultanément.

Plus spécifiquement, on a :

  • Les touches mortes (dead key) étant une touche qui n'affiche rien lorsqu'elle est activée. Utilisé avec une autre touche, elle modifie le symbole de cette autre touche (utilisé pour les accents par exemple).
  • Les touches de combinaison (Compose en anglais) permettant d'associer deux autres touches afin de créer un nouveau caractère (touche combinaison a+e donne æ).
  • Les touches métas ou méta-modificateurs permettant d'accéder a des fonctions, par exemple la touche windows ou alt (alt+tab, alt+F4, alt+4, windows).

Exemple de keymap

keymaps 0-2,4-6,8-9,12
keycode   1 = Escape           Escape         
    alt    keycode   1 = Meta_Escape
keycode   7 = six              circumflex
    altgr keycode  7 = dead_circumflex
keycode  15 = Tab              Tab            
    alt    keycode  15 = Meta_Tab       
    shift    keycode  15 = Meta_Tab
keycode  38 = l
    #control keycode 38 = Control_l #déjà définit ligne précédente
    altgr keycode  38 = +oslash
    shift altgr keycode  38 = +Oslash
keycode  45 = x
keycode  52 = period           greater          guillemotright
    control    keycode  52 = Compose 
À chaque touche de modification est attribué un poids suivant cette table.
 Shift               1
AltGr                2
Control              4
Alt                  8
ShiftL              16
ShiftR              32
CtrlL               64
CtrlR              128
CapsShift          256
CapsShift fonctionne par défaut comme shift - comme son nom l'indique, il verrouille simplement "Maj".

Pour chaque touche on peut donc définir 2⁸ = 256 combinaisons. Cependant nous n'avons pas à tous les préciser. On peut par exemple définir la gamme des combinaisons utilisée dans le fichier.
keymaps 0-2,4-5,8,12
Ici, seules les combinaisons plain, Shift, AltGr, Control, Control+Shift, Alt et Control+Alt sont définissables par des symboles. Le reste sera rempli par le symbole vide : la touche n'aura aucun effet.

Le comportement de chaque touche est définissable de plusieurs manières :

keycode keynumber = keysym keysym keysym...

Ou comme dans l'exemple
keycode 1 = Escape Escape 
Tout les keysyms sont arrangés comme prévu à la ligne keymaps. Ceux non définis sont automatiquement remplacé par VoidSymbol.

Un autre comportement intéressant est automatiquement complété lorsqu'on définit des touches de l'alphabet.
keycode  45 = x 
Est équivalent à ce comportement.
Plain                 x
Shift                   X
AltGr                 x
Shift+AltGr             X
Control                 Control_x
Shift+Control           Control_x
AltGr+Control           Control_x
Shift+AltGr+Control     Control_x
Alt                     Meta_x
Shift+Alt               Meta_X
AltGr+Alt               Meta_x
Shift+AltGr+Alt         Meta_X
Control+Alt             Meta_Control_x
Shift+Control+Alt       Meta_Control_x
AltGr+Control+Alt       Meta_Control_x
Shift+AltGr+Control+Alt Meta_Control_x
Chaque combinaison peut être écrasée en la redefinissant comme montré ici:
keycode  38 = l
    #control keycode 38 = Control_l #déjà définit ligne précédente
    altgr keycode  38 = +oslash
    shift altgr keycode  38 = +Oslash
Les symboles utilisables sont soit des lettres, soit des chiffres, des diacritiques, des chaînes de caractères, codes de contrôle (Ctrl+C... voir les contrôles codes standards ici https://en.wikipedia.org/wiki/C0_and_C1_control_codes), et d'autres symboles métas ou non. Ils peuvent être écrits directement, en décimal, octal, hexadécimal, unicode ou encore symboliquement (voir http://wiki.linuxquestions.org/wiki/List_of_keysyms).

Pour ajouter des glyphes aux lettres, on peut définir les diacritiques sur des touches mortes (ou touche de composition).
keycode 7 = six circumflex
      altgr keycode 7 = dead_circumflex
AltGr+6 a le même comportement que le ^ sur le clavier français. Il faut tout de même attribuer un comportement pour chaque combinaison.

compose '^' 'a' to acircumflex

Majuscule et Verrouillage :
keycode 44 = +z Z
Maj n'inverse pas le verrouillage.
keycode 44 = +z +Z
      altgr keycode 44 = ae
      shift altgr keycode 44 = AE
Le verrouillage n'a pas d'effet sur les combinaisons altgr + touche 44.
keycode 44 = +z +Z
      altgr keycode 44 = +ae
      shift altgr keycode 44 = +AE
Le verrouillage change la casse de altgr + touche 44.

À propos de ma version us-intl pour le tty

À télécharger ici :

https://github.com/z3bu/us-intl

Sur la version us-altgrintl-deadkeys AltGr est un modificateur, il permet d'acceder aux niveaux 3 et 4 qui touches soient des caractères spéciaux, soient des touches mortes.

Sur la version us-intl-deadkeys les touches mortes sont actives par défaut (donc au niveau 1 et 2), les versions "vivantes" des symboles sont aux niveaux 3 et 4 (touche AltGr enfoncée).

Le verrouillage n'a d'effet que sur les lettres.
Certaines touches mortes ne sont pas implémentées (Alt Maj / et alt Maj -)

Rajouté le symbole ± sur la touche -

Rajouté la possibilité de rentrer des caractères avec leur unicode avec AltGr et le clavier numérique (4 chiffres hexadécimaux).

Je conseille pour configuration /etc/vconsole.conf
KEYMAP=us-altgrintl-deadkeys
FONT="unifont"
UNICODE=1
GNU unifont peut être téléchargé ici : http://unifoundry.com/unifont.html

Apprenez à mieux utiliser le terminal sous Linux ici :
http://wiki.linuxquestions.org/wiki/Control_keys

Il manque encore : la cédille morte, le point (supérieur et inférieur) mort. Quelques caractères complexes.

Conclusion

Le résultat est limité par le terminal offert par le kernel. GNU unifont est conseillé - il a un meilleur support pour l'unicode.

Plus qu'a essayer kmscon et fb (ou encore wayland avec le bon compositeur) - dommage que le développement soit arrêté - de telles solutions gèrent directement les dispositions claviers xkb et support entièrement unicode.

Aucun commentaire:

Enregistrer un commentaire