Вопрос или проблема
Я хочу изменить некоторые модификаторы на своей клавиатуре. Используя xkbcomp :0 /tmp/maps
и просматривая /usr/share/X11/xkb
, я выяснил, что модификаторы были сопоставлены в /usr/share/X11/xkb/symbols/pc
. Я хочу удалить некоторые из этих модификаторов, но смотрев на документацию и исходный код для xkbcommon, похоже, нет команды для снятия сопоставления модификаторов, если только этот не задокументированный keyword
не делает что-то.
Возможно ли снять сопоставление модификаторов или мне нужно копировать и изменять файл символов pc?
Изменение модификаторов достаточно легко с помощью xmodmap. Вот несколько примеров: Caps Lock на Compose, Caps Lock на Hyper. Не забудьте сохранять согласованность между keysyms и назначениями модификаторов, иначе случатся странные вещи.
С XKB многое требует создания нового ключевого сопоставления и его загрузки. Вы можете создать ключевое сопоставление на основе существующих настроек. Если вы хотите детально контролировать отдельные настройки, вы можете выгрузить текущее ключевое сопоставление, переписать его и загрузить результат. Например, следующий непроверенный код должен удалить любое назначение модификатора из LWIN
(обратите внимание, что он не проверяет, действительно ли LWIN
сопоставлен с модификатором).
xkbcomp "$DISPLAY" - |
grep -v -E -e '^ *key <LWIN>.*;' -e '^ *modifier_map .*<LWIN>' |
xkbcomp - "$DISPLAY"
Другой подход заключается в том, чтобы создать ключевое сопоставление из частей, которые не включают сопоставление модификаторов, которое вы не хотите. Это более сложно, если единственное, что вы хотите сделать, это снять сопоставление модификатора, но это может быть проще в целом, в зависимости от того, что вы делаете. Я использую этот подход. Вот упрощенная версия моего кода, которая показывает, как инвертировать эффект NumLock: цифровая клавиатура вставляет числа без Shift, когда модификатор NumLock выключен.
# Секция конфигурации. Пусто, чтобы сохранить настройки по умолчанию.
# В противном случае base+file1(partial_section1)+file2(partial_section2)+...
xkb_geometry=
xkb_keycodes=
xkb_layout=
xkb_symbols=
xkb_types=complete+mytypes(invert_numlock)
{
set setxkbmap
[ -n "$xkb_geometry" ] && set "$@" -geometry "$xkb_geometry"
[ -n "$xkb_keycodes" ] && set "$@" -keycodes "$xkb_keycodes"
[ -n "$xkb_layout" ] && set "$@" -layout "$xkb_layout"
[ -n "$xkb_symbols" ] && set "$@" -symbols "$xkb_symbols"
[ -n "$xkb_types" ] && set "$@" -types "$xkb_types"
"$@" -print
} | xkbcomp -I"$HOME/etc/xkb" - "$DISPLAY"
Тип complete
поставляется с XKB. У меня есть файл ~/etc/xkb/types/mytypes
со следующим содержимым:
partial xkb_types "invert_numlock" {
type "KEYPAD" {
modifiers = Shift+NumLock;
map[None] = Level2;
map[Shift] = Level1;
map[NumLock] = Level1;
map[Shift+NumLock] = Level2;
level_name[Level1] = "Base";
level_name[Level2] = "Number";
};
//include "extra(keypad)"
};
Плюс дополнительная магия, не показанная здесь, чтобы раскомментировать включение extra(keypad)
на старых системах, где эта строка необходима. Карты, поставляемые с XKB, не меняются часто, но они не пытаются сохранить обратную совместимость для людей, которые не удовлетворены предопределёнными опциями.
Переопределить несколько ключевых кодов с XKB и Как работает компиляция xkb? могут быть полезны как дополнительная информация о XKB.
Ответ или решение
При использовании XKB для изменения модификаторов на клавиатуре, вопрос о том, возможно ли отменить команду modifier_map
, является важным аспектом. Давайте разберем это более подробно.
Введение в XKB
XKB (X Keyboard Extension) предоставляет мощный и гибкий инструмент для настройки раскладок клавиатур и настройки модификаторов на уровне X Window System. Работая с XKB, вы можете задавать различные параметры, такие как сопоставления ключей, модификаторы и типы клавиатуры.
Отмена изменения модификаторов
К сожалению, в XKB нет прямой команды для "отмены" определенной команды modifier_map
. Когда вы применяете изменения с помощью xkbcomp
, вы фактически загружаете полную новую конфигурацию клавиатуры, и возможности по отмене отдельных действий довольно ограничены.
1. Использование xkbcomp
Для изменения модификаторов необходимо сначала получить текущую карту клавиатуры, затем удалить или изменить нужные строки, и после этого загрузить обновленное состояние. Пример команды, которая загрузит текущую конфигурацию и удалит привязку LWIN
к модификатору, может выглядеть следующим образом:
xkbcomp "$DISPLAY" - | \
grep -v -E -e '^ *key <LWIN>.*;' -e '^ *modifier_map .*<LWIN>' | \
xkbcomp - "$DISPLAY"
Этот подход позволяет вам "отменить" назначения модификатора, но на самом деле вы создаете новую конфигурацию на основе существующей, исключая ненужные модификаторы.
2. Конструирование новой клавиатурной карты
Другой способ — это создание новой клавиатурной карты, которая не будет содержать карты модификаторов, которые вы хотите удалить. Этот подход требует более сложной работы, но может быть более удобным для более обширных изменений.
Вы можете создать .xkb
файл, который будет состоящий из необходимых вам компонентов и будет исключать ненужную настройку модификаторов. Например:
xkb_geometry=
xkb_keycodes=
xkb_layout=
xkb_symbols=
xkb_types=complete+mytypes(your_custom_types)
{
set setxkbmap
[ -n "$xkb_geometry" ] && set "$@" -geometry "$xkb_geometry"
[ -n "$xkb_keycodes" ] && set "$@" -keycodes "$xkb_keycodes"
[ -n "$xkb_layout" ] && set "$@" -layout "$xkb_layout"
[ -n "$xkb_symbols" ] && set "$@" -symbols "$xkb_symbols"
[ -n "$xkb_types" ] && set "$@" -types "$xkb_types"
"$@" -print
} | xkbcomp -I"$HOME/etc/xkb" - "$DISPLAY"
Заключение
Отмена прямых изменений, произведённых с помощью команды modifier_map
, является затруднительной задачей в XKB. Однако, используя подходы, описанные выше, вы сможете эффективно управлять модификаторами на вашей клавиатуре. Вам, скорее всего, придется создать новую карту клавиатуры, основанную на существующей, где вы сможете удалить или изменить назначенные модификаторы.
Если вы ищете простые инструменты для изменения модификаторов, также можно рассмотреть использование xmodmap
, который предлагает более интуитивные способы работы с назначениями модификаторов.
По завершении работы с XKB всегда помните о создании резервных копий конфигураций, чтобы в случае возникновения проблем вы могли легко восстановить прежние настройки.