Pull to refresh

Игры с xkbcomp — настраиваем асимметричное переключение раскладок клавиатуры

Reading time 2 min
Views 3.7K
Хочу поделиться с сообществом своею нелюбовью к циклическому переключению раскладок клавиатуры. Циклически это как? Это когда за английским следует русский, за русским украинский, за украинским опять английский и т.д.
До чего-же упрощается жизнь когда привыкаешь к асимметричному переключению раскладок. Это когда переключению в каждую раскладку соответствует своя комбинация.
Например, хотите английский — нажмите CapsLock (очень часто-густо нужная клавиша, правда?), русский — Shift + CapsLock, украинский Ctrl + CapsLock. Кажется неудобным? Как бы не так! Когда привыкните — не сможете больше отвыкнуть.

Так как же это сделать в любимых X'ах? Вот небольшой keymap:
xkb_keymap {
    xkb_keycodes { include "evdev+aliases(qwerty)" };
    xkb_geometry { include "pc(pc104)" };
    xkb_compatibility { include "complete" };
    xkb_types    {
        include "complete"
        type "THREE_GROUPS" {
            modifiers = Shift+Control+Alt;
            map[None] = Level1;
            map[Shift] = Level2;
            map[Control] = Level3;
            map[Control+Shift] = Level4;
            map[Alt] = Level5;
            level_name[Level1] = "Base";
            level_name[Level2] = "Shift";
            level_name[Level3] = "Ctrl";
            level_name[Level4] = "Ctrl Shift";
            level_name[Level5] = "Alt";
        };
    };
    xkb_symbols {
        include "pc+us+ru:2+ua:3+us(dvorak):4+level3(menu_switch)+inet(evdev)"
        replace key {
            type = "THREE_GROUPS",
            actions[Group1]=[LockGroup(group=1), LockGroup(group=2), LockGroup(group=3), LockMods(modifiers=Lock), LockGroup(group=4)]
        };
    };
};

«Изюминка» тут даже невооружённым взглядом заметна. Ну и ещё. Безусловно этот конфиг в каждой секции можно дополнить другими определениями — это всего лишь обычный keymap который скармливается xkbcomp'у.

Чтобы этот конфиг отрабатывал каждый раз при входе в любимый DE, сохраним вышеприведённый конфиг, скажем, в /usr/share/X11/xkb/keymap/three_groups и напишем следующий маленький скрипт в /etc/X11/Xsession.d/60xkb-lang:
(
cd /usr/share/X11/xkb/ && xkbcomp keymap/three_groups $DISPLAY &>/dev/null
)

true

Маленькая заметка напоследок. Уже несколько раз при обновлении любимого Debian'а сталкивался с проблемой, что разработчики что-то переписывали-переопределяли в xkb в результате чего надо было заново и заново пытаться перелопатить конфиг в поиске нужной комбинации include в symbols.

Однажды, в очередной раз обновившись, в расстроенных чувствах обнаружил, что у меня не отрабатывают клавиши Up, Down, Left, Right, Home и т.д. когда компилится мой keymap. Но при этом великолепно работают при, так сказать, установках «по-умолчанию» в Gnome. Простая командочка, запущенная при дефолтных настройках:
xkbcomp $DISPLAY - | egrep "^xkb_"

позволила увидеть искомую комбинацию для include. Будет получен примерно такой вывод:
xkb_keymap {
xkb_keycodes "evdev+aliases(qwerty)" {
xkb_types "complete" {
xkb_compatibility "complete" {
xkb_symbols "pc+us+ru:2+ua:3+us(dvorak):4+level3(menu_switch)+inet(evdev)" {
xkb_geometry "pc(pc104)" {

Вспоминаю, что счастью не было предела! ;)

Ну, собственно, на этой оптимистической нотке эту заметку можно и закончить. Попробуйте асимметричное переключение раскладок, привыкните — отказаться будет сложно ;)
Tags:
Hubs:
+2
Comments 17
Comments Comments 17

Articles