Skip Navigation
Computer Keyboards @lemmy.ml
Ordoviz @lemmy.ml

How I created a custom keyboard layout for special characters with XKB

I use a German keyboard but switched to the QWERTY layout to input programming symbols more easily. I still want to be able to type German umlauts, though. My keyboard also has a alt gr key that I want to put to use. So I created the file ~/.xkb/symbols/us-custom with the following contents:

 undefined
    
default partial alphanumeric_keys
xkb_symbols "basic" {
    // Umlauts (ä, ö, ü) and €
    include "us(de_se_fi)"

    name[Group1] = "US layout plus some Unicode symbols using altgr combinations";
    // <AC06> means: middle row, 6th key on the board from the left

    // Unicode arrows (←, ↓, ↑, →)
    key <AC06> { [ h, H, U2190 ] };
    key <AC07> { [ j, J, U2193 ] };
    key <AC08> { [ k, K, U2191 ] };
    key <AC09> { [ l, L, U2192 ] };

    // Typographic punctuation
    key <AE11> { [      minus, underscore,   endash,       emdash ] };
    key <AB09> { [     period,    greater, ellipsis               ] };
    key <AB10> { [      slash,   question, division, questiondown ] };
    key <AE08> { [          8,   asterisk,        8,     multiply ] };
    key <AC11> { [ apostrophe,   quotedbl, rightsinglequotemark   ] };

    // Quotes
    key <AB02> { [ x, X,       guillemotright,            0x100203a ] };
    key <AB03> { [ c, C,        guillemotleft,            0x1002039 ] };
    key <AB04> { [ v, V,   doublelowquotemark,   singlelowquotemark ] };
    key <AB05> { [ b, B,  leftdoublequotemark,  leftsinglequotemark ] };
    key <AB06> { [ n, N, rightdoublequotemark, rightsinglequotemark ] };
};

  

In line 4 I included the de_se_fi section of /usr/share/X11/xkb/symbols/us. This has the same effect as putting the following into my custom layout:

 undefined
    
include "us(basic)"
include "eurosign(e)"

key <AC01> {[ a,          A,          adiaeresis, Adiaeresis ]};
key <AD09> {[ o,          O,          odiaeresis, Odiaeresis ]};
key <AC02> {[ s,          S,          ssharp,     U1E9E      ]};
key <AD07> {[ u,          U,          udiaeresis, Udiaeresis ]};
key <AD10> {[ p,          P,          aring,      Aring      ]};

include "level3(ralt_switch)"

  

Including level3(ralt_switch) allows me to access the third layer by holding down the right alt key. This is how you access the other layers:

  • 1: hold down nothing
  • 2: hold Shift
  • 4: hold Shift+alt

With the key keyword you can remap a key. In the angle brackets you specify the position of the key on the keyboard. The second letter specifies the row:

  • B: bottom row
  • C: middle row
  • D: top row
  • E: number row

The next two digits specify the position on the row starting with 01 from the left.

The next bit of syntax is self-explanatory:

 undefined
        {[ layer1, layer2, layer3, layer4 ]};


  

You can leave out layer4 to map it to nothing.

You then should be able to select your custom layout. If you use Sway, add the following to the config file.

 undefined
        input * xkb_layout "us-custom"


  

Alternatively, export the environment variable XKB_DEFAULT_LAYOUT=us-custom.

See also: XKB on ArchWiki

0 comments

No comments

Start the conversation!