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
键。您可以根据需要调整示例。
- 找出
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
, ...:[=77=]
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"
作为新的键绑定. 同样,在步骤 4-5 中将 AltGr
分配给 Alt_R
会导致使用例如"A-f"
设置绑定时。
编辑
如果要将键(例如 menu
键)分配给 Alt_R
,必须确保 Meta_L
键已映射(例如 mod1
).如果 Meta_L
(例如分配给 Alt_L
)没有出现在您的 xmodmap -pm
输出中,那么您的密钥(例如 menu
)很可能充当进一步的 meta
修饰符。
我正在尝试将三个键(左 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
键。您可以根据需要调整示例。
- 找出
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
, ...:[=77=]
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"
作为新的键绑定. 同样,在步骤 4-5 中将 AltGr
分配给 Alt_R
会导致使用例如"A-f"
设置绑定时。
编辑
如果要将键(例如 menu
键)分配给 Alt_R
,必须确保 Meta_L
键已映射(例如 mod1
).如果 Meta_L
(例如分配给 Alt_L
)没有出现在您的 xmodmap -pm
输出中,那么您的密钥(例如 menu
)很可能充当进一步的 meta
修饰符。