xmodmap (Русский)
xmodmap - это утилита для изменения раскладки клавиш клавиатуры и мыши в Xorg.
xmodmap не относится к X keyboard extension (XKB), так как использует другие (pre-XKB) идеи на то, как коды клавиш обрабатываются в X. В целом, он рекомендуется только для простых задач. Смотрите X keyboard extension для продвинутой настройки раскладки.
- Настройки xmodmap сбрасываются утилитой setxkbmap, которая не только изменяет алфавитно-цифровые клавиши, но и сбрасывает все остальные клавиши на значения по умолчанию (смотрите LQWiki:Configuring keyboards).
- Из-за ограничений Xorg настройки xmodmap не применяются к подключенным устройствам автоматически. Если клавиатура добавлена в систему после применения пользовательской таблицы, её придётся применять снова. [1]
Введение
В Xorg есть два типа значений клавиатуры: коды клавиш (keycodes) и символы клавиш (keysyms).
- keycode
- Код клавиши (keycode) - это числовое значение, получаемое ядром при нажатии клавиши клавиатуры или мыши.
- keysym
- Символ клавиши (keysym) - это значение, назначенное коду клавиши. Например, нажатие клавиши
a
генерируетkeycode 38
, которому назначенkeysym 0×61
, которому в свою очередь назначен символa
в таблице ASCII. - Символами клавиш (keysyms) управляет Xorg с помощью таблицы кодов клавиш (keycodes), определяющей пару keycode-keysym, которая называется таблицей назначений клавиш. Её можно увидеть, выполнив команду
xmodmap
.
Установка
xmodmap можно установить с помощью пакета xorg-xmodmap.
Если хотите, можете установить xkeycaps - это графический фронт-энд для xmodmap.
Таблица назначений клавиш
Чтобы отобразить текущую таблицу назначений клавиш, форматированную в выражения:
$ xmodmap -pke
[...] keycode 57 = n N [...]
После каждого кода клавиши идут символы клавиши, которые ему назначены. На примере выше видно, что коду клавиши 57
назначен символ нижнего регистра n
, а символу верхнего регистра N
назначен код клавиши 57
плюс Shift
.
Каждому столбцу символов клавиш в таблице соответствует определённая комбинация клавиш-модификаторов:
Key
Shift+Key
Mode_switch+Key
Mode_switch+Shift+Key
ISO_Level3_Shift+Key
ISO_Level3_Shift+Shift+Key
Не обязательно назначать все символы клавиши; чтобы не назначать их в конкретных столбцах, можете использовать значение NoSymbol
.
Чтобы узнать какой код клавиши отвечает за нужную вам клавишу, смотрите статью Keyboard input (Русский)#Определение кодов клавиш в Xorg, в которой объясняется, как использовать утилиту xev.
XF86AudioMute
или XF86Mail
. Узнать от таких символах клавиш вы можете из файла /usr/include/X11/XF86keysym.h
. Многие мультимедиа программы изначально разработаны так, чтобы работать с такими символами клавиш из коробки, без необходимости каких-либо настроек.
Обратите внимание, что на xmodmap влияют настройки xkbd, поэтому все восемь keysym доступны для раскладки xkbd US(intl), но не для US по умолчанию (в ней отсутствует символ ralt_switch, определённый в level3). Чтобы все 8 keysym были доступны, необходимо настроить (intl) вариант клавиатуры. Выполните $ setxkbmap -layout 'us(intl)'
(пример для раскладки US) перед вызовом xmodmap для тестирования изменений в текущем сеансе X. Чтобы сделать это изменение постоянным, отредактируйте конфигурацию xorg или файл .xprofile или .xinitrc. Полное объяснение смотрите в разделе Конфигурация клавиатуры в Xorg#Настройка раскладки клавиатуры.
Изменение таблицы
Сохраним текущую таблицу назначений клавиш в файл (например, ~/.Xmodmap
):
$ xmodmap -pke > ~/.Xmodmap
Можете убрать строки для клавиш, которые вы не собираетесь менять. Прописав/изменив нужные значения клавишам, применим изменения:
$ xmodmap ~/.Xmodmap
Активация изменённой таблицы при загрузке
Если вы используете GDM, XDM или LightDM, нет необходимости выполнять source ~/.Xmodmap
. А если вы пользуетесь startx, внесите следующее содержимое в файл ~/.xinitrc
:
~/.xinitrc
[[ -f ~/.Xmodmap ]] && xmodmap ~/.Xmodmap
Другим вариантом является редактирование глобального скрипта автозапуска /etc/X11/xinit/xinitrc
.
Попробовать изменения
Чтобы сделать временные изменения:
$ xmodmap -e "keycode 46 = l L l L lstroke Lstroke lstroke" $ xmodmap -e "keysym a = e E"
Клавиши-модификаторы
xmodmap также умеет переопределять клавиши-модификаторы, например, можно "поменять местами" клавиши Control
и Super
.
Вывод текущей таблицы модификаторов:
$ xmodmap -pm
xmodmap: up to 4 keys per modifier, (keycodes in parentheses): shift Shift_L (0x32), Shift_R (0x3e) lock Caps_Lock (0x42) control Control_L (0x25), Control_R (0x69) mod1 Alt_L (0x40), Meta_L (0xcd) mod2 Num_Lock (0x94) mod3 mod4 Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), ISO_Level3_Shift (0x6c), Mode_switch (0x85), Mode_switch (0xcb)
Mode_Switch
вместо правильного Mode_switch
) приведёт к ошибкам.Перед тем, как назначать клавишу-модификатор, её надо очистить. Это относится как к модификаторам, которые вы собираетесь назначить, так и к модификаторам на клавишах, которые вы собираетесь использовать. Например, если вы собираетесь назначить Caps_Lock
на клавишу A, а B
— на клавишу NumLock, вам нужно сначала очистить модификаторы для Caps_Lock и Num_Lock, затем назначить символы клавиш и, наконец, добавить модификаторы обратно.
~/.Xmodmap
[...] clear lock clear mod2 keycode 38 = Caps_Lock keycode 77 = Num_Lock add lock = Caps_Lock add mod2 = Num_Lock
!
является комментированием, так что в следующем примере будут очищены только клавиши Control
и Mod4
. Затем символы клавиш Control_L
, Control_R
, Super_L
и Super_R
переназначены на противоположные. Переназначение как левой, так и правой клавиш на один и тот же модификатор означает, что обе клавиши будут функционировать одинаково.
~/.Xmodmap
[...] !clear Shift !clear Lock clear Control !clear Mod1 !clear Mod2 !clear Mod3 clear Mod4 !clear Mod5 !add Shift = Shift_L Shift_R !add Lock = Caps_Lock add Control = Super_L Super_R !add Mod1 = Alt_L Alt_R !add Mod2 = Mode_switch !add Mod3 = add Mod4 = Control_L Control_R !add Mod5 =
Control_L
и Control_R
были назначены на модификаторе Control
, а символы клавиш Super_L
и Super_R
на модификатор Mod4
. Если у вас возникает ошибка X Error of failed request: BadValue (integer parameter out of range for operation)
, вы должны адаптировать таблицу соответствующе. Команда xmodmap
покажет список модификаторов и клавиш, назначенных на них.Следующий пример изменяет CapsLock
на Control
и Shift+CapsLock
на CapsLock
:
~/.Xmodmap
clear lock clear control add control = Caps_Lock Control_L Control_R keycode 66 = Control_L Caps_Lock NoSymbol NoSymbol
Клавиша Compose
Клавиша Compose позволяет вводить специальные знаки и символы, которых нет непосредственно на клавиатуре. Это особенно полезно при наборе акцетов для букв неанглийских языков. Например, при последовательном нажатии Compose
e
'
получается é. Некоторые символы требуют нажатия более двух клавиш после Compose
.
Обычно на Compose
назначается клавиша-модификатор. Клавишу можно выбрать в настройках в большинстве сред рабочего стола, но эти опции не будут работать, если используется пользовательская таблица сопоставления клавиш, как описано в этой статье.
Чтобы установить клавишу compose с помощью Xmodmap
, используйте идентификатор Multi_key
. Например, для сопоставления правого alt (AltGr
) с клавишей compose:
~/.Xmodmap
[...] keycode 108 = Multi_key Alt_R Meta_R Alt_R Meta_R
Код клавиши может быть другим в зависимости от клавиатуры.
Прокрутка в другую сторону
Иногда такую прокрутку называют естественной. Она похожа на поведение прокрутки на смартфонах. Добиться такого поведения можно с помощью xmodmap. Так как драйвер synaptics использует кнопки 4/5/6/7 для прокрутки вверх/вниз/влево/вправо, вы просто можете поменять порядок объявления кнопок в файле ~/.Xmodmap
:
~/.Xmodmap
pointer = 1 2 3 5 4 7 6 8 9 10 11 12
Теперь примените изменения:
$ xmodmap ~/.Xmodmap
Переназначение кнопок мыши
Левая, средняя и правая кнопки мыши соответствуют кнопкам 1, 2 и 3 соответственно в драйвере synaptics. Чтобы поменять местами левую и правую кнопки мыши, просто измените порядок их расположения в файле ~/.Xmodmap
:
~/.Xmodmap
pointer = 3 2 1
Не забудьте применить изменения:
$ xmodmap ~/.Xmodmap
Примеры
Испанский
~/.Xmodmap
keycode 24 = a A aacute Aacute ae AE ae keycode 26 = e E eacute Eacute EuroSign cent EuroSign keycode 30 = u U uacute Uacute downarrow uparrow downarrow keycode 31 = i I iacute Iacute rightarrow idotless rightarrow keycode 32 = o O oacute Oacute oslash Oslash oslash keycode 57 = n N ntilde Ntilde n N n keycode 58 = comma question comma questiondown dead_acute dead_doubleacute dead_acute keycode 61 = exclam section exclamdown section dead_belowdot dead_abovedot dead_belowdot !Maps the Mode key to the Alt key keycode 64 = Mode_switch
Эсперанто
~/.Xmodmap
keycode 54 = c C c C ccircumflex Ccircumflex keycode 42 = g G g G gcircumflex Gcircumflex keycode 43 = h H h H hcircumflex Hcircumflex keycode 44 = j J j J jcircumflex Jcircumflex keycode 39 = s S s S scircumflex Scircumflex keycode 30 = u U u U ubreve Ubreve
Вместо CapsLock Control
Простейший пример изменения CapsLock
на Control
.
~/.Xmodmap
clear lock clear control keycode 66 = Control_L add control = Control_L Control_R
Вместо CapsLock Control, а вместо LeftControl Hyper
Некоторые пользователи ноутбуков предпочитают, чтобы CapsLock
работал как Control
. А клавиша Left Control
может быть использоваться в качестве модификатора Hyper
(дополнительный модификатор для emacs, openbox или i3).
~/.Xmodmap
clear lock clear control clear mod1 clear mod2 clear mod3 clear mod4 clear mod5 keycode 37 = Hyper_L keycode 66 = Control_L add control = Control_L Control_R add mod1 = Alt_L Alt_R Meta_L add mod2 = Num_Lock add mod3 = Hyper_L add mod4 = Super_L Super_R add mod5 = Mode_switch ISO_Level3_Shift
Вместо Super_R Hyper_R
Пользователи, которые хотят иметь клавишу Hyper
на полной раскладке клавиатуры, могут использовать правый Super
в качестве Hyper
.
~/.Xmodmap
remove mod4 = Super_R keycode 134 = Hyper_R add mod3 = Hyper_R
Переключение каждой цифровой клавиши N на Shift-N и наоборот для хорватской раскладки
Должен отлично работать и для раскладок, похожих на хорватский.
~/.Xmodmap
keycode 10 = exclam 1 1 exclam asciitilde dead_tilde asciitilde keycode 11 = quotedbl 2 2 quotedbl dead_caron caron dead_caron keycode 12 = numbersign 3 3 numbersign asciicircum dead_circumflex asciicircum keycode 13 = dollar 4 4 dollar dead_breve breve dead_breve keycode 14 = percent 5 5 percent degree dead_abovering degree keycode 15 = ampersand 6 6 ampersand dead_ogonek ogonek dead_ogonek keycode 16 = slash 7 7 slash grave dead_grave grave keycode 17 = parenleft 8 8 parenleft dead_abovedot abovedot dead_abovedot keycode 18 = parenright 9 9 parenright dead_acute apostrophe dead_acute keycode 19 = equal 0 0 equal dead_doubleacute doubleacute dead_doubleacute
Смотрите также
- xmodmap(1)
- Multimediakeys with .Xmodmap HOWTO by Christian Weiske
- Mapping unsupported keys with xmodmap by Pascal Bleser
- LQWiki:List of Keysyms Recognised by Xmodmap