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

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

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

我的文件中有这个.xbindkeysrc

~ $ cat .xbindkeysrc
"xte 'keydown Super_L' 'key Left' 'keyup Super_L'"
  m:0x10 + c:79 + Release
  Mod2 + KP_Home

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

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

有什么建议吗?

答案1

考虑使用https://github.com/rvaiya/keyd。它是为此目的而编写的,并且适用于整个系统。

答案2

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

$ xinput list

⎣ Virtual core keyboard
...
↳   USB Keyboard     id=19  [slave  keyboard (3)]

每个设备/键盘的键映射

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

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

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

$ setxkbmap -device 19 -print
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us(euro)+us(intl):2+inet(evdev)"    };
    xkb_geometry  { include "pc(pc105)" };
};

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

要添加任何可用的例如,rupesign 等选项,您可以这样做setxkbmap -device 19 -option rupeesign:4

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

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

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

mkdir -p ~/.config/xkb/symbols
cd ~/.config/xkb 
setxkbmap -device 19 -print > tempfile.txt
touch symbols/mysymbol

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

...
xkb_symbols   { include "pc+us(euro)+us(intl):2+inet(evdev)+mysymbol(mymapping)"   

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

partial
xkb_symbols "mymapping" {
    key <AE07> { [  7,   &,   U20BF ]  };

};

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

xkbcomp -i 19 -I$HOME/.config/xkb tempfile.txt $DISPLAY

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

映射键以启动脚本

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

安装:

$ git clone https://github.com/thkala/actkbd 
$ cd actkb
$ make 
$ sudo make install

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

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

# 'a' starts gedit
30:::gedit
# 'shift+7' starts a custom script. (keynumber 8 for some reason)
42+8:::/home/me/myscript.py

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

$ actkbd -d /dev/input/by-id/usb-_USB_Keyboard-event-kbd -s

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

$ actkbd -d /dev/input/by-id/usb-_USB_Keyboard-event-kbd

相关内容