Почему мои xmodmap-привязки, включающие AltGr, работают только с некоторыми ключами?

12

Я хочу переназначить свои AltGR + Right_Windows, но я не могу понять, как. Независимо от того, что я пытаюсь, нажатие правой клавиши Windows выдает название keysym, когда правая клавиша alt нажата или нет.

Это содержимое файла xmodmap, который я сейчас тестирую. В моей клавиатуре 38 - это код клавиши для «а», 48 - это код для апортроф / двойная кавычка, а 134 - это код для правой клавиши Windows.

keycode  38 = 1 2 3 4 5 6 7 8
keycode  48 = 1 2 3 4 5 6 7 8
keycode 134 = 1 2 3 4 5 6 7 8

Когда я нажимаю Right_Alt + апостроф, он выдает 5, но Right_Alt + a и Right_Alt + Right_Windows дают 1 (как при нажатии правой клавиши alt, так и когда ее нет), что не то, что я хотел.

Моя текущая раскладка клавиатуры us(alt-intl)и правый alt явно настроен для работы в качестве AltGr / Iso_Level3_Shift. Вывод 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 (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)
hugomg
источник
Понятия не имею, что именно происходит, но если вы еще этого не сделали, вы можете запустить xevи нажать различные комбинации клавиш, чтобы увидеть, получает ли аппаратное обеспечение и вплоть до уровня Xwindows различимые нажатия клавиш для начала.
Джо
Я испытываю ту же проблему. Я хотел изменить запятую и точку так, чтобы она также поддерживала печать чешских и английских двойных кавычек («/« / »), которые в противном случае я должен написать с помощью клавиши compose. Я использую us(cz_sk_de)раскладку клавиатуры и xmodmap.
Павел Шимерда
И что теперь? Неразумно тратить еще одну награду или начинать новый вопрос, когда этот вопрос достаточно хорошо описывает проблему. Это похоже на ошибку в xorg, но я не нашел никаких ссылок. Существующий ответ явно неверен, несмотря на то, что он автоматически присуждается.
Павел Шимерда
Я прекратил сдаваться и использую разные комбинации клавиш, которые, как я знаю, работают: / Я согласен, что это похоже на ошибку, но я не знаю, с какой системой это связано и где сообщить об этом ...
hugomg
Я нашел некоторую информацию здесь ... blog.azundris.com/archives/193-X-treme-pain-XKB-vs-XModMap.html
Павел Šimerda

Ответы:

7

Использование xmodmap для настройки индивидуальных сопоставлений клавиш

Пришло время записать результаты моего собственного исследования.

Я подумал, что, должно быть, что-то пропустил в xmodmap и что это не очень хорошо задокументировано, и люди в замешательстве. Но оказалось, что дизайн X.Org в отношении XKB и xmodmap просто глуп.

Эпическая ошибка: xmodmap

Вы можете использовать xmodmap для переопределения существующих сопоставлений, если эти сопоставления действительно существуют в исходной раскладке клавиатуры. В случае, описанном в вопросе, вы не можете расширить поведение любых клавиш для использования AltGr. Вы можете изменить только ключи AltGr для тех кодов клавиш, которые уже используют AltGr.

Смотрите также: http://blog.azundris.com/archives/193-X-treme-pain-XKB-vs-XModMap.html

Обходной путь: Mode_switch

Этот обходной путь описан в ответе @ Ned64. Вы можете переназначить AltGrиз ISO_Level3_Shiftв Mode_switch.

Я успешно использовал следующую командную строку для переназначения AltGr.

xmodmap -e 'keycode 108 = Mode_switch'

Недостатком является то, что это нарушит вашу текущую раскладку клавиатуры, но вы можете воссоздать все сопоставления одно за другим, используя xmodmapуже упомянутый @ Ned64.

Обходной путь: Модифицированная раскладка клавиатуры

Я использую в us(cz_sk_de)качестве раскладки клавиатуры и попытался изменить ее, добавив конфигурацию для клавиш, которые я хотел расширить.

key <AB08>  { [ comma, less, doublelowquotemark, leftdoublequotemark ] };
key <AB09>  { [ period, greater, ellipsis, rightdoublequotemark ] };

(В разделе xkb_symbols "cz_sk_de"о /usr/share/X11/xkb/symbols/us)

Просто сбросьте раскладку клавиатуры, чтобы использовать измененную версию.

setxkbmap 'us(cz_sk_de)'

Теперь вы можете (1) типа чешские и английские кавычки и многоточие с использованием комбинаций ,, ., Shiftи AltGrключи и / или (2) переназначить эти ключи , используя xmodmapтеперь, когда они определены.

Основным недостатком является то, setxkbmapчто кажется, что он не поддерживает произвольные расположения для раскладок клавиатуры, и поэтому вам нужно записывать в конфигурацию системы вместо вашего домашнего каталога.

Вывод

Похоже, это пример чрезмерного и плохого дизайна X.Org, где даже такая тривиальная вещь, как отображение кода клавиши и комбинации модификаторов в символ, оказывается проблемой. Похоже, что инструменты не дают разумного способа просто изменить отдельные сочетания клавиш в конфигурации пользователя без каких-либо побочных эффектов.

Павел Шимерда
источник
«Вы не можете расширить поведение клавиш для использования AltGr» - похоже, это было проблемой с самого начала! Благодарю.
hugomg
5

Шаг первый: Сделайте AltGr пригодным для использования

Я обнаружил, что модифицированные AltGr ключи работают в моей системе, только если я переназначаю AltGr-Key Mode_switch, например, так:

xmodmap -e "keycode 108 = Mode_switch Mode_switch Mode_switch Mode_switch"

Если у вас другая клавиатура, вам, возможно, придется заменить ее на 108свой код, проверьте, набрав

xmodmap -pke | grep Alt_R

затем используйте этот номер. (Ключ обычно вызывается Alt_Rв системах, которые я знаю.)

Альтернативно, это также может работать, если Alt_R еще не назначен чему-то еще:

xmodmap -e "keysym Alt_R = Mode_switch Mode_switch Mode_switch Mode_switch"

Ваш модификатор AltGr теперь будет занимать позицию 3 (с Shift: 4) в вашем списке модификаторов.

Шаг второй: назначьте ключи по мере необходимости

Вы можете назначить AltGr-варианты для любой клавиши вашей клавиатуры. Если у вас есть другие ключи, которые сейчас не соответствуют требуемому коду, вам необходимо переназначить их так же, как и другие ваши ключи (те, которые вы тестировали).

Шаг третий: преобразовать это в скрипт

Теперь просто возьмите свои xmodmapкоманды и запишите все (но только) модификации вашей клавиатуры по умолчанию в файл - это быстрее, чем загрузка полной раскладки клавиатуры. Запускайте этот скрипт один раз после каждого входа в систему и всякий раз, когда раскладка клавиатуры сбрасывается каким-либо процессом.

Я много лет экспериментировал с этим в Solaris, IRIX и Linux, и, насколько мне известно, это единственное решение для работы AltGr, и оно работало для меня более 20 лет.

Ned64
источник
1
При этом правая клавиша окна стала действовать как «3» вместо «1». Тем не менее, теперь все существующие модификаторы altgr перестали работать (я полагаю, что для их работы нужно было бы иметь цифру «5» вместо «3»?)
hugomg
Спасибо за попытку. Пожалуйста, напишите xmodmap -pmи xmodmap -pke | grep -w SOMECHANGEDKEYв этой ситуации за ключ, который больше не работает.
Нед64
(тогда нам нужно будет добавить новый модификатор, используя в xmodmapсоответствии с вашим выводом)
Ned64
xmodmap -pke | grep Alt_Rне возвращает никаких результатов в моей системе. Моя система - Lenovo ThinkPad X230 со стабильной Gentoo. Я тоже пытался grep -iбезрезультатно.
Павел Шимерда
Я попробовал это, и проблема в том, что акцентированные письма от us(cz_sk_de)меня перестали работать. Поэтому этот ответ не работает для меня и не будет работать для многих других.
Павел Шимерда
1

По-видимому, xmodmap не читает AltGR по умолчанию, как следует, это может быть ограничено определенными раскладками клавиатуры, может быть, это все раскладки за пределами США, так или иначе, настоящая проблема в том, что вы можете заменить раскладку клавиатуры, некоторые люди могут на самом деле не хочу этого делать, так как им нужно использовать специальные символы на раскладке, к которой они привыкли (например, на скандинавских раскладках клавиатуры, в которых есть такие символы, как ðůöáúíóå that и т. д.), что было бы непросто настроить для других раскладок клавиатуры.

Вы можете запустить

xmodmap -e "keycode 108 = Mode_switch"

Чтобы привязать AltGR к чему-то, с чем может работать xmodmap, и действительно, 3-е назначение keycoad будет выведено, когда вы сейчас нажмете AltGR, однако это полностью нарушит исходную раскладку клавиатуры, поскольку никакие сочетания клавиш AltGR больше не будут работать с клавишей AltGR.

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

Идеальный ключ для этого - Super_R, который находится рядом с AltGR, код ключа для него - 134. Однако не все клавиатуры имеют их, и в моем случае на ноутбуке у меня его тоже нет, поэтому я решил связать его с последним оставшийся ключ, которым я практически никогда не пользуюсь, Right Control.

xmodmap -e "keycode 105 = Mode_switch"

У меня американская физическая раскладка клавиатуры, но европейская конфигурация раскладки, и клавиша less / great / bar (также известная как ISO_Backslash, хотя это не распознается самим xmodmap), обычно рядом с Z на таких клавиатурах отсутствует. Я связал это с Меню (135), но оно могло бы служить альтернативой R_Ctrl и Super_R

Полагаю, это грязное исправление.

Второй обходной путь занял немного больше времени, чтобы понять. Использование sxhkd (альтернатива xbindkeys)

Если вы добавите это в ~ / .config / sxhkd / sxhkdrc :

~ISO_Level3_Shift
    xdotool key Mode_switch

Ваш AltGR будет работать в обычном режиме, но при его нажатии Mode_switch будет переключаться (вроде как caps lock, но для Mode_switch), и любые клавиши xmodmap, которые его используют, будут заблокированы в режиме AltGR, пока вы снова не нажмете AltGR, чтобы отменить его. Должно быть легко создать скрипт для автоматического выключения его при отпускании ключа, но мои попытки сделать это были довольно ошибочными, если не сказать больше.

Cestarian
источник