我正在尝试将三个键,左侧alt,右侧win和菜单重新映射到emacs的特定键。 具体来说,我想使用RWIN作为Hyper,我的左边alt作为Meta,我的菜单作为Alt。
我以这种方式设置xkb。有两个文件,第一个是super_hyper(在〜/ .xkb /符号中):
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(右窗口密钥)和meta(左alt键)修饰符。但是当我使用菜单键时,它会像元修改器一样响应,就像alt键一样。我怎么解决?
答案 0 :(得分:3)
您的左alt
密钥应已映射为meta
密钥。我将向您展示如何配置Emacs以将AltGr
(右侧alt)识别为hyper
密钥的示例。您可以根据自己的需要调整示例。
AltGr
密钥的密钥代码:在控制台中运行:xev
。之后重复点击AltGr
键然后关闭程序。在输出中,您可以阅读AltGr
的密钥代码。我明白了:
...keycode 108 (keysym 0xffea, Alt_R)...
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
相关联。
Alt_R
移除mod1
,因为我们要将其映射到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"
xmodmap -e "add mod3 = Hyper_R"
AltGr-f
时,它告诉我H-f
未定义。我现在可以使用超级键进行新的键绑定:(global-set-key (kbd "H-f") 'find-file)
如果我在步骤4-5中选择将AltGr
和mod3
分配给Super_R
,我会在步骤6中使用"S-f"
作为新的键绑定。 ,在步骤4-5中将AltGr
分配给Alt_R
会导致使用例如设置绑定时"A-f"
。
修改强>
如果要将密钥(例如menu
密钥)分配给Alt_R
,则必须确保映射Meta_L
密钥(例如mod1
) 。如果Meta_L
(例如已分配给Alt_L
)未显示在您的xmodmap -pm
输出中,那么您的密钥(例如menu
)很可能会更进一步meta
}修饰符。