Keyboard input (Русский)
Необходимым условием для изменения сопоставления клавиш является понимание того, как нажатие клавиши приводит к появлению символа:
- Клавиатура посылает компьютеру скан-код (scancode).
- Ядро Linux сопоставляет сканкод с кодом клавиши (keycode); смотрите Map scancodes to keycodes.
- Раскладка клавиатуры сопоставляет код клавиши с символом клавиши (keysym) в зависимости от того, какие клавиши-модификаторы нажаты.
- Для консоли Linux смотрите статью Конфигурация клавиатуры в консоли.
- Для Xorg и Wayland смотрите статью Конфигурация клавиатуры в Xorg.
Большинство ваших клавиш уже должны иметь код клавиши или хотя бы скан-код. Клавиши без скан-кода не распознаются ядром; это могут быть дополнительные клавиши от «игровых» клавиатур и т.д.
В Xorg некоторым символам клавиш (например XF86AudioPlay
, XF86AudioRaiseVolume
) можно назначить действия (такие как запуск внешних приложений). Подробности смотрите в статье Горячие клавиши#Xorg.
В консоли Linux некоторым символам клавиш (например, F1
– F246
) могут быть назначены определённые действия (например, переключение на другую консоль или печать некоторой последовательности символов). Подробности смотрите в статье Конфигурация клавиатуры в консоли#Создание своей раскладки.
Определение скан-кодов
С помощью showkey
Традиционный способ узнать скан код — воспользоваться утилитой showkey(1). showkey ожидает нажатия клавиши, или выходит, если не было нажатий в течение 10 секунд. Чтобы работать с showkey, вы должны быть в виртуальной консоли, а не в графическом окружении или работать, залогинившись по сети. Выполните следующую команду:
# showkey --scancodes
и понажимайте клавиши на клавиатуре; вы должны увидеть скан коды на экране.
С помощью evtest
Для USB клавиатур, видимо, нужно использовать evtest(1) из пакета evtest вместо showkey:
# evtest /dev/input/event12 ... Event: time 1434666536.001123, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70053 Event: time 1434666536.001123, type 1 (EV_KEY), code 69 (KEY_NUMLOCK), value 0 Event: time 1434666536.001123, -------------- EV_SYN ------------
Используйте поле "value" из . В этом примере показано, что NumLock имеет сканкод 70053 и keycode 69.
С помощью dmesg
Вы можете узнать скан-код клавиши, нажав её и посмотрев вывод команды dmesg. Например, если у вас отображается такая строка:
Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0
значит, скан код нужной вам клавиши - .
Определение кодов клавиш
Коды клавиш Linux определены в файле /usr/include/linux/input-event-codes.h
(смотрите переменные KEY_
).
Определение кодов клавиш в консоли
В виртуальной консоли Linux коды клавиш можно узнать утилитой showkey(1). showkey ждёт нажатия клавиш, и если нажатий нет в течение 10 секунд, выходит (это единственный способ выйти из программы) Чтобы работать с showkey, вы должны быть в виртуальной консоли, а не в графическом окружении. Выполните следующую команду:
# showkey --keycodes
и понажимайте клавиши на клавиатуре. Вы должны увидеть коды клавиш на экране.
Определение кодов клавиш в Xorg
В графическом режиме коды клавиш, которые использует Xorg, можно узнать с помощью утилиты , которая поставляется в пакете . Разумеется, чтобы работать с xev, вы должны находиться в графическом окружении, а не в консоли.
Выполнив следующую команду, вы запустите xev с выводом только релевантной информации:
$ xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
Вот пример вывода:
38 a 55 v 54 c 50 Shift_L 133 Super_L 135 Menu
Xbindkeys — ещё одна обёртка для xev, которая сообщает коды клавиш.
Если вы нажимаете клавишу и ничего не появляется на терминале, это может означать, что либо у клавиши нет скан кода, либо сканкоду не назначен код клавиши, либо какой-то другой процесс отлавливает нажатия клавиш. Если вы подозреваете, что процесс, слушающий X сервер отлавливает нажатия клавиш, вы можете попробовать запустить xev из чистой X сессии:
$ xinit /usr/bin/xterm -- :1
Смотрите также
- kbd-project — официальный сайт утилиты showkey