Я часто подключаю USB-клавиатуру к своему ноутбуку (в дополнение к внешнему монитору и мыши, которые практически превращают мой ноутбук в настольный компьютер), и я предпочитаю использовать другую раскладку клавиатуры.
Мне приходится вручную менять текущую раскладку клавиатуры каждый раз, когда я подключаю эту USB-клавиатуру.
И я хотел бы использовать автоматизированный способ для этого, если это возможно.
Ответ Radu на вопрос здесь дает некоторые подсказки, но, похоже, мне понадобится стартовый скрипт для этой задачи в качестве идентификатора устройства моя клавиатура USB меняется каждый раз при запуске компьютера.
Этот сценарий запуска, вероятно, сначала будет включать команду xinput -list | grep "USB Keyboard"
и другую команду для захвата первого отображаемого идентификационного номера USB-клавиатуры, а затем использовать его в последней команде для установки выбранного макета для этой клавиатуры USB, как показано ниже: ]
setxkbmap -device <NUMBER> -layout <LAYOUT>
После небольшого исследования я нашел решение, хотя я все еще открыт для другого (вероятно, лучше) ответы.
Вот сценарий запуска (который может быть добавлен для Запущения Приложений), который установит maually вводимую usbkbd_layout переменную на usbkbd идентификаторы устройства, найденные в 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 включается...
==========================================================================
ЛУЧШЕ (почти прекрасный) РЕШЕНИЕ - найденный благодаря 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"
/home/sadi/.bin/usb-keyboard-in_udev
#!/bin/bash
/home/sadi/.bin/usb-keyboard-in &
/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
/home/sadi/.bin/usb-keyboard-out_udev
#!/bin/bash
/home/sadi/.bin/usb-keyboard-out &
/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
Примечания:
chmod - 755 /home/sadi/.bin/usb-keyboard-*
ДЛЯ АДАПТАЦИИ ЭТОЙ УСТАНОВКИ К РАЗЛИЧНЫМ ТРЕБОВАНИЯМ:
lsusb
(Например, мой lsusb
вывод имеет это для моей Клавиатуры USB: Bus 001 Device 006: ID 09da:0260 A4 Tech Co., Ltd
) xinput -list | grep "USB Keyboard"
дает мне две строки; ↳ USB Keyboard id=14 [slave keyboard (3)]
и ↳ USB Keyboard id=16 [slave keyboard (3)]
; которые затем фильтрованы awk
использование "=" как разделитель полей и получение второй части; затем сокращая только первые две цифры, и затем с помощью только значение в первой строке) В правиле 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
. Обратите внимание, чтобы указать как верный макет, так и верный вариант. /lib/udev/rules.d/64-xorg-xkb.rules
Я только что улучшил это решение для bépo клавиатуры Typematrix (французская версия оптимизированного превосходного Дворака) и в широком системном контексте (это предполагает, что у Вас есть корневой доступ к машине). Требуется только 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
У меня была проблема с разрешением сценария, выполненного 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
После того, как я много поигрался, это то, что я бегу сейчас. Может быть, я напишу полную статью своего рода и опубликую код в репозитории, если это будет интересно.
Установите новый набор правил для udev следующим образом:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
Правило должно вызывать скрипт оболочки всякий раз, когда какое-либо действие запускается устройством с данной комбинацией поставщика и ID продукта.
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
После добавления нового набора правил перезапустите службу udev:
sudo service udev restart
Примечание. Мне не удалось добиться надежных результатов, предоставив более конкретные правила сопоставления в этом файле. Самое важное, что добавление правила соответствия ACTION
не сработало. Насколько я могу судить, сценарий был запущен в любом случае. При добавлении ACTION=="add"
скрипт будет по-прежнему вызываться после удаления устройства. Очень странно и запутанно.
Однако действие, которое вызвало правило udev, будет доступно вызываемому сценарию, как показано ниже.
Далее сам скрипт. Ну, не совсем. Обратите внимание на суффикс wrapper
в имени файла. Это указывает на то, что это не настоящий скрипт, а оболочка, которая вызывает скрипт и выполняет его в фоновом режиме, чтобы udev мог завершить свой процесс.
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
Переменная ACTION
содержит действие udev, которое было запущено устройством. Это дает значения как add
(устройство было подключено) и remove
(устройство было удалено). Мы будем использовать их позже.
~/.bin/switch-kb-layout.sh
:
#!/bin/sh
sleep 1
# Some environment variables that need to be set in order to run `setxkbmap`
DISPLAY=":0.0"
HOME=/home/phil
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
udev_action=$1
log_file="$HOME/switch-kb-layout.log"
if [ "${udev_action}" != "add" ] && [ "${udev_action}" != "remove" ]; then
echo "Other action. Aborting." >> $log_file
exit 1
fi
internal_kb_layout="de"
internal_kb_variant=""
external_kb_layout="us"
external_kb_variant="altgr-intl"
kb_layout=""
kb_variant=""
if [ "${udev_action}" = "add" ]; then
kb_layout=$external_kb_layout
kb_variant=$external_kb_variant
elif [ "${udev_action}" = "remove" ]; then
kb_layout=$internal_kb_layout
kb_variant=$internal_kb_variant
fi
setxkbmap -layout "${kb_layout}"
echo "set layout:" "$kb_layout" >> $log_file
if [ ! -z "${kb_variant}" ]; then
setxkbmap -variant "${kb_variant}"
echo "set variant:" "$kb_variant" >> $log_file
fi
Заменить мое имя пользователя на ваше при установке переменной HOME
(здесь $(whoami)
работать не будет, так как она не будет вызываться вашим пользователем, но root
).
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
Для целей тестирования я добавил несколько строк, которые записывают определенные события в файл в моем домашнем каталоге, чтобы посмотреть, все ли работает. Вы можете безопасно удалить их.
Наконец, эти сценарии должны иметь разрешения на выполнение. Также может быть важно отметить, что эти сценарии будут вызываться пользователем root
, поэтому будьте осторожны с тем, что вы там делаете.
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh
Можно также определить его в файле конфигурации Xorg.
Это размечается в этом ответе stackexchange: https://superuser.com/a/946575/437492