Проблема: Я хочу изменить/переопределить раскладку клавиатуры (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
, код 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
...
Я надеюсь, что это было полезно!