Следующее решение является варварским, но оно работает (при условии, что вы будете удовлетворены защелкой уровня 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 на level2 и наоборот (см. /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_) , Коды клавиш (37 и 64) можно найти, проверив вывод xmodmap -pke
или используя xev
.
Если бы мы применили только переопределения xmodmap (без использования сначала setxkbmap
), то ключ, отвечающий за сдвиг level2, был бы Shift, как и почти для всех клавиш, поэтому Shift+LeftCtrl и Shift+LeftAlt (но не LeftCtrl+LeftAlt) стать защелки уровня 3.
Почему мы должны использовать защелку уровня 3, а не сдвиг уровня 3?
Если бы вы использовали ISO_Level3_Shift, а не ISO_Level3_Latch, вам придется одновременно нажимать LeftCtrl+LeftAlt+YourDesiredKey, чтобы произошел сдвиг уровня 3. К сожалению, LeftCtrl и LeftAlt по- прежнему остаются модификаторами, поэтому, кроме корректного смещения YourDesiredKey, он также будет "изменен" одним из Alt или Ctrl (в зависимости от того, что вы нажали первым). С защелкой у вас нет этой проблемы.