重新分配 Ctrl 和 Alt 键 - xmodmap 'BadValue' 错误

重新分配 Ctrl 和 Alt 键 - xmodmap 'BadValue' 错误

我正在尝试重新映射我的键盘以使 emacs 可用。我的人体工学键盘将其单个控制键放置在左侧的一个独立的 4 键岛中。

操作系统是Debian挤压。

以下是我尝试输入的行xmodmap,我将它们放入文件 ~/.Xmodmap 中:

清晰的控制
清除模块1
!我的键盘上的 Alt 键标有“Option”,
!使用 xev 显示它们分别发送 Alt_L 和 Alt_R 键符号
键符号 Alt_L = Control_L
键符号 Alt_R = Control_R
! Super_L 和 Super_R 键是 Windows 键
键符号 Super_L = Alt_L
键符号 Super_R = Alt_R
添加 Control = Control_L Control_R
添加 Mod1 = Alt_L Alt_R

我的目标是让我的 Option(又名Alt)键表现得像 Control 键,并让我的 Windows(又名 Super)键表现得像Alt.

以下是 xev 为相关按键输出的按键代码和按键信息。请注意,我的键盘(Goldtouch 人体工学键盘)只有一个控制键。

键码 37(键符号 0xffe3,Control_L)
键码 64(键符号 0xffe9,Alt_L)
键码 133(键符号 0xffeb,Super_L)
键码 134(键符号 0xffec,Super_R)
键码 108(键符号 0xffea,Alt_R)

这是 xev 在运行时显示的内容xmodmap .Xmodmap

MappingNotify 事件,序列号 34,合成 NO,窗口 0x0,
    请求 MappingKeyboard,first_keycode 204,计数 1

MappingNotify 事件,序列号 34,合成 NO,窗口 0x0,
    请求 MappingKeyboard,first_keycode 64,计数 1

MappingNotify 事件,序列号 34,合成 NO,窗口 0x0,
    请求 MappingKeyboard,first_keycode 108,计数 1

MappingNotify 事件,序列号 34,合成 NO,窗口 0x0,
    请求 MappingKeyboard,first_keycode 206,计数 1

MappingNotify 事件,序列号 34,合成 NO,窗口 0x0,
    请求 MappingKeyboard,first_keycode 133,计数 1

MappingNotify 事件,序列号 34,合成 NO,窗口 0x0,
    请求 MappingKeyboard,first_keycode 134,计数 1

这是返回的错误xmodmap

X 请求失败错误:BadValue(整数参数超出操作范围)
失败请求的主要操作码:118 (X_SetModifierMapping)
失败请求中的值:0x17
失败请求的序列号:17
输出流中的当前序列号:17

关于如何解决这个问题有什么建议吗?

答案1

看看贾尔斯链接的解决方法,这对我有用:

clear Mod1
clear Mod4

keycode 204 = NoSymbol NoSymbol NoSymbol NoSymbol
keycode 206 = NoSymbol NoSymbol NoSymbol NoSymbol

keycode 64 = Control_L Control_L Control_L Control_L
keycode 133 = Alt_L Alt_L Alt_L Alt_L
keycode 134 = Alt_R Alt_R Alt_R Alt_R
keycode 108 = Control_R Control_R Control_R Control_R

add Control = Control_L Control_R
add Mod1 = Alt_L Alt_R

我的 Option 键现在的功能类似于 Control 键,而我的 Windows 键的功能类似于 Alt 键。

答案2

这已经被报道为Debian 错误 #564327,Debian 错误 #565279,Ubuntu 错误 #524774, 和FreeDesktop 错误 20145。 FreeDesktop 错误讨论中附有一个源补丁。 Ubuntu bug 讨论中有几个解决方法建议,特别是解决.Xmodmap方法

答案3

当您尝试将键符号添加到已添加到另一个修饰键的修饰符时,就会出现问题。重要的是要知道,如果将键符号添加到修饰符,则与该键符号一起使用的所有其他键符号也会添加到该修饰符。

例如:

clear mod5
add mod5    = ISO_Level3_Shift Mode_switch

可以导致

mod5        backslash (0x33),  Caps_Lock (0x42),  ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

因为你有类似的东西

keycode  66 = Caps_Lock NoSymbol ISO_Level3_Shift

在你的 ~/.Xmodmap 中(通过查看当前的键码到键符号映射xmodmap -pke

当您还尝试执行类似操作时,这会产生有问题的 BadValue 错误

add lock    = Caps_Lock

因为 Caps_Lock 已经添加到 mod5 修饰符中。

答案4

这是您问题的另一种解决方案,尽管它并没有真正回答您的问题。编辑 xorg.conf,将以下内容插入到“InputDevice”部分:

 Option "XkbOptions" "ctrl:swapcaps"

相关内容