我是一名开发人员,目前我正在使用 Ubuntu Linux 和 PyCharm IDE 来开发网站。为了提高打字性能,我考虑将 CapsLock 更改为 Hyper_L 并使用 xmodmap 将其分配给 mod3。之后我想将“i”键的 mod3 映射到“Up”。到目前为止我所做的是:
xmodmap -e "keysym Caps_Lock = Hyper_L"
输出是这样的:
shift Shift_L (0x32), Shift_R (0x3e)
lock Hyper_L (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
然后我从 mod4 中删除 Hyper_L
xmodmap -e "remove Mod4 = Hyper_L"
之后我尝试将 Hyper_L 分配给 mod3
xmodmap -e "add Mod3 = Hyper_L"
但是我收到错误如下:
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 118 (X_SetModifierMapping)
Value in failed request: 0x17
Serial number of failed request: 11
Current serial number in output stream: 11
那么,这里出了什么问题呢?我怎样才能让它发挥作用?我的做法正确吗?或者我应该使用不同的方法来使用 mod3 作为自定义键?
PS 我使用的是 Microsoft Natural Ergonomic 7000 键盘
答案1
互联网上有无数的答案,其中大多数都令人困惑。
关键是您需要将“keycode 66”映射到您的超级键,从其他 mod{1,2,4,5} 中删除该键的映射(仅当存在时),然后设置 mod3。
打开 ~/.Xmodmap 并输入以下内容:
! Unmap capslock
clear Lock
keycode 66 = Hyper_L
! Leave mod4 as windows key _only_
remove mod4 = Hyper_L
! Set mod3 to capslock
add mod3 = Hyper_L
运行这个
xmodmap ~/.Xmodmap
如果出现问题,您可以使用以下方法重置键盘:
setxkbmap -layout us
爆炸的可能原因是 Hyper_L 被映射到其他地方。通过运行不带参数的 xmodmap 来找出与 Hyper_L 绑定的其他内容来修复此问题。当您知道需要删除什么后,请在 .Xmodmap 文件中添加“remove BINDING = Hyper_L”。
当您打开 X11 会话时,.Xmodmap 文件将被加载,您下次登录或重新启动时应该已准备好此映射。
此配置适用于我的 ubuntu 14.04 设置。如果您有不同的 *nix 并且这不起作用,请在此处发布您为解决该问题所做的工作,我会将其合并到答案中。
答案2
我知道这个问题已经很老了,但我需要分享我的解决方案,因为(令人沮丧地)heymantthew 的答案对我不起作用。最终对我有用的是:
setxkbmap -layout us -option lv3:caps_switch -variant intl
这将启用大写锁定作为 mod3 键,将布局设置为“us”并将变体设置为“intl”。如果您使用像 Fish 这样的交互式 shell,那么您可以在“-layout”、“-option”或“-variant”后按 Tab 键来获取可能参数的完整列表。
进一步的背景:一年前,我在运行 i3 窗口管理器的 Ubuntu 机器上尝试了 xmodmap 方法,从标准 gnome 环境切换过来。我修改了“us”xkb 键盘布局,特别是带有死键的国际键盘布局 - 使用 gnome-desktop-manager 时效果很好(有一个选项可以将 caps-lock 设置为 mod3 键),但我不能让它与 xmodmap 一起工作。这是我的错误:我以为 gdm GUI 使用 xmodmap 将大写锁定映射到 mod3,但实际上它正在设置此 X11 选项。现在我切换到 Arch,我被迫弄清楚这一点。
我建议任何打算解决这个问题的人都阅读 localectl、xmodmap、setxkbmap 的手册页,并通过添加睡眠和恢复部分来测试布局:
setxkbmap ... ; sleep 10; setxkbmap <INSERT DEFAULT SETTINGS>
这节省了我很多时间。
然而,我仍然不明白为什么 xmodmap 方法不起作用。希望这对某人有帮助。