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

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

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

Например

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

Мне нужна левая или правая скобка (без/с Shift) при нажатии клавиши с нажатой клавишей Super (Win), а также косая черта/обратная косая черта для клавиши 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 lock по-прежнему будет приводить только к -/_

Я также попробовал напрямую изменить /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 (нас?).

Поскольку мне не удалось найти ничего на 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)

решение1

Два года спустя я наконец с гордостью могу ответить на свой собственный вопрос.

Я обнаружил, что самый простой, надежный и расширяемый метод — полагаться исключительно на 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
...

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

Связанный контент