用 XKB 覆盖一些键码

Gil*_*il' 11 x11 xkb keyboard-layout

我想用 XKB 随机播放几个键。(为什么?在某些按键不方便的笔记本电脑上。)我目前使用 xmodmap:

keycode 110 = Prior
keycode 115 = Delete
keycode 112 = Next
keycode 117 = Insert
keycode 119 = End
keycode 118 = Home
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*itt 17

创建一个包含您的键码更改的文件,并将其另存为(例如)~/.xkb/keycodes/local。(该keycodes目录是硬编码的;基本目录可以是其他内容,文件名也可以。)这将包含在您的情况中

xkb_keycodes {
  <PGUP> = 110;
  <PGDN> = 112;
  <DELE> = 115;
  <INS> = 117;
  <HOME> = 118;
  <END> = 119;
};
Run Code Online (Sandbox Code Playgroud)

要加载它,运行

setxkbmap -print | sed -e '/xkb_keycodes/s/"[[:space:]]/+local&/' | xkbcomp -I${HOME}/.xkb - $DISPLAY
Run Code Online (Sandbox Code Playgroud)

这将输出您当前的设置,添加+localxkb_keycodes include语句中,并将其加载到 XKB 编译器中,添加~/.xkb到包含路径中。(如果您将文件命名为 以外的其他名称~/.xkb/keycodes/local,您显然需要更改+local-I${HOME}/.xkb}。)这样所有其他设置都将保留。


Lei*_*iaz 7

您可以首先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)"};
};
Run Code Online (Sandbox Code Playgroud)

这会生成一些键名被多次分配的警告,但它有效,因为只有最后一个计数(因此将自定义设置放在包含之后很重要)。并且文件具有可读性的优点。

另一种方法是将您使用的键映射转储到一个文件中:xkbcomp $DISPLAY somefile.xkb并修改相同的行(它与包含评估的键映射相同)。这样就没有针对多个定义的警告,但可读性较差。

  • 它们来自`setxkbmap -print`,它们是来自`/usr/share/X11/xkb/`的文件。我认为你必须给 `xkbcomp` 一个完整的键盘映射,但我可能是错的...... (2认同)