Следующее решение является варварским, но оно работает (при условии, что вы будете удовлетворены защелкой уровня 3 вместо сдвига уровня 3) - разница в том, что при последней все клавиши должны нажиматься одновременно, а при первой нажмите LeftCtrl+ LeftAlt, отпустите это и только затем нажмите клавишу, которая будет сдвинута) и не требует рута.
setxkbmap -option grp:lctrl_lalt_toggle xmodmap -e 'keycode 37 = Control_L ISO_Level3_Latch' xmodmap -e 'keycode 64 = Alt_L ISO_Level3_Latch'
Объяснение того, как это работает:
Параметр xkb grp: lctrl_lalt_toggle позволяет LeftCtrlперейти LeftAltна уровень 2 и наоборот (см /usr/share/X11/xkb/symbols/group
. :) . Это также приводит к сдвигу level2 LeftCtrlи LeftAltстановится ISO_Next_Group, что нежелательно, поскольку мы хотим, чтобы оно было ISO_Level3_Latch, поэтому мы используем xmodmap для изменения level2 на ISO_Level3_Latch для обоих LeftCtrlи LeftAlt(сохраняя level1 как Control_L и Alt_L). Коды клавиш (37 и 64) можно найти, проверив вывод xmodmap -pke
или используя xev
.
Если бы мы применили только переопределения xmodmap (без использования setxkbmap
first), то ключ, отвечающий за сдвиг level2, был бы Shift, как и почти для всех ключей, так что Shift+ LeftCtrlи Shift+ LeftAlt(но не LeftCtrl+ LeftAlt) стали бы защелками Level3.
Почему мы должны использовать защелку уровня 3, а не сдвиг уровня 3?
Если бы вы использовали ISO_Level3_Shift, а не ISO_Level3_Latch, вы должны были бы одновременно нажать LeftCtrl+ LeftAlt+ YourDesiredKey, чтобы произошел сдвиг уровня 3. К сожалению, LeftCtrlи LeftAltдо сих пор остаются модификаторами, поэтому, кроме корректного смещения YourDesiredKey, он также будет «изменен» одним из Alt или Ctrl (в зависимости от того, что вы нажали первым). С защелкой у вас нет этой проблемы.