Переназначить клавиши Ctrl и Alt - ошибка xmodmap 'BadValue'

13

Я пытаюсь переназначить свою клавиатуру, чтобы сделать emacs пригодным для использования. Моя эргономичная клавиатура помещает свою единственную клавишу управления в изолированный 4-клавишный островок слева.

ОС является Debian Squeeze.

Вот строки, которые я xmodmapпытаюсь передать, я помещаю их в файл ~ / .Xmodmap:

четкий контроль
очистить Mod1
! Клавиши Alt помечены как «Option» на моей клавиатуре,
! использование xev показывает их для отправки Alt_L и Alt_R keysym соответственно
keysym Alt_L = Control_L
keysym Alt_R = Control_R
! Ключи Super_L и Super_R - это ключи Windows
keysym Super_L = Alt_L
keysym Super_R = Alt_R
добавить Control = Control_L Control_R
добавить Mod1 = Alt_L Alt_R

Моя цель - сделать так, чтобы мои Altключи Option (aka ) вели себя как клавиши управления, а мои ключи Windows (aka Super) работали так же Alt.

Вот коды клавиш и keysms, выведенные xev для рассматриваемых ключей. Обратите внимание, что моя клавиатура (эргономичная клавиатура Goldtouch) имеет только одну управляющую клавишу.

код ключа 37 (keysym 0xffe3, Control_L)
код ключа 64 (keysym 0xffe9, Alt_L)
код ключа 133 (keysym 0xffeb, Super_L)
код ключа 134 (keysym 0xffec, Super_R)
код ключа 108 (keysym 0xffea, Alt_R)

Вот что показывает xev во время работы xmodmap .Xmodmap

Событие MappingNotify, серийный номер 34, синтетический номер NO, окно 0x0,
    запрос MappingKeyboard, first_keycode 204, количество 1

Событие MappingNotify, серийный номер 34, синтетический номер NO, окно 0x0,
    запрос MappingKeyboard, first_keycode 64, количество 1

Событие MappingNotify, серийный номер 34, синтетический номер NO, окно 0x0,
    запрос MappingKeyboard, first_keycode 108, количество 1

Событие MappingNotify, серийный номер 34, синтетический номер NO, окно 0x0,
    запрос MappingKeyboard, first_keycode 206, количество 1

Событие MappingNotify, серийный номер 34, синтетический номер NO, окно 0x0,
    запрос MappingKeyboard, first_keycode 133, количество 1

Событие MappingNotify, серийный номер 34, синтетический номер NO, окно 0x0,
    запрос MappingKeyboard, first_keycode 134, количество 1

И вот ошибка, возвращаемая xmodmap:

X Ошибка неудачного запроса: BadValue (целочисленный параметр вне диапазона для операции)
Основной код операции невыполненного запроса: 118 (X_SetModifierMapping)
Значение в неудачном запросе: 0x17
Серийный номер неудавшегося запроса: 17
Текущий серийный номер в выходном потоке: 17

какие-либо предложения о том, как я могу решить эту проблему?

Алиуд Алиус
источник
На какой операционной системе и версии? Какой широкий тип клавиатуры (ПК / Mac / Sun / ...)? Попробуйте запустить xevв терминале, а затем xmodmapв другом терминале. Вы должны увидеть некоторые MappingNotifyстрофы xev, добавьте их к своему вопросу. Кроме того, в xevокне нажмите различные задействованные клавиши и сообщите нам, какой код клавиши и keysym им соответствуют (код клавиши 37 (keysym 0xffe3, Control_L) »в выводе xev).
Жиль "ТАК - перестань быть злым"

Ответы:

6

Это уже сообщалось как ошибка Debian # 564327 , ошибка Debian # 565279 , ошибка Ubuntu # 524774 и ошибка FreeDesktop 20145 . К обсуждению ошибки FreeDesktop прикреплен исходный патч. Есть несколько предложений временного решения об ошибке обсуждении Ubuntu, в частности , в .Xmodmapобходном пути .

Жиль "ТАК - прекрати быть злым"
источник
7

Глядя на обходной путь, связанный с Джайлсом, вот что сработало для меня:

clear Mod1
clear Mod4

keycode 204 = NoSymbol NoSymbol NoSymbol NoSymbol
keycode 206 = NoSymbol NoSymbol NoSymbol NoSymbol

keycode 64 = Control_L Control_L Control_L Control_L
keycode 133 = Alt_L Alt_L Alt_L Alt_L
keycode 134 = Alt_R Alt_R Alt_R Alt_R
keycode 108 = Control_R Control_R Control_R Control_R

add Control = Control_L Control_R
add Mod1 = Alt_L Alt_R

Мои клавиши Option теперь работают как клавиши управления, а мои клавиши Windows - как клавиши Alt.

Алиуд Алиус
источник
3

Проблема возникает, когда вы пытаетесь добавить keysym к модификатору, который уже добавлен к другому ключу модификатора. Важно знать, что если вы добавляете keysym в модификатор, все остальные ключевые символы, которые сопровождают keysym в случае, добавляются также в отношении этого модификатора.

Например:

clear mod5
add mod5    = ISO_Level3_Shift Mode_switch

может привести к

mod5        backslash (0x33),  Caps_Lock (0x42),  ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

потому что у вас есть что-то вроде

keycode  66 = Caps_Lock NoSymbol ISO_Level3_Shift

в вашем ~ / .Xmodmap (Просмотреть текущий код ключа для сопоставления keysym через xmodmap -pke)

что приведет к ошибке BadValue, когда вы пытаетесь сделать что-то вроде

add lock    = Caps_Lock

потому что Caps_Lock уже добавлен в модификатор mod5.

поток
источник
2

Это еще одно решение вашей проблемы, хотя на самом деле оно не отвечает на ваш вопрос. Отредактируйте xorg.conf, вставив в раздел «InputDevice» следующее:

 Option "XkbOptions" "ctrl:swapcaps"
dotplus
источник