Pull to refresh

Как сделать кастомную раскладку клавиатуры в Linux

Level of difficultyEasy
Reading time4 min
Views3.4K

Зачем?

Когда я изучал сербский язык, то использовать сербскую латинскую раскладку было мучением. Несмотря на то, что она называется QWERTY, она сильно отличается от стандартной английской раскладки. Совпадающие буквы на своих местах, но дополнительные находятся на местах занятых различными знаками препинания, скобочками и сами знаки препинания расположены по другому.

При этом с сербской кириллической раскладкой проблем не было, т.к. есть русская раскладка, у которой через правый Alt включаются дополнительные сербские буквы.

В какой-то момент я подумал, что можно сделать свою раскладку, взяв за основу английскую и добавив сербские символы через правый Alt. Например, RightAlt + s = š, RightAlt + d = đ и т.д.

Я ожидал что есть какой-то GUI в котором можно потыкать кнопки и получить нужную раскладку. Но такого я не нашел. Все делается через редактирование файлов. Плюс я не нашел понятного туториала. Что-то конечно я смог найти, но в некоторых местах приходилось догадываться и действовать методом тыка.

Теория

Все раскладки лежат в папке /usr/share/X11/xkb/symbols/, например все русские раскладки находятся в файле ru, а английские в файлах us и gb.

Откроем файл ru, чтобы на примере понять что там находится. В начале фала имеются следующие строки:

// Windows layout
default partial alphanumeric_keys
xkb_symbols "winkeys" {

    include "ru(common)"
    name[Group1]= "Russian";

    key <AE03>  {[          3,  numerosign  ]};
    key <AE04>  {[          4,   semicolon  ]};
    key <AE05>  {[          5,     percent  ]};
    key <AE06>  {[          6,       colon  ]};
    key <AE07>  {[          7,    question  ]};
    key <AE08>  {[          8,    asterisk,      U20BD  ]}; // ruble

    key <AB10>  {[     period,       comma  ]};
    key <BKSL>  {[  backslash,       slash  ]};
};

Это одна из русских раскладок, а ниже находятся другие,  вот начало следующей.

hidden partial alphanumeric_keys
xkb_symbols "common" {

    key <AE01>  {[          1,      exclam  ]};
    key <AE02>  {[          2,    quotedbl  ]};
    key <AE03>  {[          3,  numbersign  ]};
    key <AE04>  {[          4,    asterisk  ]};
    key <AE05>  {[          5,       colon  ]};
    key <AE06>  {[          6,       comma  ]};
...

Методом дедукции я выяснил, что строка include "ru(common)" означает, что раскладка "winkeys", а точнее "ru(winkeys)", наследуется от раскладки "ru(common)". ru в данном случае это название файла, а "common" это то что определено в строке xkb_symbols "common" {

Изначально я этот момент не понял и там где я читал он описан не был, поэтому я сначала копировал полностью все символы. Но поняв, что тут можно понаследоваться, упростил итоговую раскладку.

Далее идет name[Group1]= "Russian"; - это то как расклада будет отображаться в интерфейсе выбора раскладок.

Далее строчка

 key <AE01>  {[          1,      exclam  ]};

Это значит что на клавишу AE01 мы биндим цифру 1, а при нажатом шифте - exclam - т.е. восклицательный знак. Совершенно не понятно, что такое AE01. А это то, как клавиша физически расположена на клавиатуре.

"А" означает что-то мы ищем клавишу на цифро-буквенном блоке клавиатуры. Другие значения могут быть "KP" - для блока с цифрами and "FK" для функциональных клавиш (видимо F1-F12, но я не проверял).

E означает - это ряд при счете снизу. Ряд с пробелом - это А, далее B, C, D, E - т.е. пятый ряд снизу.

01 означает, что эта первая клавиша слева, не считая табов, капслоков, шифтов и т.п.

Более подробно можно почитать вот тут.

Ок, а как добавить правый Alt?

Для этого нужно добавить еще два столбца.

Например вот, как это выглядит в одной из раскладок:

    key <AD01> { [         q,          Q,    adiaeresis,       Adiaeresis ] };

Тут на клавишу Q добавлены дополнительные слои. Первый слой - просто нажатие, второй - через Shift, третий - через правый Alt и четвертый - правый Alt + Shift. Однако само по себе оно не заработает. Методом наблюдения за другими раскладками, я выяснил что альтовая магия добавляется строкой include "level3(ralt_switch)".

Еще осталось разобрать строчку default partial alphanumeric_keys, но я сам с этим не стал разбираться, т.к. свою задачу я решил.

Но это еще не все что нужно знать. Латинские символы добавляются просто, но тот же восклицательный знак добавлен специальным кодом "exclam". Откуда взять этот код?

Получить код нужного символа можно с помощью следующей команды, предварительно установив xev через apt, pacman, dnf или что там у вас.

xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'

Например, запустив эту команду и нажав "š" - получаем следующий вывод:

39  scaron

Это значит, что код символа š - scaron.

Практика

К этому моменту вы должны были уже окончательно запутаться. Собственно мне было еще сложнее. Но на практике все выглядит не так уже сложно.

Переходим в папку /usr/share/X11/xkb/symbols/ и создаем файл с названием rs_latin_custom, с таким содержимым:

default partial alphanumeric_keys modifier_keys
xkb_symbols "rs_latin_custom" {

    include "us(basic)"
    name[Group1]= "Serbian (Latin, AltGr)";

    // Serbian
    key <AC02>  {[   s,  S, scaron, Scaron      ]};
    key <AC03>  {[   d,  D, dstroke, Dstroke      ]};
    key <AB01>  {[   z,  Z, zcaron, Zcaron      ]};
    key <AB02>  {[   x,  X, ccaron, Ccaron     ]};
    key <AB03>  {[   c,  C, cacute, Cacute      ]};

    include "level3(ralt_switch)"
};

Название в строке xkb_symbols "rs_latin_custom" можно выбрать любое, оно может не совпадать с названием файла.

Далее я понаследовался от стандартной английской раскладки "us(basic)" и добавил сербские символы на 3й слой и их заглавные варианты на 4й. Чтобы переключение слоев происходило через правый Alt - добавлена строка include "level3(ralt_switch)"

Получившаяся раскладка выглядит вот так:

Чтобы отобразить ее в GUI можно воспользоваться командами:

gkbd-keyboard-display -l "rs_latin_custom(rs_latin_custom)"

или

tecla "rs_latin_custom(rs_latin_custom)"

Но это еще не все. Чтобы раскладка появилась в списке раскладок, нужно отредактировать файл /usr/share/X11/xkb/rules/evdev.xml

Нужно открыть его, найти в нем закрывающий элемент

 </layoutList>

И добавить перед ним описание нашей раскладки:

    <layout>
      <configItem>
        <name>rs_latin_custom</name>
        <shortDescription>sr</shortDescription>
        <description>Serbian (Latin, AltGr)</description>
        <languageList>
          <iso639Id>eng</iso639Id>
          <iso639Id>srp</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
  </layoutList>

shortDescription - это то как язык будет отображаться в переключалке языков. В некоторых местах пишут еще нужно поправить файл evdev.lst, но зачем это нужно я не знаю. Без него все работает как надо.

После этого нужно перелогиниться в моем случае в Gnome, и можно будет выбрать новую раскладку.

Уменьшение количества раскладок

Дополнительно мне удалось уменьшить количество моих раскладок на одну. Вместо 5 их стало 4. На русской раскладке я добавил сербскую кириллицу и украинские символы.

Обо мне

Я программист, в свободное время изучаю иностранные языки. Мои языки ?? ?? ?? ?? ?? ?? ?? ??. Я веду телеграм канал Заметки полиглота, где я делюсь своими мыслями по поводу изучения языков.

Tags:
Hubs:
Total votes 14: ↑14 and ↓0+14
Comments13

Articles