有没有办法让Shift、Ctrl和Alt键在 X 下充当切换键?我知道如何在 CLI 下做到这一点(例如,通过执行这) 但在 X 下没有找到这样做的参考。
请注意,这是不是有关粘滞键的问题,可以通过辅助功能选项启用。
答案1
据我所知,这是在 DE 级别实现的。KDE 有锁定粘滞键的选项:
启用“锁定粘滞键”后:
如果您按Shift两次该键,然后按该F键,计算机会将其解释为Shift+ F。现在,如果您输入 P,计算机会将其解释为字母 P ( Shift+ P)。要取消选择 Shift 键,请再次按下该键。
http://docs.kde.org/stable/en/kdebase-workspace/kcontrol/kcmaccess/index.html
答案2
X11 中的按键使用 xmodmap 重新映射,但 /usr/include/X11/keysymdef.h 中没有 Control_Lock
如果您有几个键,您可以将 Control 映射到 ISO_Next_Group_Lock 之类的东西,并使用Control+在此组中定义您的键Key。
我在这里找到了一些信息: https://bbs.archlinux.org/viewtopic.php?id=75771
答案3
这可以使用 XKB 兼容组件来实现
检查您正在使用的兼容性变体
$ setxkbmap -v -query Trying to build keymap using the following components: keycodes: evdev+aliases(qwerty) types: complete compat: complete symbols: pc+us(altgr-intl)+us:2+inet(evdev) geometry: pc(pc105) rules: evdev model: pc105 layout: us,us variant: altgr-intl, $ more /usr/share/X11/xkb/compat/complete default xkb_compatibility "complete" { include "basic" augment "iso9995" augment "mousekeys" augment "accessx(full)" augment "misc" augment "xfree86" augment "level5" augment "caps(caps_lock)" };
修改
misc
文件,其中包含所需的修饰符解释sudo nano /usr/share/X11/xkb/compat/misc
我已将
Shift_L
、Alt_L
&Alt_R
操作从更改SetMods
为LockMods
,添加了新的Shift_R
、Control_L
&Control_R
解释LockMods
并进行了注释//setMods.clearLocks
(不确定是否有必要)。以下是完整文件:default partial xkb_compatibility "misc" { virtual_modifiers Alt,Meta,Super,Hyper,ScrollLock; // Interpretations for some other useful keys interpret Terminate_Server { action = Terminate(); }; //setMods.clearLocks= True; // Sets the "Alt" virtual modifier interpret Alt_L+Any { //useModMapMods= level1; virtualModifier= Alt; action = LockMods(modifiers=modMapMods); }; interpret Alt_L { action = LockMods(modifiers=Alt); }; interpret Alt_R+Any { //useModMapMods= level1; virtualModifier= Alt; action = LockMods(modifiers=modMapMods); }; interpret Alt_R { action = LockMods(modifiers=Alt); }; // Sets the "Meta" virtual modifier interpret Meta_L+Any { // useModMapMods= level1; virtualModifier= Meta; action = SetMods(modifiers=modMapMods); }; interpret Meta_L { action = SetMods(modifiers=Meta); }; interpret Meta_R+Any { //useModMapMods= level1; virtualModifier= Meta; action = SetMods(modifiers=modMapMods); }; interpret Meta_R { action = SetMods(modifiers=Meta); }; // Sets the "Super" virtual modifier interpret Super_L+Any { // useModMapMods= level1; virtualModifier= Super; action = SetMods(modifiers=modMapMods); }; interpret Super_L { action = SetMods(modifiers=Super); }; interpret Super_R+Any { //useModMapMods= level1; virtualModifier= Super; action = SetMods(modifiers=modMapMods); }; interpret Super_R { action = SetMods(modifiers=Super); }; // Sets the "Hyper" virtual modifier interpret Hyper_L+Any { // useModMapMods= level1; virtualModifier= Hyper; action = SetMods(modifiers=modMapMods); }; interpret Hyper_L { action = SetMods(modifiers=Hyper); }; interpret Hyper_R+Any { //useModMapMods= level1; virtualModifier= Hyper; action = SetMods(modifiers=modMapMods); }; interpret Hyper_R { action = SetMods(modifiers=Hyper); }; // Sets the "ScrollLock" virtual modifier and // makes it actually lock when pressed. Sets // up a map for the scroll lock indicator. interpret Scroll_Lock+Any { virtualModifier= ScrollLock; action = LockMods(modifiers=modMapMods); }; include "ledscroll" include "misc(assign_shift_left_action)" }; partial xkb_compatibility "assign_shift_left_action" { // Because of the irrevertable modifier mapping in symbols/pc <LFSH> is // getting bound to the Lock modifier when using // symbols/shift(both_capslock), creating unwanted behaviour. // This is a quirk, to circumvent the problem. interpret Shift_L { action = LockMods(modifiers = Shift); }; interpret Shift_R { action = LockMods(modifiers = Shift); }; interpret Control_L { action = LockMods(modifiers = Control); }; interpret Control_R { action = LockMods(modifiers = Control); }; };
编译更改并更新 initramfs 映像
sudo dpkg-reconfigure xkb-data sudo update-initramfs -u -k all
重启
参考: