如何为 USB 键盘永久分配不同的键盘布局?

Sad*_*adi 23 keyboard keyboard-layout usb

我经常将 USB 键盘插入我的笔记本电脑(除了外接显示器和鼠标,它们都可以将我的笔记本电脑虚拟地转换为台式电脑),那时我更喜欢使用不同的键盘布局。

每次插入此 USB 键盘时,我都必须手动更改当前键盘布局。

如果可能的话,我想为此使用自动化的方式。

Radu这里问题的回答提供了一些线索,但似乎我需要一个启动脚本来执行此任务,因为每次计算机启动时我的 USB 键盘的设备 ID 都会更改。

这个启动脚本可能会首先包含命令xinput -list | grep "USB Keyboard"和另一个命令来获取显示的第一个 USB 键盘 ID 号,然后在最终命令中使用它来设置我为该 USB 键盘选择的布局,如下所示:

setxkbmap -device <NUMBER> -layout <LAYOUT>

Sad*_*adi 16

经过一些研究,我找到了一个解决方案,尽管我仍然愿意接受其他(可能更好)的答案。

这是一个启动脚本(可以添加到Startup Applications),它将手动输入的usbkbd_layout变量设置为在xinput -list 中找到的usbkbd设备ID

#!/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
Run Code Online (Sandbox Code Playgroud)

对于用户开始在台式机设置上使用笔记本电脑(使用外部键盘、鼠标和显示器等)的场景,此脚本非常有用(并且更稳定),并且也可以在插入外部 USB 键盘时手动运行...

================================================== ========================

更好(几乎完美)的解决方案 - 感谢MinimusHeximus和他在下面的评论中提到的线程的相应贡献者:

我现在可以插入我的 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"
Run Code Online (Sandbox Code Playgroud)

/home/sadi/.bin/usb-keyboard-in_udev

#!/bin/bash
/home/sadi/.bin/usb-keyboard-in &
Run Code Online (Sandbox Code Playgroud)

/home/sadi/.bin/usb-keyboard-in

#!/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
Run Code Online (Sandbox Code Playgroud)

/home/sadi/.bin/usb-keyboard-out_udev

#!/bin/bash
/home/sadi/.bin/usb-keyboard-out &
Run Code Online (Sandbox Code Playgroud)

/home/sadi/.bin/usb-keyboard-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
Run Code Online (Sandbox Code Playgroud)

笔记:

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

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

  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 的值可以是任何其他有效选择

  • 如果在插入 USB 键盘时可以自动运行另一个类似的脚本,那就太好了,如此处所问(尚未回答):http://askubuntu.com/questions/284224/autorun-a-script-after-i-插入或拔出 USB 设备 (2认同)
  • 如果您可以从这个凌乱的线程中发布另一个答案,这可能会有所帮助:http://superuser.com/questions/249064/udev-rule-to-auto-load-keyboard-layout-when-usb-keyboard-plugged-在 (2认同)

pav*_*vel 12

可以在 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"
Run Code Online (Sandbox Code Playgroud)

此规则确保特定的 USB 键盘在 Xorg 中使用美国布局(我的笔记本电脑的内部键盘是德语,这也是我的主要布局)。要点:

  1. 你可以找到idVendoridProduct使用您的设备lsusbevtest
  2. 您可以使用/usr/share/X11/xkb/symbols. 注意指定有效的布局和有效的变体。
  3. 文件名必须以大于 64 的数字开头,以便设置覆盖在 /lib/udev/rules.d/64-xorg-xkb.rules
  4. 确保 Gnome/KDE 布局管理不会覆盖您的设置。

  • 不幸的是,这个简单易用的解决方案在升级到 ***Ubuntu Gnome 17.04* 后 ** 停止工作** :-(** (2认同)