emacs - emacs 的 Xkb 配置

标签 emacs keyboard x11

我正在尝试将三个键(左 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 键。您可以根据您的需要调整该示例。

  1. 找出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_RSuper_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 中选择将 AltGrmod3 分配给 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/

    相关文章:

    python - 如何在 Python 的 IDLE 中获取 Emacs 的键绑定(bind)?

    Android - 键盘显示/隐藏时不调用 onConfigurationChanged

    ios - 出现键盘时调整 IOS WKWebView 的大小

    ssh - 通过ssh和local的Raspberry Pi Graphics

    c++ - 我需要获取桌面上显示或隐藏的所有窗口的列表

    emacs - 在 Emacs bibtex-mode 中重新定义段落开头和段落分隔

    emacs - 如何使 Emacs 中的编译窗口始终为特定大小?

    emacs - 是否可以在 Emacs 中分离 minibuffer 和 echo 区域?

    regex - Emacs 排序正则表达式字段

    c - 使用根 X11 窗口作为 SDL2 主窗口