XMonad 中的右 GUI 键
Right GUI key in XMonad
是否可以在 XMonad 中对 L_GUI+key 和 R_GUI+key 进行不同的绑定,如果可以,那么如何?
R_CTRL、R_SFT 和 R_ALT 也有同样的问题,但它们对我来说并不那么重要。
对于此类问题,可以问 xev 它对您的按键有何看法。这是我按左控制+a 和右控制+a 的一些示例输出:
KeyPress event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207488563, (419,468), root:(2341,612),
state 0x0, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207489283, (419,468), root:(2341,612),
state 0x4, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) ""
XmbLookupString gives 1 bytes: (01) ""
XFilterEvent returns: False
KeyRelease event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207489403, (419,468), root:(2341,612),
state 0x4, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) ""
XFilterEvent returns: False
KeyRelease event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207490035, (419,468), root:(2341,612),
state 0x4, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207538195, (-175,35), root:(1747,179),
state 0x0, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207538595, (-175,35), root:(1747,179),
state 0x4, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) ""
XmbLookupString gives 1 bytes: (01) ""
XFilterEvent returns: False
KeyRelease event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207538715, (-175,35), root:(1747,179),
state 0x4, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) ""
XFilterEvent returns: False
KeyRelease event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207539227, (-175,35), root:(1747,179),
state 0x4, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
如您所见,虽然左控制和右控制在按下时产生不同的按键,但在另一个按键期间按住时它们产生相同的状态。所以在我当前的设置中无法区分它们。
如果你想让它们成为不同的修饰符,可以用xmodmap来安排;但是,修改器的总数是有限的——我想可能是四个左右。但请参阅 xmodmap 文档了解详细信息。
我不熟悉 L_GUI 键,但一般来说,只要它们 return 不同的代码,您就可以对键进行不同的映射。确定这一点的一种简单方法是使用 xev
。使用 xev
运行ning,键入一个键会导致两个事件,一个是按键按下,一个是按键释放。
我有爱尔兰语键盘。当我 运行 xev
并键入左 Alt 键时,事件是:
KeyPress event, serial 33, synthetic NO, window 0xe00001,
root 0x1dc, subw 0x0, time 4233053053, (748,263), root:(1711,266),
state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 33, synthetic NO, window 0xe00001,
root 0x1dc, subw 0x0, time 4233053237, (748,263), root:(1711,266),
state 0x18, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
所以keycode是64。注意keysim是Alt_l
。要映射此键,我会查看 Graphics.X11.Types 并发现此键的常量是 xK_Alt_L
.
当我按下键盘上的右 Alt 键(标记为 Alt Gr)时,我得到一个不同的键码 108。所以我可以有不同的绑定。
KeyPress event, serial 33, synthetic NO, window 0xe00001,
root 0x1dc, subw 0x0, time 4233053813, (748,263), root:(1711,266),
state 0x10, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 33, synthetic NO, window 0xe00001,
root 0x1dc, subw 0x0, time 4233053989, (748,263), root:(1711,266),
state 0x90, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XFilterEvent returns: False
我可能是错的,但我认为U.S。键盘 return 左右 Alt 键的键码相同。在那种情况下,键不能有不同的绑定。
是否可以在 XMonad 中对 L_GUI+key 和 R_GUI+key 进行不同的绑定,如果可以,那么如何? R_CTRL、R_SFT 和 R_ALT 也有同样的问题,但它们对我来说并不那么重要。
对于此类问题,可以问 xev 它对您的按键有何看法。这是我按左控制+a 和右控制+a 的一些示例输出:
KeyPress event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207488563, (419,468), root:(2341,612),
state 0x0, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207489283, (419,468), root:(2341,612),
state 0x4, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) ""
XmbLookupString gives 1 bytes: (01) ""
XFilterEvent returns: False
KeyRelease event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207489403, (419,468), root:(2341,612),
state 0x4, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) ""
XFilterEvent returns: False
KeyRelease event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207490035, (419,468), root:(2341,612),
state 0x4, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207538195, (-175,35), root:(1747,179),
state 0x0, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207538595, (-175,35), root:(1747,179),
state 0x4, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) ""
XmbLookupString gives 1 bytes: (01) ""
XFilterEvent returns: False
KeyRelease event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207538715, (-175,35), root:(1747,179),
state 0x4, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) ""
XFilterEvent returns: False
KeyRelease event, serial 36, synthetic NO, window 0x1400001,
root 0x2a9, subw 0x0, time 4207539227, (-175,35), root:(1747,179),
state 0x4, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
如您所见,虽然左控制和右控制在按下时产生不同的按键,但在另一个按键期间按住时它们产生相同的状态。所以在我当前的设置中无法区分它们。
如果你想让它们成为不同的修饰符,可以用xmodmap来安排;但是,修改器的总数是有限的——我想可能是四个左右。但请参阅 xmodmap 文档了解详细信息。
我不熟悉 L_GUI 键,但一般来说,只要它们 return 不同的代码,您就可以对键进行不同的映射。确定这一点的一种简单方法是使用 xev
。使用 xev
运行ning,键入一个键会导致两个事件,一个是按键按下,一个是按键释放。
我有爱尔兰语键盘。当我 运行 xev
并键入左 Alt 键时,事件是:
KeyPress event, serial 33, synthetic NO, window 0xe00001,
root 0x1dc, subw 0x0, time 4233053053, (748,263), root:(1711,266),
state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 33, synthetic NO, window 0xe00001,
root 0x1dc, subw 0x0, time 4233053237, (748,263), root:(1711,266),
state 0x18, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
所以keycode是64。注意keysim是Alt_l
。要映射此键,我会查看 Graphics.X11.Types 并发现此键的常量是 xK_Alt_L
.
当我按下键盘上的右 Alt 键(标记为 Alt Gr)时,我得到一个不同的键码 108。所以我可以有不同的绑定。
KeyPress event, serial 33, synthetic NO, window 0xe00001,
root 0x1dc, subw 0x0, time 4233053813, (748,263), root:(1711,266),
state 0x10, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 33, synthetic NO, window 0xe00001,
root 0x1dc, subw 0x0, time 4233053989, (748,263), root:(1711,266),
state 0x90, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XFilterEvent returns: False
我可能是错的,但我认为U.S。键盘 return 左右 Alt 键的键码相同。在那种情况下,键不能有不同的绑定。