emacs 的 Xkb 配置

Xkb configuration for emacs

我正在尝试将三个键(左 alt、右 win 和 menu)重新映射到 emacs 的特定键。 具体来说,我想使用 RWIN 作为 Hyper,我的左侧 alt 作为 Meta,我的 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 键。您可以根据需要调整示例。

  1. 找出AltGr键的键码:

运行 在控制台中:xev。然后反复按 AltGr 键然后关闭程序。在输出中,您可以读取 AltGr 的键码。我得到:

...keycode 108 (keysym 0xffea, Alt_R)...
  1. 接下来,我们使用以下命令检查我们的密钥是如何绑定的: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 关联。

  1. 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"
  1. 现在,我们可以将AltGr键重新分配给Hyper(您可以选择其他键,例如:Alt_RSuper_LSuper_H , ...:[=​​77=]
xmodmap -e "keycode 108 = Hyper_R"
  1. 最后,下一步是将此键符号分配给修饰符。我选择了mod3(主要是因为它是空的):
xmodmap -e "add mod3 = Hyper_R"
  1. 在 Emacs 中,当我点击现在 AltGr-f 时,它告诉我 H-f 未定义。我现在可以使用超级键进行新的键绑定:
(global-set-key (kbd "H-f") 'find-file)

如果我在步骤 4-5 中选择将 AltGrmod3 分配给 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修饰符。