Установка модификаторов Hyper и Super для определенных ключей с помощью setxkbmap или xmodmap
Проблема: я хочу изменить / переопределить раскладку клавиатуры (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)
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
, код клавиши 66Pause|Break
, код 128Left Windows key
код 133Num 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
...
Я надеюсь, что это было полезно!