Keyboard input (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Keyboard input
. Дата последней синхронизации: 13 февраля 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
Дополнительные клавиши
Необходимым условием для изменения сопоставления клавиш является понимание того, как нажатие клавиши приводит к появлению символа:
Клавиатура посылает компьютеру
скан-код
(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
:
[1]
# 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 ------------
Совет
Если вы не знаете, какой event-номер имеет интересующее вас устройство, вы можете запустить
evtest
без параметров, и он покажет вам список устройств с их event-номерами, после чего вы можете ввести нужный номер.
Используйте поле "value" из
MSC_SCAN
. В этом примере показано, что NumLock имеет сканкод 70053 и keycode 69.
С помощью dmesg
Примечание
Этот метод не показывает
скан коды
всех клавиш, он показывает их только для неизвестных клавиш.
Вы можете узнать
скан-код
клавиши, нажав её и посмотрев вывод команды
dmesg
. Например, если у вас отображается такая строка:
Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0
значит,
скан код
нужной вам клавиши -
0xa0
.
Определение кодов клавиш
Коды клавиш Linux определены в файле
/usr/include/linux/input-event-codes.h
(смотрите переменные
KEY_
).
Определение кодов клавиш в консоли
В
виртуальной консоли Linux
коды клавиш
можно узнать утилитой
showkey(1)
.
showkey
ждёт нажатия клавиш, и если нажатий нет в течение 10 секунд, выходит (это единственный способ выйти из программы) Чтобы работать с
showkey
, вы должны быть в виртуальной консоли, а не в графическом окружении. Выполните следующую команду:
# showkey --keycodes
и понажимайте клавиши на клавиатуре. Вы должны увидеть
коды клавиш
на экране.
Определение кодов клавиш в Xorg
Примечание
The Xorg
keycodes
are 8 larger than the Linux
keycodes
.
[2]
В графическом режиме
коды клавиш
, которые использует
Xorg
, можно узнать с помощью утилиты
xev(1)
, которая поставляется в пакете
xorg-xev
. Разумеется, чтобы работать с
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