Как навсегда назначить другую раскладку клавиатуры для клавиатуры USB?

Я часто подключаю USB-клавиатуру к своему ноутбуку (в дополнение к внешнему монитору и мыши, которые практически превращают мой ноутбук в настольный компьютер), и я предпочитаю использовать другую раскладку клавиатуры.

Мне приходится вручную менять текущую раскладку клавиатуры каждый раз, когда я подключаю эту USB-клавиатуру.

И я хотел бы использовать автоматизированный способ для этого, если это возможно.

Ответ Radu на вопрос здесь дает некоторые подсказки, но, похоже, мне понадобится стартовый скрипт для этой задачи в качестве идентификатора устройства моя клавиатура USB меняется каждый раз при запуске компьютера.

Этот сценарий запуска, вероятно, сначала будет включать команду xinput -list | grep "USB Keyboard" и другую команду для захвата первого отображаемого идентификационного номера USB-клавиатуры, а затем использовать его в последней команде для установки выбранного макета для этой клавиатуры USB, как показано ниже: ]

setxkbmap -device <NUMBER> -layout <LAYOUT>

16
задан 13 April 2017 в 15:23

6 ответов

После небольшого исследования я нашел решение, хотя я все еще открыт для другого (вероятно, лучше) ответы.

Вот сценарий запуска (который может быть добавлен для Запущения Приложений), который установит 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

Примечания:

  1. Конечно, все эти четыре файла в Вашем. папка "мусорного ведра" должна иметь необходимые полномочия (читаемый и исполняемый), который, возможно, реализовал, например, с командой Terminal как chmod - 755 /home/sadi/.bin/usb-keyboard-*
  2. Иногда после того, как клавиатура USB включается в нем, все еще использует ту же раскладку клавиатуры (по умолчанию) и переключается на указанное расположение после второй попытки (возможно, требующий немного большего количества времени сна где-нибудь?)
  3. Определенное расположение клавиатуры USB не является эффективным при экране входа в систему (когда Вы Выходите из системы).
  4. Если Вы используете отдельный раздел для / домой, то это могла бы быть лучшая идея поместить эти четыре сценария где-нибудь в корневой раздел, например,/usr/local/bin и изменить содержание всех соответствующих файлов соответственно, поскольку иногда udev может искать те файлы перед Вашим/, домашний раздел смонтирован и проблемы причины.

ДЛЯ АДАПТАЦИИ ЭТОЙ УСТАНОВКИ К РАЗЛИЧНЫМ ТРЕБОВАНИЯМ:

  1. Поставщик клавиатуры USB и идентификаторы продукта должны быть изменены согласно выводу команды lsusb (Например, мой lsusb вывод имеет это для моей Клавиатуры USB: Bus 001 Device 006: ID 09da:0260 A4 Tech Co., Ltd)
  2. ВЛАДЕЛЕЦ и все пользовательские имена каталогов должны быть изменены от "sadi" до другого имени
  3. usbkbd_id может потребовать, чтобы немного корректировки захватило идентификатор правильного устройства (Например, вывод команд xinput -list | grep "USB Keyboard" дает мне две строки; ↳ USB Keyboard id=14 [slave keyboard (3)] и ↳ USB Keyboard id=16 [slave keyboard (3)]; которые затем фильтрованы awk использование "=" как разделитель полей и получение второй части; затем сокращая только первые две цифры, и затем с помощью только значение в первой строке)
  4. Значение для usbkbd_layout может быть любым другим допустимым выбором
15
ответ дан 13 April 2017 в 15:23

В правиле 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 своего устройства, используя lsusb или evtest
  2. . Вы можете использовать любой макет из /usr/share/X11/xkb/symbols. Обратите внимание, чтобы указать как верный макет, так и верный вариант.
  3. Имя файла должно начинаться с цифры> 64, чтобы настройки перезаписывали общесистемные настройки, указанные в /lib/udev/rules.d/64-xorg-xkb.rules
  4. Убедитесь, что управление компоновкой Gnome / KDE не перезаписывает ваши настройки. [ 1110]
0
ответ дан 13 April 2017 в 15:23

Я только что улучшил это решение для 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
2
ответ дан 13 April 2017 в 15:23

У меня была проблема с разрешением сценария, выполненного 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
0
ответ дан 13 April 2017 в 15:23

После того, как я много поигрался, это то, что я бегу сейчас. Может быть, я напишу полную статью своего рода и опубликую код в репозитории, если это будет интересно.


Установите новый набор правил для 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 
0
ответ дан 13 April 2017 в 15:23

Можно также определить его в файле конфигурации Xorg.

Это размечается в этом ответе stackexchange: https://superuser.com/a/946575/437492

0
ответ дан 10 October 2019 в 12:59

Другие вопросы по тегам:

Похожие вопросы: