用XKB覆盖一些键码


10

我想用XKB整理一些键。(为什么?在不方便放置某些键的笔记本电脑上。)我目前使用xmodmap:

keycode 110 = Prior
keycode 115 = Delete
keycode 112 = Next
keycode 117 = Insert
keycode 119 = End
keycode 118 = Home

相反,我想使用XKB并为某些物理键分配不同的符号名称,而不是为某些键码分配不同的keyym。(就是为什么。)我希望发送键码110 PGUP而不是,发送HOME键码115 DELE而不是发送END,等等。其余的配置必须不受影响(因此PGUP要继续发送键符Prior等,并且所有其他键都将保留)像他们那样)。

如何更改这些特定键码的分配?我将加载文件xkbcomp somefile.xkb $DISPLAY,我需要放入什么文件somefile.xkb

Answers:


14

创建一个包含您的键码更改的文件,并将其另存为(例如)~/.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到include路径。(如果您为文件命名的名称不是~/.xkb/keycodes/local,则显然需要更改+local-I${HOME}/.xkb}。)这样,所有其他设置都会保留下来。


1
因此,是将其传递到-I交换机的预期路径和方式!谢谢,我无法从手册页中找到答案。
L. Levrel '16

像魅力一样运作!如果要更新xkb_symbols,就可以工作,只需用它替换xkb_keycodes,就可以了
zw963

5

您可以首先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并修改相同的行(它与包含被评估的键盘映射相同)。这样,对于多个定义都不会发出警告,但可读性较差。


1
这些名称(evdev+aliases(azerty),等等)从何而来?我明确希望执行相对更改,而不是完全重新配置。问题中列出的6个键以外的其他键必须不受影响,它们必须保持在我发出命令时所处的状态。
吉尔斯(Gillles)“所以-不要再邪恶了”

1
它们来自setxkbmap -print,它们来自/usr/share/X11/xkb/。我认为您必须提供完整的键盘映射,xkbcomp但是我可能错了……
Leiaz 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.