为每个设备设置键盘映射

为每个设备设置键盘映射

我经常将 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

笔记:

  1. 当然,“bin”文件夹中的所有四个文件都应该具有必要的权限(可读和可执行),例如,可以使用终端命令来实现 chmod - 755 /home/sadi/.bin/usb-keyboard-*
  2. 有时插入 USB 键盘后,它仍使用相同(默认)的键盘布局,并在第二次尝试时切换到指定的布局(可能需要在某些地方多一点睡眠时间?)
  3. USB 键盘特定布局在登录屏幕(当您注销时)中无效。
  4. 如果你使用单独的分区/家那么将这四个脚本放在根分区的某个位置可能是一个更好的主意,例如在/usr/本地/bin并相应地修改所有相应文件的内容,因为有时 udev 可能会先查找这些文件,然后再/家分区已挂载并导致问题。

为了使此设置适应不同的要求:

  1. USB 键盘供应商和产品 ID 应根据命令的输出进行更改lsusb(例如,lsusb我的 USB 键盘的输出如下Bus 001 Device 006: ID 09da:0260 A4 Tech Co., Ltd:)
  2. OWNER 和所有用户目录名称应从“sadi”更改为其他名称
  3. usbkbd_id 可能需要稍加调整才能获取正确的设备 ID(例如,命令的输出xinput -list | grep "USB Keyboard"给我两行;↳ USB Keyboard id=14 [slave keyboard (3)]↳ USB Keyboard id=16 [slave keyboard (3)];然后awk使用“=”作为字段分隔符进行过滤并捕获第二部分;然后仅剪切前两位数字,然后仅使用第一行中的值)
  4. 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 中使用美国布局(我的笔记本电脑的内部键盘是德文,这也是我的主要布局)。要点:

  1. 您可以使用或idVendor查找您idProduct的设备lsusbevtest
  2. 您可以使用 中的任何布局/usr/share/X11/xkb/symbols。请注意指定有效布局和有效变体。
  3. 文件名必须以数字 >64 开头,以便设置覆盖指定的系统范围设置/lib/udev/rules.d/64-xorg-xkb.rules
  4. 确保 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

相关内容