CapsLock 作为应用程序键盘映射的修饰键

Kha*_*lla 12 keyboard x11 xmodmap xkb

我是开发人员,目前我正在使用带有 PyCharm IDE 的 Ubuntu Linux 来开发网站。为了提高打字性能,我考虑将 CapsLock 更改为 Hyper_L 并使用 xmodmap 将其分配给 mod3。在此之后,我想将 'i' 键的 mod3 映射到 'Up'。到目前为止,我所做的是:

xmodmap -e "keysym Caps_Lock = Hyper_L"
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

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)
Run Code Online (Sandbox Code Playgroud)

然后我从 mod4 中删除 Hyper_L

xmodmap -e "remove Mod4 = Hyper_L"
Run Code Online (Sandbox Code Playgroud)

之后我尝试将 Hyper_L 分配给 mod3

xmodmap -e "add Mod3 = Hyper_L"
Run Code Online (Sandbox Code Playgroud)

但是我得到如下错误:

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
Run Code Online (Sandbox Code Playgroud)

那么,这里的问题是什么?我怎样才能让它工作?我的做法对吗?或者我应该使用不同的方法来将 mod3 用于自定义键?

PS 我使用的是 Microsoft Natural Ergonomic 7000 键盘

hey*_*hew 20

There are a bajillion answers on the internet, most of them confusing.

The key is you need to map 'keycode 66' to your hyper key, remove the mapping of that key from other mod{1,2,4,5}'s (only if present), and then set 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
Run Code Online (Sandbox Code Playgroud)

运行这个

xmodmap ~/.Xmodmap
Run Code Online (Sandbox Code Playgroud)

如果出现问题,您可以使用以下命令重置键盘:

setxkbmap -layout us
Run Code Online (Sandbox Code Playgroud)

爆炸的可能原因是 Hyper_L 被映射到其他地方。通过运行不带 args 的 xmodmap 来解决这个问题,以确定还有什么绑定到 Hyper_L。当您知道需要删除的内容时,请在您的 .Xmodmap 文件中添加“删除 BINDING = Hyper_L”。

.Xmodmap 文件将在您打开 X11 会话时加载,您应该在下次登录或重新启动时设置此映射。

此配置适用于我的 ubuntu 14.04 设置。如果您有不同的 *nix 并且这不起作用,请在此处发布您为解决它所做的工作,我会将其合并到答案中。