如何在插入外接键盘时自动更改系统键盘布局?

如何在插入外接键盘时自动更改系统键盘布局?

我有一台美式笔记本电脑,很好,但我也有一个英式人体工学 USB 键盘。

因此,我通常使用美国键盘布局,但是当我坐在办公桌前使用英国 USB 键盘时,我发现自己会在符号上犯一些愚蠢的错误(通常,无论是使用 ergo 还是标准 kbd,我都可以成为一个相当不错的盲打者)。

有人能想到一种基于插入键盘的推断布局/USBID 来设置键盘布局的干净方法吗?

即使有自定义设置,例如将特定的 USB ID 添加到检查其是否插入的运行时脚本。这可以在用户无需注销/登录的情况下完成吗?我记得对 xorg.conf 做了类似的事情,但那需要注销。

答案1

您可以尝试编写 udev 规则。插入键盘并输入lsusb并记下键盘 ID,它应该看起来像

Bus 001 Device 001: ID 13ab:001a name-of-the-keyboard

在这种情况下,13ab 是供应商 ID,001a 是产品 ID。您现在可以断开键盘连接。

转到/etc/udev/rules.d/并创建一个新文件,例如80-keyboard.rules并写入(将本例中的 idVendor 和 idProduct 替换为您的键盘的 id):

SUBSYSTEM=="input", ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="13ab", ATTRS{idProduct}=="001a", RUN+="/path/to/connect/script"
SUBSYSTEM=="input", ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{idVendor}=="13ab", ATTRS{idProduct}=="001a", RUN+="/path/to/disconnect/script"

你不能直接使用 udev 中的 setxkbmap,因为它没有设置必要的环境变量。这部分内容来自这个答案

连接脚本:

#!/bin/sh
/path/to/set-keyboard-layout.sh uk

断开连接脚本:

#!/bin/sh
/path/to/set-keyboard-layout.sh us

设置键盘布局.sh

#!/bin/sh
sleep 1
DISPLAY=":0.0"
HOME=/home/your-username
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
setxkbmap -layout $1

不要忘记对所有三个脚本执行 chmod +x,并将 /home/your-username 更改为您的主文件夹路径。

现在运行sudo service udev restart并插入键盘,看看连接/断开时布局是否发生变化。

我已经用我的 USB 硬盘测试过这一点并且它可以工作(除了我有一个块而不是子系统的输入)。

答案2

为了补充jeremija 的精彩回答,如果你设置了多个布局(例如使用 KDE 配置)并且想要保留手动切换的能力,请使用xkblayout-状态与此脚本结合:

#!/bin/sh
case $ACTION in
        add) id=1;;
        remove) id=0;;
esac
XAUTHORITY="/home/<username>/.Xauthority" DISPLAY=:0 xkblayout-state set $id

那么您只需要一个 udev 规则,它可以捕获所有操作:

SUBSYSTEM=="input", SUBSYSTEMS=="usb", ATTRS{idVendor}=="<idVendor>", ATTRS{idProduct}=="<idProduct>", RUN+="</path/to/script>"

请注意,xkblayout-state 需要位于 root-PATH 中,例如/usr/local/bin,因为 udev 规则以 root 身份运行。或者,您也可以指定其位置的完整路径。

相关内容