emacs 的 Xkb 配置

Posted

技术标签:

【中文标题】emacs 的 Xkb 配置【英文标题】:Xkb configuration for emacs 【发布时间】:2015-02-15 15:54:41 【问题描述】:

我正在尝试将左 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 键一样。我该如何解决?

【问题讨论】:

我不确定,但也许这个链接可以给你更多的洞察力:ergoemacs.org/emacs/emacs_hyper_super_keys.html 谢谢,但是除了 gnome/ubuntu GUI 之外,该链接没有提供任何配置键盘的方法(我怀疑它会提供 xkb 选项配置,这对我来说非常遥远我想)。而且我不需要重新映射普通键的方法,我已经可以做到,我可以轻松拥有 super 和 hyper。我真正需要的是拥有一个被 emacs 识别为 Alt 键的 Alt 键。 【参考方案1】:

您左侧的alt 键应该已经映射为meta 键。我将通过一个示例向您展示如何配置 Emacs 以将 AltGr(右 alt)识别为 hyper 键。然后,您可以根据需要调整示例。

    找出AltGr键的键码:

在控制台中运行:xev。之后反复点击AltGr 键,然后关闭程序。在输出中,您可以读取AltGr 的密钥代码。我明白了:

...keycode 108 (keysym 0xffea, Alt_R)...
    接下来,我们使用以下命令检查我们的密钥是如何绑定的: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_RSuper_LSuper_H,...:
xmodmap -e "keycode 108 = Hyper_R"
    最后,下一步是将这个键符号分配给一个修饰符。我选择了mod3(主要是因为它是空的):
xmodmap -e "add mod3 = Hyper_R"
    在 Emacs 中,当我现在点击 AltGr-f 时,它告诉我 H-f 未定义。我现在可以使用超级键进行新的键绑定了:
(global-set-key (kbd "H-f") 'find-file)

如果我在步骤 4-5 中选择将 AltGrmod3 分配给 Super_R,我会在步骤 6 中将 "S-f" 用于新的键绑定。同样,将 AltGr 分配给 @987654353 @ 在步骤 4-5 会导致使用例如"A-f" 设置绑定时。

编辑

如果您想将一个键(例如menu 键)分配给Alt_R,则必须确保映射了Meta_L 键(例如,映射到mod1)。如果Meta_L(例如分配给Alt_L)没有出现在您的xmodmap -pm 输出中,那么很可能您的键(例如menu)充当另一个meta 修饰符。

【讨论】:

我设置键没有问题,我不需要重新映射 alt 键(那是元)。我只希望将一个键(菜单)映射为 alt(而不是 meta)。我已经这样做了,xev 表明效果很好,但是出于奇怪的原因(可能是 emacs alt 到 meta 回退?或者某些 mod 映射错误?) emacs 不将其识别为 alt,而是 meta。我想知道为什么以及如何解决。 如何在 Emacs 中绑定 alt 键?如果我错了,请纠正我,但旧键盘上的元不是今天的 alt 键吗? Emacs 能够与 alt 和 meta 有不同的键绑定,所以我有另一个与 meta 不同的修饰符:gnu.org/software/emacs/manual/html_node/emacs/… 是的,alt 键通常发送 meta。我的键盘也有同样的行为。但我想要一个额外的修饰符。 如果我没记错的话,你会在我的回答中看到这一点。我举例说明如何将右 Alt 键分配给 Hyper。但是,在最后一段中,我提到了如何使正确的 Alt 表现得像一个实际的 Alt 键。在您的情况下,您需要获取菜单键码,删除它绑定的任何内容,例如mod1(可选),重复第 4 步,但您应该使用 Alt_R 而不是 Hyper_R,最后将其映射到 mod3(第 5 步)。然后,它将表现得像一个 Alt。我举了一个右 Alt 键的例子,主要是为了说明。 我稍微修改了最后一段。

以上是关于emacs 的 Xkb 配置的主要内容,如果未能解决你的问题,请参考以下文章

Emacs怎么配置和安装?

如何配置我的 emacs 配置?

emacs 配置.emacs

Emacs 配置

我的emacs配置

Emacs配置(考场必备)(Emacs)