Ajouter un layout customisé

Bonjour,

Je suis un nouvel utilisateur de nixOS, que j’ai installé hier, avec plasma en DE.

Pour l’instant, tout roule, mais je butte sur un problème. J’utilise optimot, un clavier optimisé pour la frappe dactylo et qui permet d’accéder à une plus grand variété de symboles. Le site optimot propose un script d’installation, mais celui ci ne peut pas fonctionner sur nixOS (du moins que je sache).

J’ai donc essayé de me débrouiller à partir du ficher xkb que optimot propose pour l’installation manuelle (sur cette page), et du guide en anglais disponible ici, qui explique comment mettre en place des layouts custom.

Je me retrouve donc avec un bloc dans configuration.nix qui ressemble à ça :

#Optimot layout
services.xserver.xkb.extraLayouts.optimot_iso_18 = {
description = “France - Optimot ISO v1.8.0”;
languages = [ “fr” ];
typesFile = /home/notmetravail/symbols/optimot_types;
symbolsFile = /home/notmetravail/symbols/optimot_symbols;
compatFile = /home/notmetravail/symbols/optimot_compat;
keycodesFile = /home/notmetravail/symbols/optimot_keycodes;
geometryFile = /home/notmetravail/symbols/optimot_geometry;
};

sudo nixos-rebuild switch ne rends pas d’erreurs, et le layout apparait dans les paramètres de plasma, mais il ne fonctionne pas correctement. Je ne peux pas utiliser shift, ctrl ou alt pour changer de couche de lettre.

Voici également chacun des fichiers xkb :

xkb_types         {
    include "complete"

// Key types for Optimot layout
    type "FOUR_LEVEL_CONTROL" {
        modifiers = Shift+LevelThree+Control;

        map[None] = Level1;
        map[Shift] = Level2;
        map[LevelThree] = Level3;
        map[Shift+LevelThree] = Level4;
        map[Control]  = Level5;
        map[Control+Shift] = Level6;

        preserve[Control] = Control;
        preserve[Shift+Control] = Control;

        level_name[Level1] = "Base";
        level_name[Level2] = "Shift";
        level_name[Level3] = "Alt Base";
        level_name[Level4] = "Shift Alt";
        level_name[Level5] = "Control";
	    level_name[Level6] = "Shift Control";
    };

    type "FOUR_LEVEL_ALPHABETIC_CONTROL" {
        modifiers = Shift+Lock+LevelThree+Control;

        map[None] = Level1;
        map[Shift] = Level2;
        map[Lock]  = Level2;
        map[LevelThree] = Level3;
        map[Shift+LevelThree] = Level4;
        map[Lock+LevelThree] =  Level4;
        map[Lock+Shift+LevelThree] =  Level3;
        map[Control]  = Level5;
        map[Control+Shift] = Level6;

        preserve[Control] = Control;
        preserve[Shift+Control] = Control;

        level_name[Level1] = "Base";
        level_name[Level2] = "Shift";
        level_name[Level3] = "Alt Base";
        level_name[Level4] = "Shift Alt";
        level_name[Level5] = "Control";
        level_name[Level6] = "Shift Control";
    };

    type "FOUR_LEVEL_SEMIALPHABETIC_CONTROL" {
        modifiers = Shift+Lock+LevelThree+Control;

        map[None] = Level1;
        map[Shift] = Level2;
        map[Lock]  = Level2;
        map[LevelThree] = Level3;
        map[Shift+LevelThree] = Level4;
        map[Lock+LevelThree] =  Level3;
        map[Lock+Shift+LevelThree] = Level4;
        map[Control]  = Level5;
        map[Control+Shift] = Level6;

        preserve[Control] = Control;
        preserve[Shift+Control] = Control;
        preserve[Lock+LevelThree] = Lock;
        preserve[Lock+Shift+LevelThree] = Lock;

        level_name[Level1] = "Base";
        level_name[Level2] = "Shift";
        level_name[Level3] = "Alt Base";
        level_name[Level4] = "Shift Alt";
        level_name[Level5] = "Control";
        level_name[Level6] = "Shift Control";
    };

};
partial alphanumeric_keys
xkb_symbols "optimot_iso_18" {

	name[Group1]= "France - Optimot ISO v1.8.0";

	include "latin"

	key <TLDE> { type[group1] = "FOUR_LEVEL_CONTROL", [ dollar, EuroSign, dead_currency, copyright, dollar, dollar ] }; // $ € ¤ ©
	key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ guillemotleft, 1, leftdoublequotemark, onequarter, 1, 1 ] }; // « 1 “ ¼
	key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ guillemotright, 2, rightdoublequotemark, onehalf, 2, 2 ] }; // » 2 ” ½
	key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ quotedbl, 3, doublelowquotemark, threequarters, 3, 3 ] }; // " 3 „ ¾
	key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ minus, 4, U2011, onethird, 4, 4 ] }; // - 4 ‑ ⅓
	key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ plus, 5, plusminus, twothirds, 5, 5 ] }; // + 5 ± ⅔
	key <AE06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ asterisk, 6, multiply, U273B, 6, 6 ] }; // * 6 × ✻
	key <AE07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ slash, 7, backslash, division, 7, 7 ] }; // / 7 \ ÷
	key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ equal, 8, notequal, U2248, 8, 8 ] }; // = 8 ≠ ≈
	key <AE09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ parenleft, 9, bracketleft, minutes, 9, 9 ] }; // ( 9 [ ′
	key <AE10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ parenright, 0, bracketright, seconds, 0, 0 ] }; // ) 0 ] ″
	key <AE11> { type[group1] = "FOUR_LEVEL_CONTROL", [ at, underscore, U2212, figdash, minus, minus ] }; // @ _ − ‒
	key <AE12> { type[group1] = "FOUR_LEVEL_CONTROL", [ numbersign, percent, degree, masculine, plus, plus ] }; // # % ° º
	key <AD01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ agrave, Agrave, less, U2A7D, q, q ] }; // à À < ⩽
	key <AD02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ j, J, greater, U2A7E, j, j ] }; // j J > ⩾
	key <AD03> { type[group1] = "FOUR_LEVEL_ALPHABETIC_CONTROL", [ o, O, oe, OE, o, o ] }; // o O œ Œ
	key <AD04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ eacute, Eacute, dead_acute, Cyrillic_zhe, x, x ] }; // é É ´ ж
	key <AD05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ b, B, emdash, U274F, b, b ] }; // b B — ❏
	key <AD06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ f, F, leftsinglequotemark, U2726, f, f ] }; // f F ‘ ✦
	key <AD07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ d, D, braceleft, dagger, d, d ] }; // d D { †
	key <AD08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ l, L, braceright, doubledagger, l, l ] }; // l L } ‡
	key <AD09> { type[group1] = "FOUR_LEVEL_CONTROL", [ apostrophe, question, rightsinglequotemark, questiondown, semicolon, semicolon ] }; // ' ? ’ ¿
	key <AD10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ q, Q, dead_abovering, U2E2E, q, q ] }; // q Q ˚ ⸮
	key <AD11> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ x, X, bar, registered, x, x ] }; // x X | ®
	key <AD12> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ z, Z, rightarrow, trademark, z, z ] }; // z Z → ™
	key <AC01> { type[group1] = "FOUR_LEVEL_ALPHABETIC_CONTROL", [ a, A, ae, AE, a, a ] }; // a A æ Æ
	key <AC02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ i, I, downarrow, section, i, i ] }; // i I ↓ §
	key <AC03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ e, E, uparrow, paragraph, e, e ] }; // e E ↑ ¶
	key <AC04> { type[group1] = "FOUR_LEVEL_ALPHABETIC_CONTROL", [ u, U, ugrave, Ugrave, u, u ] }; // u U ù Ù
	key <AC05> { type[group1] = "FOUR_LEVEL_CONTROL", [ comma, semicolon, endash, checkmark, comma, comma ] }; // , ; – ✓
	key <AC06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ p, P, grave, U2605, p, p ] }; // p P ` ★
	key <AC07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ t, T, ampersand, U2B05, t, t ] }; // t T & ⬅
	key <AC08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ s, S, infinity, U2B07, s, s ] }; // s S ∞ ⬇
	key <AC09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ r, R, Lcaron, U2B06, r, r ] }; // r R Ľ ⬆
	key <AC10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ n, N, dead_tilde, U27A1, n, n ] }; // n N ~ ➡
	key <AC11> { type[group1] = "FOUR_LEVEL_CONTROL", [ dead_circumflex, exclam, dead_diaeresis, exclamdown, a, a ] }; // ^ ! ¨ ¡
	key <BKSL> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ ccedilla, Ccedilla, dead_horn, U1F12F, w, w ] }; // ç Ç ̛ 🄯
	key <LSGT> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ k, K, oslash, U2388, k, k ] }; // k K ø ⎈
	key <AB01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ y, Y, dead_abovedot, U2325, y, y ] }; // y Y ˙ ⌥
	key <AB02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ egrave, Egrave, dead_grave, U2318, c, c ] }; // è È ` ⌘
	key <AB03> { type[group1] = "FOUR_LEVEL_CONTROL", [ period, colon, ellipsis, periodcentered, v, v ] }; // . : … ·
	key <AB04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ w, W, U2022, ballotcross, w, w ] }; // w W • ✗
	key <AB05> { type[group1] = "FOUR_LEVEL_CONTROL", [ BackSpace, BackSpace, BackSpace, BackSpace, z, z ] }; //    
	key <AB06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ g, G, mu, U2723, g, g ] }; // g G µ ✣
	key <AB07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ c, C, dead_cedilla, U2660, c, c ] }; // c C ¸ ♠
	key <AB08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ m, M, dead_macron, heart, m, m ] }; // m M ¯ ♥
	key <AB09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ h, H, dead_breve, diamond, h, h ] }; // h H ˘ ♦
	key <AB10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC_CONTROL", [ v, V, dead_caron, club, v, v ] }; // v V ˇ ♣
	key <SPCE> { type[group1] = "FOUR_LEVEL_CONTROL", [ space, U202F, nobreakspace, hyphen, space, space ] }; //       ­

	include "level3(ralt_switch)"


};
xkb_compatibility { include "complete" };
xkb_keycodes      { include "evdev+aliases(azerty)" };
xkb_geometry { include "latin" };

J’ai également testé la méthode décrite ici en utilisant le fichier xkb complet, mais j’ai une erreur de syntaxe quand je nixos-rebuild, donc j’ai abandonné pour le moment…

Voilà voilà, je suis preneur si quelqu’un sait où est le problème! Merci d’avance pour vos précieux conseils :smiley:

J’utilise un layout custom mais uniquement un symbolsFile qui semble fonctionner pour toi (?). Est-ce que setxkbmap -keycodes optimot_iso_18 (peut être avec sudo) active l’entierté du layout?

Je sors ça de la fin du chapitre Custom XKB Layout de la doc, juste après:

Unfortunately, the Xorg server does not (currently) support setting a keymap directly but relies instead on XKB rules to select the matching components (keycodes, types, …) of a layout. This means that components other than symbols won’t be loaded by default.

Qui pourrait être ton soucis.

Une autre piste, est-ce que tu as essayé le layout “manuellement” avec xkbcomp comme décrit au début du chapitre? J’ai eu un peu de difficulté à forcer KDE Plasma à utiliser mon layout par le passé.

merci pour ta réponse, je teste tout ça dès que je rentre chez moi !

re, du coup j’ai essayé la première commande et j’obtiens Error loading new keyboard description. Bon.

Par contre, xkbcomp [lefichierdulayout.xkb] $DISPLAY donne :

Keycodes above 256 (e.g. <I256>) are not supported by X and are ignored
Error:            Can't find file "latin" for geometry include
                  Exiting
                  Abandoning geometry file "(null)"

Nous voilà sur quelque chose qui semble un peu plus informatif!

EDIT après un petit tour dans le dossier geometry : Il n’y a en effet pas de geometry latin :thinking: , je vais regarder sur mon ordinateur où la disposition fonctionne pour comparer.