Перемещение клавиш навигации

Старые добрые иксы

Когда небо было синее, а пещеры теплее, клавиатуры терминалов более походили на клавиатуры пишущих машинок. Например, там не было стрелок. В это-то доисторическое время и появилось загадочное буквосочетание HJKL, до сих пор, естественно, использующееся для навигации в vim.

В этой статье мы, с помощью xkb, перенесём стрелки на клавиши AltGr+JIKL. (AltGr — это правый Alt, который исторически переключают в роль дополнительного модификатора, незамысловато называемого в иксах ISO_Level3_Shift.) Данное сочетание удобнее для школоты, вроде меня, чем легендарное HJKL. Однако подход, естественно, общий, и переводить стрелки можно куда угодно!

Прямая модификация системных конфигов

Обработкой клавиатурного ввода в X Window System занимается подсистема xkb. Сейчас xkb, как и положено составляющей X-ов, живёт в шизофреническом режиме совмещения самого древнего и самого прогрессивного. В итоге, для настройки раскладок мы имеем одновременно две хитрые системы: xmodmap и, собственно, xkb. Мы будем использовать xkb, как более современную и функциональную систему.

Пользовательские настройки для xkb можно задавать с помощью набора конфигов в одном из dot-каталогов, но, безусловно, отважнее будет изменить непосредственно системные.

Свою конфигурацию xkb хранит в директории /usr/share/X11/xkb. Например, в файле symbols/us мы найдём строки

key <AD08> {[i, I]};
...
key <AC07> {[j, J]};
key <AC08> {[k, K]};
key <AC09> {[l, L]};

key <AD08> {[Cyrillic_sha, Cyrillic_SHA]};
...
key <AC07> {[Cyrillic_o, Cyrillic_O]};
key <AC08> {[Cyrillic_el, Cyrillic_EL]};
key <AC09> {[Cyrillic_de, Cyrillic_DE]};

Это клавиши JIKL в английской и русской раскладках (не спрашивайте меня, что русские символы делают в файле us). Вообще, чтобы добавить вариант символа для клавиши, достаточно написать так:

key <AC07> {[j, J, Left]};

Теперь, если зажать некий модификатор, который бы активировал третий слой символов, и нажать j, то будет сгенерирована команда навигации влево Left.

Описать такое поведение можно с помощью модификации файла types/basic примерно так, как это сделано по ссылке xkb on maemo - problems generating level3 left and right :

  type "MOD5_NAV" {
    modifiers       = Shift+Mod5;
    map[None]      = level1;
    map[Shift]      = level2;
    map[Mod5]        = level3;
    map[Mod5+Shift] = level3;
    preserve[Shift] = Shift;
    preserve[Mod5+Shift] = Shift;
    level_name[Level1] = "Base";
    level_name[Level2] = "Caps";
    level_name[Level3] = "Arrows";
};

Данный код добавляет новый тип клавиши MOD5_NAV, при котором активация третьего слоя (level3) происходит по так называемому модификатору Mod5. Также в рамках данного нового типа будет сохраняться состояние модификатора Shift, что важно для того, чтобы работало выделение текста.

Теперь достаточно указать данный тип для интересующих нас клавиш и добавить остальные команды-символы на третий слой:

key <AD07> { type[Group1]="MOD5_NAV", [ u, U, Home ] };
key <AD08> { type[Group1]="MOD5_NAV", [ i, I, Up ] };
key <AD09> { type[Group1]="MOD5_NAV", [ o, O, Prior ] };

key <AC06> { type[Group1]="MOD5_NAV", [ h, H, Insert ] };
key <AC07> { type[Group1]="MOD5_NAV", [ j, J, Left ] };
key <AC08> { type[Group1]="MOD5_NAV", [ k, K, Down ] };
key <AC09> { type[Group1]="MOD5_NAV", [ l, L, Right ] };

key <AB06> { type[Group1]="MOD5_NAV", [ n, N, Delete ] };
key <AB07> { type[Group1]="MOD5_NAV", [ m, M, End ] };

key <AB09> { type[Group1]="MOD5_NAV", [ period, greater, Next ] };

key <AD07> { type[Group1]="MOD5_NAV", [ Cyrillic_ghe, Cyrillic_GHE, Home  ] };
key <AD08> { type[Group1]="MOD5_NAV", [ Cyrillic_sha, Cyrillic_SHA, Up  ] };
key <AD09> { type[Group1]="MOD5_NAV", [ Cyrillic_shcha, Cyrillic_SHCHA, Prior  ] };

key <AC06> { type[Group1]="MOD5_NAV", [ Cyrillic_er, Cyrillic_ER, Insert  ] };
key <AC07> { type[Group1]="MOD5_NAV", [ Cyrillic_o, Cyrillic_O, Left  ] };
key <AC08> { type[Group1]="MOD5_NAV", [ Cyrillic_el, Cyrillic_EL, Down      ]   };
key <AC09> { type[Group1]="MOD5_NAV", [ Cyrillic_de, Cyrillic_DE, Right  ] };

key <AB06> { type[Group1]="MOD5_NAV", [ Cyrillic_te, Cyrillic_TE, Delete  ] };
key <AB07> { type[Group1]="MOD5_NAV", [ Cyrillic_softsign, Cyrillic_SOFTSIGN, End  ] };

key <AB09> { type[Group1]="MOD5_NAV", [ Cyrillic_yu, Cyrillic_YU, Next  ] };

Наконец, необходимо настроить AltGr как модификатор для выбора третьего слоя:

include "level3(ralt_switch)"

Готово. Перезапускаем иксы или вводим нечто вроде

$ setxkbmap -layout us,ru

Старые стрелки

Чтобы быстрее привыкнуть к новому расположению, можно заменить в symbols/pc

key   <UP> {    [  Up   ]   };
key <LEFT> {    [  Left ]   };
key <DOWN> {    [  Down ]   };
key <RGHT> {    [  Right ]  };

на

key   <UP> {    [  NoSymbol    ]    };
key <LEFT> {    [  NoSymbol    ]    };
key <DOWN> {    [  NoSymbol    ]    };
key <RGHT> {    [  NoSymbol    ]    };

что отключит старые клавиши стрелок. Помогает привыкнуть к новой раскладке.

Проблемы

Не смотря на то, что мы переназначаем раскладку на самом первичном уровне X Window System, тем не менее, некоторые особенно кривые программы, вроде doublecmd-gtk (QT-версия работает чуть лучше) могут неправильно распознавать их, применяя, видимо, некий хардкор для обработки клавиш.

Однако подавляющее большинство программ будут прозрачно работать с таким переназначением в отличие от других методов, как то: autohotkey, RedirectKey (xkb), xbindkeys и проч.

Ссылки

Мои конфиги xkb: файлы символов us, ru и файл типов basic.

Обещаю всем, кто настроит себе самые удобные клавиши навигации, такой большой скорости печати кода, что вы не будете успевать его читать]

 

shitpoet@gmail.com

 



 

free hit counters