我正在尝试将三个键(左 alt、右 win 和菜单)重新映射到 emacs 的特定键。 具体来说,我想使用 RWIN 作为 Hyper,使用左侧 alt 作为 Meta,使用 My MENU 作为 Alt。
我就是这样设置xkb的。有两个文件,第一个是 super_hyper (在 ~/.xkb/symbols 中):
partial modifier_keys
xkb_symbols "standard" {
key <LALT> { [ Meta_L, Meta_L ] };
replace key <RWIN> { [ Hyper_R, Hyper_R ] };
replace key <MENU> { [ Alt_R, Alt_R ] };
modifier_map Mod1 { <META>, Meta_L };
modifier_map Mod3 { <HYPR>, Hyper_R };
modifier_map none { <ALT>, Alt_R };
};
第二个文件(~/.xkb/keymap/mykbd)非常简单:
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+it+inet(evdev)+compose(paus)+terminate(ctrl_alt_bksp)+super_hyper(standard)"};
xkb_geometry { include "pc(pc105)" };
};
然后我全部设置
xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY
xev 表明一切正常。 emacs 与 hyper(右 windows 键)和 meta(左 Alt 键)修饰符配合得很好。但是当我使用菜单键时,它的响应就像元修饰符一样,就像 alt 键一样。怎么解决?
最佳答案
您的左 alt
键应该已映射为 meta
键。我将通过一个示例向您展示如何配置 Emacs 将 AltGr
(右 alt)识别为 hyper
键。您可以根据您的需要调整该示例。
- 找出
AltGr
键的按键代码:
在控制台中运行:xev
。然后重复点击 AltGr
键并关闭程序。在输出中,您可以读取 AltGr
的关键代码。我得到:
...keycode 108 (keysym 0xffea, Alt_R)...
- 接下来,我们使用以下命令检查 key 的绑定(bind)方式:xmodmap -pm。就我而言,我得到:
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
在十六进制中,键码 108(十六进制 0x6c)与 Alt_R
关联。
- 从
mod1
中删除Alt_R
,因为我们希望将其映射到hyper
。此步骤是可选的。例如,我的menu
键(十六进制代码:0x87)不会出现在此输出中。因此我可以跳过这一步。
# remove all keys associated to mod1
xmodmap -e "clear mod1"
# but as we are only interested in Alt_R, re-assign those we removed wrongly
xmodmap -e "add mod1 = Alt_L Meta_L"
- 现在,我们可以将
AltGr
键重新分配给Hyper
(您可以选择其他键,例如:Alt_R
或Super_L
,Super_H
,...:
xmodmap -e "keycode 108 = Hyper_R"
- 最后,下一步是将这个键符号分配给修饰符。我选择了mod3(主要是因为它是空的):
xmodmap -e "add mod3 = Hyper_R"
- 在 Emacs 中,当我现在点击
AltGr-f
时,它告诉我H-f
未定义。我现在可以使用 super 键进行新的键绑定(bind):
(global-set-key (kbd "H-f") 'find-file)
如果我在步骤 4-5 中选择将 AltGr
和 mod3
分配给 Super_R
,我会使用 "S-f "
用于步骤 6 中的新按键绑定(bind)。类似地,在步骤 4-5 中将 AltGr
分配给 Alt_R
将导致使用例如“A-f”
设置绑定(bind)时。
编辑
如果您想将一个键(例如menu
键)分配给Alt_R
,则必须确保Meta_L
键已映射(例如mod1
)。如果 Meta_L
(例如分配给 Alt_L
)未出现在您的 xmodmap -pm
输出中,则很可能是您的 key (例如 menu
)充当进一步的meta
修饰符。
关于emacs - emacs 的 Xkb 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28527938/