禁用数字锁定,保留鼠标按钮键绑定

禁用数字锁定,保留鼠标按钮键绑定

我在禁用 Numlock 键(使该键不执行任何操作,以便数字键盘的数字始终有效)的同时将额外的鼠标按钮(在鼠标侧面)映射到快捷方式以执行自定义操作时遇到了麻烦。

我使用 Arch Linux 和 Xfce,登录管理器是 LightDM。

我使用这个代码,放入一个 bash 文件中,在启动时禁用我的数字锁定:

xmodmap -e "keycode 77 = NoSymbol"

我的主目录中有一个 .xbindkeysrc 文件,其中包含:

"xdotool key ctrl+w"
 b:8 + Release

"xdotool key ctrl+d"
 b:9 + Release

(关闭标签和书签)

如果我在启动时启用“禁用 Numlock”代码,.xbindkeysrc 文件将不再有效。这似乎与 xmodmap 命令(在它之前)位于同一 bash 文件中的命令有关numlockx on。我该如何解决?

添加

"NoCommand"
 c:77

到 .xbindkeysrc 也没有达到预期的效果。将 c 更改为 m 也无济于事,因为 Numlock 理论上是一个修饰键。使用 Num_Lock 代替 c:77 也不起作用。

答案1

让我们先解释一下发生了什么,以及为什么你的想法行不通。首先,看一下修改器图:

$ xmodmap
xmodmap:  up to 3 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

如您所见,Num_Lockmod2这里。当它打开时,所有按键事件都会带有mod2位。

如果你像这样禁用它:

$ xmodmap -e "keycode 77 = NoSymbol"
$ xmodmap 
xmodmap:  up to 3 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        BadKey (0x4d)
mod3      
mod4        Super_L (0x85),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

请注意,mod2现在与 相关联BadKey,这似乎让 Xorg 非常困惑。事实上,大多数修饰符映射更改似乎对我而言破坏了 X11。


目前,我找不到一个涉及使用修饰符映射的好解决方案。但我有另一个想法:你可以映射所有键盘键,使其在数字锁定打开和关闭时工作相同。即:

xmodmap -e "keysym KP_Up = KP_8"
xmodmap -e "keysym KP_Left = KP_4"
# ...

等等。一旦你这样做了,数字锁的状态将不再重要。

您甚至可以随后移除修改器来关闭 LED:

xmodmap -e "remove mod2 = Num_Lock"

答案2

根据@Michał Górny 的回答。以下是禁用数字锁定、使用数字以及将数字锁定映射到 F13 的命令(可能方便绑定到窗口管理器中的特殊功能)。

# NumLock is F13
xmodmap -e "remove mod2 = Num_Lock" \
        -e "keycode 77 = F13"

# Use numbers even when numlock is off
xmodmap -e "keysym KP_End = KP_1" \
        -e "keysym KP_Down = KP_2" \
        -e "keysym KP_Next = KP_3" \
        -e "keysym KP_Left = KP_4" \
        -e "keysym KP_Begin = KP_5" \
        -e "keysym KP_Right = KP_6" \
        -e "keysym KP_Home = KP_7" \
        -e "keysym KP_Up = KP_8" \
        -e "keysym KP_Prior = KP_9" \
        -e "keysym KP_Insert = KP_0" \
        -e "keysym KP_Delete = KP_Decimal"

不用一直亮着数字锁定灯真是太好了:)

答案3

  • Xfce 键盘设置:取消选中恢复数字锁定状态(当灯已亮时,这会将其关闭)
  • Xfce启动设置:在脚本中添加提及:sh /home/$USER/numlockalwayson.sh

脚本:

#timeout, otherwise it will not work upon boot/login (make two variants of the script. Use sleep 2 for the login variant)
sleep 20
xmodmap -e "keysym KP_Up = KP_8"
xmodmap -e "keysym KP_Left = KP_4"
xmodmap -e "keysym KP_Right = KP_6"
xmodmap -e "keysym KP_Down = KP_2"
#
xmodmap -e "keysym KP_Begin = KP_5"
#
xmodmap -e "keysym KP_Home = KP_7"
xmodmap -e "keysym KP_Next = KP_3"
xmodmap -e "keysym KP_Prior = KP_9"
xmodmap -e "keysym KP_End = KP_1"
#
xmodmap -e "keysym KP_Insert = KP_0"
xmodmap -e "keysym KP_Delete = KP_Decimal"
#
numlockx on

按下 Num_Lock 时,此灯会关闭。这是此解决方案的唯一缺点,并且比我之前的解决方案有了很大的改进。此解决方案不会破坏 Alt 等其他修饰键。

非常感谢 Michał Górny 提供此解决方案。

奖金

如果您注销并再次登录,该脚本将不再起作用(您必须重新启动才能使其再次起作用)。要解决此问题,请编辑 /etc/lightdm/lightdm.conf(它在 Manjaro Linux 中的位置)并添加脚本的登录变体:

session-setup-script=sh /home/$USER/numlockalwayson-login.sh

此外,如果您注销,LightDM 会关闭数字锁定。要更正此问题,请在同一文件中添加:

greeter-setup-script=/usr/bin/numlockx on

别忘了保存。

您需要启动 Xfce 和此配置才能使其始终工作。

答案4

我认为在启用xmodmap时不应使用xkb(现在总是启用)。这是一个基于 xkb 的解决方案:使用未使用的键的代码更改 numlock 的键代码:

/usr/bin/numlockx on
/usr/bin/xkbcomp $DISPLAY /tmp/kbmap.xkb
sed -i.bak 's/<NMLK> = 77;/<NMLK> = 98;/
            s/<KATA> = 98;/<KATA> = 77;/' /tmp/kbmap.xkb
/usr/bin/xkbcomp /tmp/kbmap.xkb $DISPLAY

相关内容