![使用 XKB 覆盖一些键码](https://linux22.com/image/61798/%E4%BD%BF%E7%94%A8%20XKB%20%E8%A6%86%E7%9B%96%E4%B8%80%E4%BA%9B%E9%94%AE%E7%A0%81.png)
我想用 XKB 打乱几个键。 (为什么?在笔记本电脑上,有些按键位置不方便。)我目前使用 xmodmap:
keycode 110 = Prior
keycode 115 = Delete
keycode 112 = Next
keycode 117 = Insert
keycode 119 = End
keycode 118 = Home
相反,我想使用 XKB 并为某些物理键分配不同的符号名称,而不是为某些键码分配不同的键符号。 (这就是原因。)我希望发送 keycode 110PGUP
而不是HOME
, keycode 115 发送DELE
而不是END
,等等。配置的其余部分不得受到影响(因此PGUP
要继续发送 keysymPrior
等,并且所有其他键保持原样是)。
如何更改这些特定键码的分配?我将加载一个文件xkbcomp somefile.xkb $DISPLAY
,我需要放入什么somefile.xkb
?
答案1
创建一个包含您的键码更改的文件,并将其另存为(例如)~/.xkb/keycodes/local
. (该keycodes
目录是硬编码的;基目录可以是其他目录,文件名也可以是其他内容。)这将包含在您的情况中
xkb_keycodes {
<PGUP> = 110;
<PGDN> = 112;
<DELE> = 115;
<INS> = 117;
<HOME> = 118;
<END> = 119;
};
要加载它,请运行
setxkbmap -print | sed -e '/xkb_keycodes/s/"[[:space:]]/+local&/' | xkbcomp -I${HOME}/.xkb - $DISPLAY
这会输出您当前的设置,添加+local
到语句中xkb_keycodes
include
,并将其加载到 XKB 编译器中,添加~/.xkb
到包含路径中。 (如果您将文件命名为 以外的名称~/.xkb/keycodes/local
,则显然需要更改+local
和-I${HOME}/.xkb}
。)这样所有其他设置都会被保留。
答案2
您可以首先setxkbmap -print > somefile.xkb
获取用作基础的键映射,然后在该xkb_keycodes
部分中重新定义所需的键名称,如下所示:
xkb_keymap {
xkb_keycodes {
include "evdev+aliases(azerty)"
// Custom <key name> = keycode
<INS> = 117;
<HOME> = 118;
<PGUP> = 110;
<DELE> = 115;
<END> = 119;
<PGDN> = 112;
};
xkb_types { include "complete"};
xkb_compatibility { include "complete"};
xkb_symbols { include "pc+fr+inet(evdev)"};
xkb_geometry { include "pc(pc104)"};
};
这会生成警告,提示某些键名称被分配了多次,但它有效,因为只有最后一个才算在内(因此将自定义设置放在包含之后很重要)。并且该文件具有可读性的优点。
另一种方法是将您使用的键盘映射转储到文件中:xkbcomp $DISPLAY somefile.xkb
并修改相同的行(它是与评估的包含相同的键盘映射)。这样就不会出现多个定义的警告,但可读性较差。