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


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

Например.

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

То, что я хочу, - это левый паратезис или правая паратетация (без сдвига), когда я нажимаю клавишу с нажатой клавишей 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 по-прежнему приводит только к - / _

Я также попытался изменить / 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 и cap 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
2018-04-27 11:57


происхождения


Если вы найдете что-нибудь, можете ли вы отправить свой ответ здесь? (то есть: отвечая на ваш собственный вопрос). Я поражен тем, насколько сложна такая тривиальная задача, и в сети практически нет информации. Это просто сумасшествие. - Cedric Martin
Я буду. Но пока я все еще только на стадии пробной ошибки и постоянного ручного чтения. - Aron Cederholm
Мне все еще интересно, почему AltGr по умолчанию не будет работать для всех ключей одинаково ... unix.stackexchange.com/questions/249122/... - Pavel Šimerda


ответы:


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

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

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


8
2017-09-04 13:02