如何在 Linux 中仅重新映射特定键盘的按键?

ori*_*on3 7 xinput xte xbindkeys

我有一个通过 USB 连接的数字键盘,我的目标是能够重新映射该数字键盘上的按键,以便它们可以运行自定义命令或映射到其他按键组合。

我的文件中有这个.xbindkeysrc

~ $ cat .xbindkeysrc
"xte 'keydown Super_L' 'key Left' 'keyup Super_L'"
  m:0x10 + c:79 + Release
  Mod2 + KP_Home
Run Code Online (Sandbox Code Playgroud)

这会将 NUM 7 键(通常打印 7)重新映射到Super_L + Left Arrow。这很棒并且有效,但适用于所有键盘,而我的目标是使其仅适用于数字键盘。

一直在寻找如何做到这一点,但我得到的最接近的是使用xinput set-button-map. 不幸的是,这似乎只适用于鼠标等设备。我喜欢尝试获取数字键盘的按钮映射xinput get-button-map [device id],但它只打印从 1 到 7 的数字,而且我的键盘上肯定有更多按钮,所以它不一定有意义。

有什么建议吗?

Ale*_*lex 2

首先找到设备ID,使用xinput list

\n\n
$ xinput list\n\n\xe2\x8e\xa3 Virtual core keyboard\n...\n\xe2\x86\xb3   USB Keyboard     id=19  [slave  keyboard (3)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

每个设备/键盘的键映射

\n\n

(这只会映射键。有关将脚本映射到键的信息,请参阅下文)

\n\n

setxkbmap可以选择针对特定设备(键盘)。

\n\n

然后查询setxkbmap配置以查看您的设备设置(我将使用“19”):

\n\n
$ setxkbmap -device 19 -print\nxkb_keymap {\n    xkb_keycodes  { include "evdev+aliases(qwerty)" };\n    xkb_types     { include "complete"  };\n    xkb_compat    { include "complete"  };\n    xkb_symbols   { include "pc+us(euro)+us(intl):2+inet(evdev)"    };\n    xkb_geometry  { include "pc(pc105)" };\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

symbols就是我们正在寻找的;这些可以在 中找到ls /usr/share/X11/xkb/symbols。参数引用文件中的一个小节,例如xkb_symbols "intl" {

\n\n
\n

添加任何可用的选项(例如 rupesign),您可以执行以下操作setxkbmap -device 19 -option rupeesign:4

\n\n

要重置选项,请使用setxkbmap -device 19 -option而不带进一步参数。

\n
\n\n

但是,您需要一些自定义配置,这有点棘手,因为简单地在该文件夹中添加自定义文件并使用它是行不通的。

\n\n

因此,创建一些文件夹并使用当前配置创建一个临时文件。

\n\n
mkdir -p ~/.config/xkb/symbols\ncd ~/.config/xkb \nsetxkbmap -device 19 -print > tempfile.txt\ntouch symbols/mysymbol\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑tempfile.txt使其包含mysymbol(mymapping)

\n\n
...\nxkb_symbols   { include "pc+us(euro)+us(intl):2+inet(evdev)+mysymbol(mymapping)"   \n
Run Code Online (Sandbox Code Playgroud)\n\n

symbol/mysymbol以您想要的任何方式进行编辑,请/usr/share/X11/xkb/symbols参阅示例。\n此添加了一个比特币符号num 7key 。

\n\n
partial\nxkb_symbols "mymapping" {\n    key <AE07> { [  7,   &,   U20BF ]  };\n\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,最后,要激活此映射,请使用xkbcomp(注意-i 19设置设备)

\n\n
xkbcomp -i 19 -I$HOME/.config/xkb tempfile.txt $DISPLAY\n
Run Code Online (Sandbox Code Playgroud)\n\n

(这可能会显示一些warning消息,但它仍然有效)

\n\n

映射键以启动脚本

\n\n

有一个用于将密钥映射到脚本的工具:actkbd

\n\n

安装:

\n\n
$ git clone https://github.com/thkala/actkbd \n$ cd actkb\n$ make \n$ sudo make install\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在中找到键盘的设备名称/dev/input/,\在我的情况下是/dev/input/by-id/usb-_USB_Keyboard-event-kbd

\n\n

您现在应该有一个配置文件/etc/actkbd.conf包含一些示例的配置文件,可以全部删除。这里有一些更实际的例子

\n\n
# \'a\' starts gedit\n30:::gedit\n# \'shift+7\' starts a custom script. (keynumber 8 for some reason)\n42+8:::/home/me/myscript.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

要查找键号(或组合键),请使用 \'s\' 选项:

\n\n
$ actkbd -d /dev/input/by-id/usb-_USB_Keyboard-event-kbd -s\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 /etc/actkbd.conf 中配置后,启动程序(用于-D后台模式)

\n\n
$ actkbd -d /dev/input/by-id/usb-_USB_Keyboard-event-kbd\n
Run Code Online (Sandbox Code Playgroud)\n