我在禁用 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_Lock
在mod2
这里。当它打开时,所有按键事件都会带有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