Установка модификаторов Hyper и Super для определенных ключей с помощью setxkbmap или xmodmap

4094
Aron Cederholm

Проблема: я хочу изменить / переопределить раскладку клавиатуры (pc105 se), чтобы при нажатии определенных клавиш с mod3 (супер) и mod4 (гипер) возвращался другой символ, чем обычно.

Например

Код клавиши 61 выдает «минус» (-) при обычном нажатии и «подчеркивание» (_) при нажатии со сдвигом. При нажатии с первой группой модификаторов (AltGr) создаются «dead_belowdot» и «dead_abovedot» (без / со смещением).

То, что я хочу, это левый или правый (без / со сдвигом), когда я нажимаю клавишу с нажатой также клавишей Super (победа), и косую черту / обратную косую черту для клавиши Hyper (которую я настроил для Caps Lock).

Я попытался добавить .Xmodmapв свой домашний каталог и запустить его с xmodmap ~/.Xmodmapиспользованием следующего синтаксиса

keycode 61 = minus underscore a b c d e f g h i j k l m n o p 

Однако это приведет к тому, что AltGr приведет к c / d, в то время как блокировка win / caps по-прежнему приводит только к - / _

Я также попытался изменить / usr / share / X11 / xkb / symbols / se напрямую и попробовал следующие изменения:

key <BKSL> { [apostrophe, asterisk, acute, multiply], [a,b,c,d], [e,f,g,h], [i,j,k,l]}; 

Но все, что происходит, это '* ´ ×' * '* (для обычного, altgr, win и caps lock соответственно). Я также пытался

key <BKSL> { [apostrophe, asterisk, acute, multiply, a,b,c,d, e,f,g,h, i,j,k,l]}; 

Но как только есть более четырех указанных полей, кажется, что ключ полностью сломан, и ключ возвращается к стандартному поведению pc105 (us?).

Поскольку мне не удалось найти что-либо в stackoverflow, superuser или google о том, как справиться с моим сценарием, я спрашиваю здесь.

Это мое xmodmap -pm

xmodmap: up to 3 keys per modifier, (keycodes in parentheses):  shift Shift_L (0x32), Shift_R (0x3e) lock  control Control_L (0x25), Control_R (0x69) mod1 Alt_L (0x40), Meta_L (0xcd) mod2 Num_Lock (0x4d) mod3 Hyper_L (0x42), Hyper_L (0xcf) mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce) mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb) 
6
Если вы найдете что-нибудь, не могли бы вы опубликовать свой ответ здесь? (то есть: отвечая на свой вопрос). Я поражен тем, насколько сложна такая тривиальная задача, и в сети почти нет информации. Это просто безумие. Cedric Martin 12 лет назад 2
Я буду. Но пока я все еще на стадии проб и ошибок и постоянного чтения вручную. Aron Cederholm 12 лет назад 0
Мне все еще любопытно, почему AltGr по умолчанию не будет работать для всех ключей одинаково ... http://unix.stackexchange.com/questions/249122/why-do-my-xmodmap-binds-involving-altgr- только с работой на некоторых клавиш Pavel Šimerda 8 лет назад 0

1 ответ на вопрос

8
Aron Cederholm

Два года спустя я наконец-то с гордостью отвечаю на свой вопрос.

Я обнаружил, что самый простой, надежный и расширяемый метод - это полагаться исключительно на него xmodmap.

1. Получить коды специальных клавиш

Запустите, xevчтобы определить код клавиши, которую вы хотите использовать в качестве переключателей режимов. Затем нажмите интересующие вас клавиши и запишитеkeycode

$ xev KeyRelease event, serial 40, synthetic NO, window 0x2600001, root 0x2a6, subw 0x0, time 1221887800, (885,743), root:(3447,805), state 0x2010, keycode 66 (keysym 0xff7e, Mode_switch), same_screen YES, XLookupString gives 0 bytes:  XFilterEvent returns: False 

Код ключа находится в третьей строке, код ключа 66.

Для меня это были ключи, которые меня особенно интересовали, и соответствующие им коды клавиш:

  • Caps Lock, код клавиши 66
  • Pause|Break, код 128
  • Left Windows keyкод 133
  • Num Lock, код ключа 77

2. Установите клавиши переключения

Это настройка, которую я выбрал, но вы можете выбрать свою собственную настройку. Я сохранил это в файл $HOME/.xmodmap.

~/.xmodmap keycode 66 = Mode_switch keycode 127 = Multi_key keycode 133 = Super_L ... 

Таким образом, я обязан Caps Lockк Mode_switch, Pause Breakчтобы Composeи левый Winключ к Super_L. ComposeКлюч является особенно полезным, поскольку оно позволяет два ключа, которые будут объединены в лигатурой. Например, Composeпосле чего Tи Mприводит знак товарного знака .

3. Получить текущие привязки клавиш xmodmap

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

$ xmodmap -pke | ag 'keycode 51' 

Конечно, вы можете так же легко использовать grepили ack, в зависимости от инструмента, который вы предпочитаете использовать.

$ xmodmap -pke | grep 'keycode 41'  $ xmodmap -pke | ack 'keycode 31'  

Вывод этого в том же формате, который вы указываете в вашем ~/.xmodmapкак это:

keycode 31 = i I i I rightarrow idotless rightarrow idotless i I rightarrow idotless i I rightarrow idotless 

4. Сделайте резервную копию своего существующего xmodmap

На случай, если что-то пойдет не так, идея о том, чтобы ваш ток xmodmapбыл легко доступен, никогда не будет плохой .

$ xmodmap -pke > ~/.xmodmap.bak 

5. Добавьте символы на 2-й, 3-й, 4-й уровень ваших ключей

Насколько я понял, формат .xmodmapфайла выглядит так:

keycode <keycode> = <1st level> <Shift+1st> <2nd level> <shift+2nd> <3rd level> <shift+3rd level> <4th level> <shift+4th> ... 

Теперь я не понимаю все эти уровни, но Mode_Switch( Caps Lockв моем случае) даст вам уровень 2 и Alt Grдаст мне уровень 3, и это почти все, что меня интересует, поэтому я оставил остальную часть этой строки, как это было в моем ~/.xmodmap.bakи просто изменили 3-й, 4-й, 5-й и 6-й столбцы (уровень 2 и 3, плюс смещение) на допустимые символы ( список допустимых символов см. здесь ).

~/.xmodmap ... keycode 51 = apostrophe asterisk dollar ampersand acute multiply acute multiply apostrophe asterisk acute multiply apostrophe asterisk acute multiply keycode 59 = comma semicolon parenleft parenright dead_cedilla dead_ogonek dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek keycode 60 = period colon bracketleft bracketright periodcentered dead_abovedot periodcentered dead_abovedot period colon periodcentered dead_abovedot period colon periodcentered dead_abovedot keycode 61 = minus underscore braceleft braceright slash backslash braceleft braceright keycode 65 = space space space space space underscore space space ... 

6. Проверьте свой .xmodmap

Теперь давайте xmodmapзапустим .xmodmapи протестируем вашу совершенно новую раскладку клавиатуры.

$ xmodmap /home/user/.xmodmap 

7. Убедитесь, что раскладка клавиатуры загружена на x init

Я добавил это к моему $HOME/.xinitrc:

~/.xinitrc ... [-f $HOME/.xmodmap] && xmodmap $HOME/.xmodmap ... 

Я надеюсь, что это было полезно!