我经常将 USB 键盘插入我的笔记本电脑(除了外接显示器和鼠标,它们实际上将我的笔记本电脑转换为台式电脑),然后我更喜欢使用不同的键盘布局。
每次插入这个 USB 键盘时,我都必须手动更改当前键盘布局。
如果可能的话,我想采用自动化的方式来实现这一点。
拉杜的回答这里给出了一些线索,但似乎我需要一个启动脚本执行此任务是因为每次计算机启动时,我的 USB 键盘的设备 ID 都会改变。
该启动脚本可能首先包含命令xinput -list | grep "USB Keyboard"
,然后包含另一个命令来获取显示的第一个 USB 键盘 ID 号,然后在最后一个命令中使用它来设置我为该 USB 键盘选择的布局,如下所示:
setxkbmap -device <NUMBER> -layout <LAYOUT>
答案1
经过一番研究,我找到了一个解决方案,尽管我仍然愿意接受其他(可能更好的)答案。
这是一个启动脚本(可以添加到启动应用程序)将设置手动输入的usbkbd_layout变量韓國设备ID发现于xinput-列表:
#!/bin/bash
usbkbd=`xinput -list | grep -c "USB Keyboard"`
if [[ "$usbkbd" -gt 0 ]]
then
usbkbd_ids=`xinput -list | grep "USB Keyboard" | awk -F'=' '{print $2}' | cut -c 1-2`
usbkbd_layout="tr(f)"
for ID in $usbkbd_ids
do
setxkbmap -device "${ID}" -layout "${usbkbd_layout}"
done
fi
exit 0
这个脚本对于用户开始在桌面设置(带有外接键盘、鼠标和显示器等)上使用笔记本电脑的情况非常有用(而且更稳定),也可以在插入外部 USB 键盘时手动运行...
==========================================================================
更好的(几乎完美的)解决方案 - 感谢最小六足动物以及各自的贡献者线他在下面的评论中提到:
我现在只需插入我的 USB 键盘即可自动应用其不同的(TR-F)键盘布局,同时仍保留笔记本电脑上的默认键盘布局(TR-Q)!
以下是实现此目的的文件及其内容:
/etc/udev/rules.d/00-usb-keyboard.rules
ATTRS{idVendor}=="09da", ATTRS{idProduct}=="0260", OWNER="sadi"
ACTION=="add", RUN+="/home/sadi/.bin/usb-keyboard-in_udev"
ACTION=="remove", RUN+="/home/sadi/.bin/usb-keyboard-out_udev"
/home/sadi/.bin/usb-键盘-in_udev
#!/bin/bash
/home/sadi/.bin/usb-keyboard-in &
/home/sadi/.bin/usb-键盘
#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/sadi/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
usbkbd_id=`xinput -list | grep "USB Keyboard" | awk -F'=' '{print $2}' | cut -c 1-2 | head -1`
usbkbd_layout="tr(f)"
if [ "${usbkbd_id}" ]; then
gsettings set org.gnome.settings-daemon.plugins.keyboard active false
sleep 2
setxkbmap -device "${usbkbd_id}" -layout "${usbkbd_layout}"
fi
/home/sadi/.bin/usb-键盘-out_udev
#!/bin/bash
/home/sadi/.bin/usb-keyboard-out &
/home/sadi/.bin/usb-键盘-out
#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/sadi/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
gsettings set org.gnome.settings-daemon.plugins.keyboard active true
笔记:
- 当然,“bin”文件夹中的所有四个文件都应该具有必要的权限(可读和可执行),例如,可以使用终端命令来实现
chmod - 755 /home/sadi/.bin/usb-keyboard-*
- 有时插入 USB 键盘后,它仍使用相同(默认)的键盘布局,并在第二次尝试时切换到指定的布局(可能需要在某些地方多一点睡眠时间?)
- USB 键盘特定布局在登录屏幕(当您注销时)中无效。
- 如果你使用单独的分区/家那么将这四个脚本放在根分区的某个位置可能是一个更好的主意,例如在/usr/本地/bin并相应地修改所有相应文件的内容,因为有时 udev 可能会先查找这些文件,然后再/家分区已挂载并导致问题。
为了使此设置适应不同的要求:
- USB 键盘供应商和产品 ID 应根据命令的输出进行更改
lsusb
(例如,lsusb
我的 USB 键盘的输出如下Bus 001 Device 006: ID 09da:0260 A4 Tech Co., Ltd
:) - OWNER 和所有用户目录名称应从“sadi”更改为其他名称
- usbkbd_id 可能需要稍加调整才能获取正确的设备 ID(例如,命令的输出
xinput -list | grep "USB Keyboard"
给我两行;↳ USB Keyboard id=14 [slave keyboard (3)]
和↳ USB Keyboard id=16 [slave keyboard (3)]
;然后awk
使用“=”作为字段分隔符进行过滤并捕获第二部分;然后仅剪切前两位数字,然后仅使用第一行中的值) - usbkbd_layout 的值可以是任何其他有效选择
答案2
可以在 udev 规则中指定 X11 驱动程序选项,无需自定义脚本。例如,以下是我的/etc/udev/rules.d/99-usb-kbd.rules
ACTION=="add", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="2323", ENV{XKBMODEL}="pc104", ENV{XKBLAYOUT}="us", ENV{XKBVARIANT}="euro", ENV{XKBOPTIONS}="compose:caps"
此规则确保特定的 USB 键盘在 Xorg 中使用美国布局(我的笔记本电脑的内部键盘是德文,这也是我的主要布局)。要点:
- 您可以使用或
idVendor
查找您idProduct
的设备lsusb
evtest
- 您可以使用 中的任何布局
/usr/share/X11/xkb/symbols
。请注意指定有效布局和有效变体。 - 文件名必须以数字 >64 开头,以便设置覆盖指定的系统范围设置
/lib/udev/rules.d/64-xorg-xkb.rules
- 确保 Gnome/KDE 布局管理不会覆盖您的设置。
答案3
我刚刚针对 bépo Typematrix 键盘(优化的优秀 dvorak 的法语版本)和广泛的系统环境(假设您对机器具有 root 访问权限)改进了此解决方案。它只需要 3 个文件即可工作。如果出现故障,您可以查阅日志文件以找出故障原因。
/etc/udev/96-usb-keyboard.rules
ATTRS{idVendor}=="1e54", ATTRS{idProduct}=="2030", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/etc/udev/bepo-typematrix-kbd.sh in"
ATTRS{idVendor}=="1e54", ATTRS{idProduct}=="2030", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/etc/udev/bepo-typematrix-kbd.sh out"
/etc/udev/bepo-typematrix-kbd.sh(绝对有必要使用中间后台脚本)
#!/bin/bash
dir=$(dirname $0)
command=$(basename $0)
command=$dir/${command%\.sh}
arg=$1 # must be "in" or "out"
LOG=/var/log/bepo-typematrix-kbd.log
[ -x "$command" ] && $command $arg >$LOG 2>&1 &
/etc/udev/bepo-typematrix-kbd
#!/bin/bash
# jp dot ayanides at free.fr
MODEL="tm2030USB-102" # keyboard model
DISPLAY=':0.0'
GSETTING=/usr/bin/gsettings
XSET=/usr/bin/xset
SETXKBMAP=/usr/bin/setxkbmap
XINPUT=/usr/bin/xinput
USER=$(/usr/bin/who | /usr/bin/awk -v DIS=':0' '{if ($2==DIS) print $1}')
eval HOME=~$USER
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
case $1 in
'in')
BEPO=$($XINPUT list --short | grep "TypeMatrix.com USB Keyboard" | grep keyboard | sed -e 's/^.*id=\([0-9]\+\).*/\1/g')
if [ -n "$BEPO" ]; then
[ -x $GSETTING ] && $GSETTING set org.gnome.settings-daemon.plugins.keyboard active false
# apparently nothing to do with TDE (trinity KDE)
for ID in $BEPO; do # case of multiple bepo keyboard is taken into account
[ -x $SETXKBMAP ] && $SETXKBMAP -device $ID -model $MODEL -layout fr -variant bepo
done
fi
echo "bépo keyboard id(s) is (are) $BEPO"
[ -x $XSET ] && $XSET -display $DISPLAY r rate 250 40
;;
'out')
# apparently nothing to do with TDE (trinity KDE)
[ -x $GSETTING ] && $GSETTING set org.gnome.settings-daemon.plugins.keyboard active true
;;
*)
printf "wrong parameter: $1\n"
exit 1
;;
esac
答案4
我在使用 udev 执行脚本时遇到了一些权限问题。我使用 sudo 解决了以下问题:
# Estract id of MX3 keyboard devices that present themself as "123 COM Smart Control"
IDLIST=$(sudo -u max /usr/bin/xinput -list | grep "123 COM Smart Control" | grep keyboard | sed -e 's/^.*id=\([0-9]\+\).*/\1/g')
为每个设备设置键盘映射
for ID in $IDLIST; do
sudo -u max /usr/bin/setxkbmap -device $ID -layout "${kb_layout}" -display :0
done