在尝试了几种关键的重新映射想法之后Space,AltGr改变xkb
看起来是最有希望的。我阅读并使用了以下相关的想法xkb
:
将 altgr 键重新映射到 XKB 中的 AC10
如何重新映射键盘按键?
乍一看,我的更正似乎在文本编辑器和终端中有效(Space符号打印在AltGr按键上)。然而,在 Firefox 中它不起作用。更仔细地观察,我注意到在所有三个应用程序中按键组合AltGr都可以工作(就好像没有进行重新映射一样),除了在终端和文本编辑器中该组合还会打印空格字符。例如,在终端和 FireFox 中,组合AltGr+F打开文件菜单,并且在终端中还会打印一个空格字符。
我的Space坏了,我不使用AltGr。我只是想完全交换它们的功能。我缺少什么? (我使用 Kali Linux。)
这就是我所做的:
1.
打开/usr/share/X11/xkb/symbols/pc
2.
将注释行更改为以下内容:
// key <SPCE> { [ space ] };
key <SPCE> { [ ISO_Level3_Shift ] };
3.
添加了这些行:
// Additionally added
key <RALT> { [ 32 ] };
4.
已保存pc
文件。
5.
清除xkb
缓存运行rm -rf /var/lib/xkb/*
6.
重启
附加信息(在上面列出的更改之后)。
当前完整pc
文件:
default partial alphanumeric_keys modifier_keys
xkb_symbols "pc105" {
key <ESC> { [ Escape ] };
// The extra key on many European keyboards:
key <LSGT> { [ less, greater, bar, brokenbar ] };
// The following keys are common to all layouts.
key <BKSL> { [ backslash, bar ] };
// key <SPCE> { [ space ] };
key <SPCE> { [ ISO_Level3_Shift ] };
include "srvr_ctrl(fkey2vt)"
include "pc(editing)"
include "keypad(x11)"
key <BKSP> { [ BackSpace, BackSpace ] };
key <TAB> { [ Tab, ISO_Left_Tab ] };
key <RTRN> { [ Return ] };
key <CAPS> { [ Caps_Lock ] };
key <NMLK> { [ Num_Lock ] };
key <LFSH> { [ Shift_L ] };
key <LCTL> { [ Control_L ] };
key <LWIN> { [ Super_L ] };
key <RTSH> { [ Shift_R ] };
key <RCTL> { [ Control_R ] };
key <RWIN> { [ Super_R ] };
key <MENU> { [ Menu ] };
// Beginning of modifier mappings.
modifier_map Shift { Shift_L, Shift_R };
modifier_map Lock { Caps_Lock };
modifier_map Control{ Control_L, Control_R };
modifier_map Mod2 { Num_Lock };
modifier_map Mod4 { Super_L, Super_R };
// Fake keys for virtual<->real modifiers mapping:
key <LVL3> { [ ISO_Level3_Shift ] };
key <MDSW> { [ Mode_switch ] };
modifier_map Mod5 { <LVL3>, <MDSW> };
key <ALT> { [ NoSymbol, Alt_L ] };
include "altwin(meta_alt)"
key <META> { [ NoSymbol, Meta_L ] };
modifier_map Mod1 { <META> };
key <SUPR> { [ NoSymbol, Super_L ] };
modifier_map Mod4 { <SUPR> };
key <HYPR> { [ NoSymbol, Hyper_L ] };
modifier_map Mod4 { <HYPR> };
// End of modifier mappings.
key <OUTP> { [ XF86Display ] };
key <KITG> { [ XF86KbdLightOnOff ] };
key <KIDN> { [ XF86KbdBrightnessDown ] };
key <KIUP> { [ XF86KbdBrightnessUp ] };
// Additionally added
key <RALT> { [ 32 ] };
};
hidden partial alphanumeric_keys
xkb_symbols "editing" {
key <PRSC> {
type= "PC_ALT_LEVEL2",
symbols[Group1]= [ Print, Sys_Req ]
};
key <SCLK> { [ Scroll_Lock ] };
key <PAUS> {
type= "PC_CONTROL_LEVEL2",
symbols[Group1]= [ Pause, Break ]
};
key <INS> { [ Insert ] };
key <HOME> { [ Home ] };
key <PGUP> { [ Prior ] };
key <DELE> { [ Delete ] };
key <END> { [ End ] };
key <PGDN> { [ Next ] };
key <UP> { [ Up ] };
key <LEFT> { [ Left ] };
key <DOWN> { [ Down ] };
key <RGHT> { [ Right ] };
};
setxkbmap -print
:
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
xev
(AltGr按下并释放):
KeyPress event, serial 34, synthetic NO, window 0x3400001,
root 0x6cb, subw 0x0, time 1249191, (168,-8), root:(797,298),
state 0x0, keycode 108 (keysym 0x20, space), same_screen YES,
XLookupString gives 1 bytes: (20) " "
XmbLookupString gives 1 bytes: (20) " "
XFilterEvent returns: False
KeyRelease event, serial 37, synthetic NO, window 0x3400001,
root 0x6cb, subw 0x0, time 1249261, (168,-8), root:(797,298),
state 0x8, keycode 108 (keysym 0x20, space), same_screen YES,
XLookupString gives 1 bytes: (20) " "
XFilterEvent returns: False
由于我的键盘Space按键坏了,我无法显示它的xev
。
答案1
实际上,我已经让它工作了xkeymap
,我把它留在这里作为不同的答案,因为该方法与我以前的解决方案完全不同。
也许您错过了一些AltGr使用情况。
为了模仿您的设置,我使用该命令导出了当前配置文件xkbcomp $DISPLAY current.xkb
,并通过删除所有ISO_Level3_Shift
,LVL3
和Mod5
出现的情况进行了编辑。
准确地说,我删除的是:
interpret ISO_Level3_Shift+AnyOf(all) {
virtualModifier= LevelThree;
useModMapMods=level1;
action= SetMods(modifiers=LevelThree,clearLocks);
};
interpret ISO_Level3_Shift+AnyOfOrNone(all) {
action= SetMods(modifiers=LevelThree,clearLocks);
};
key <LVL3> {
type= "ONE_LEVEL",
symbols[Group1]= [ ISO_Level3_Shift ]
};
key <RALT> {
type= "ONE_LEVEL",
symbols[Group1]= [ ISO_Level3_Shift ]
};
modifier_map Mod5 { <LVL3> };
然后我插入了:
key <LVL3> {[space]};
key <RALT> {[space]};
可以通过加载它来测试编辑后的配置
xkbcomp new_conf.xkb $DISPLAY
答案2
我没有找到任何参考资料来证明您提出的建议不适用于 Firefox,而 Chromium(以及 Chrome)似乎并不依赖于 xkeymaps:它是一个发展选择更好地将该程序集成到 ChromeOS 中。因此,某些系统重新映射不受支持。
对我有用的修复方法是在内核级别重新映射键码。为了实现这一点,我收集了 space 和 altGr 的扫描码(按键的硬件 ID)和按键码(它们映射的符号):
# to collect scan-codes
sudo showkey -s
# space press: 0x39
# altGr press: 0xe0 0x38
# to collect key-codes
sudo showkey
# space press: 57
# altGr press: 100
据我了解,您想将 altGr 重新映射到空格,因为您的空格键已损坏,因此:
sudo setkeycodes e038 57
应该可以解决问题。
为了使其在 Kali Linux 下永久存在,您必须编辑默认的 xinit 文件 ,/etc/xdg/xfce4/xinitrc
将其复制到包含 ; 的 if 语句之前~/.xinitrc
并插入到该文件中。在 Kali 20.04 默认文件中,这个 if 语句位于第 86 行。sudo setkeycodes e038 57
exec xfce4-session
请注意,这需要启用 sudo 无需密码),但据我所知,这已经是 Kali 中的默认选项。