Перемещение клавиш навигации
Старые добрые иксы
Когда небо было синее, а пещеры теплее, клавиатуры терминалов более походили на клавиатуры пишущих машинок. Например, там не было стрелок. В это-то доисторическое время и появилось загадочное буквосочетание 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 и проч.
Ссылки
- Статья на Хабре, где автор предлагает для переназначения навигационных клавиш использовать AutoHotkey
-
Интересная статья оттуда же, где используется
xkb
- Маленькая статья "Как запомнить HJKL"
- Целый pdf-документ о том, какие ещё изменения можно внести в свою клавиатуру
-
Сайт автора Ivan Pascal с детальной информацией о
xkb
Мои конфиги xkb
: файлы символов us, ru и файл типов basic.
Обещаю всем, кто настроит себе самые удобные клавиши навигации, такой большой скорости печати кода, что вы не будете успевать его читать]
shitpoet@gmail.com