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_R
或Super_L
,Super_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 中选择将 AltGr
和 mod3
分配给 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 配置的主要内容,如果未能解决你的问题,请参考以下文章