Дополнительная цифровая клавиатура (numpad) пришла к нам из 1981 года с клавиатуры IBM Model F. Отдельных клавиш со стрелками тогда не было, потому вместе с ней пришла и клавиша Num Lock, переключавшая клавиатуру из режима ввода цифр в режим управления курсором курсором. Отдельные клавиши для управления появились в 1986 году в IBM Model M,s но два режима работы (курсор/цифры) за последовавших 30 лет так и не убрали.
Я использую дополнительную клавиатуру исключительно для ввода цифр и потому я решил отключить переключение режимов вовсе, чтобы не следить за состоянием Num Lock-а. X11 позволяет это сделать, а заодно и переназначить клавишу (./Del) на то, чтобы она всегда вводила точку (а не десятичный разделитель из локали).
Один из возможных способов (не самый оптимальный, зато с наименьшим количеством телодвижений) таков:
Делаем свою раскладку на основе стандартной в файле .Xkeymap. Переопределим только поведение дополнительных клавиш:
xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete+ledscroll(group_lock)" }; xkb_symbols { include "pc+us+typo+ru:2+typo:2+inet(evdev)+group(ctrl_shift_toggle)+level3(ralt_switch)+ctrl(nocaps)+terminate(ctrl_alt_bksp)" key <KP1> { [ KP_1 ] }; key <KP2> { [ KP_2 ] }; key <KP3> { [ KP_3 ] }; key <KP4> { [ KP_4 ] }; key <KP5> { [ KP_5 ] }; key <KP6> { [ KP_6 ] }; key <KP7> { [ KP_7 ] }; key <KP8> { [ KP_8 ] }; key <KP9> { [ KP_9 ] }; key <KP0> { [ KP_0 ] }; key <KPDL> { [ KP_Decimal, KP_Decimal, KP_Decimal, KP_Decimal ], [ KP_Decimal, KP_Decimal, KP_Decimal, KP_Decimal ] }; }; xkb_geometry { include "pc(pc105)" }; };
Как можно видеть, я добавляю типографскую раскладку (+typo+level3(ralt_switch)), делаю переключение групп по Ctrl-Shift(+group(ctrl_shift_toggle)) и заменяю Caps Lock на Ctrl (+ctrl(nocaps)). Для всех клавиш дополнительной клавиатуры перечисляю, что у них есть только цифровой код клавиши, а для KPDL (та самая с точкой) — указываю, что при любом состоянии модификаторов и выбранной группе она должна выдавать точку.
Загрузим эту раскладку при старте сессии (я добавляю строку в файл .xsession):
xkbcomp .Xkeymap $DISPLAY