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

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

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

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

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

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

setxkbmap -device -layout

16
задан 13.04.2017, 15:23

5 ответов

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

Вот стартовый скрипт (который можно добавить в Startup Applications ), который установит введенную вручную переменную usbkbd_layout в usbkbd ] устройство id найдено в xinput -list :

#!/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

Примечания:

[1128 ]
  • Конечно, все четыре файла в вашей папке «bin» должны иметь Все права доступа (читаемые и исполняемые), которые могут быть реализованы, например, с помощью команды терминала, например chmod - 755 /home/sadi/.bin/usb-keyboard-*
  • Иногда после подключения USB-клавиатуры она все еще использует ту же (по умолчанию) раскладку клавиатуры и переключается на указанную раскладку при второй попытке (возможно, требуется немного больше времени для сна?)
  • Специфичная раскладка USB-клавиатуры не действует на экране входа в систему (при входе в систему Выход). [тысяча сто двадцать два]
  • Если вы используете отдельный раздел для / home , то может быть лучше поместить четыре сценария где-нибудь в корневой раздел, например, / usr / local / bin и соответствующим образом измените содержимое всех соответствующих файлов, так как иногда udev может искать эти файлы до того, как ваш раздел / home смонтирован и вызывает проблемы.
    1. Для того, чтобы адаптировать эту настройку к различным требованиям:

      1. Идентификаторы производителя и продукта клавиатуры USB следует изменить в соответствии с выходными данными команды lsusb (Например, мой вывод lsusb имеет это для моей клавиатуры USB: Bus 001 Device 006: ID 09da:0260 A4 Tech Co., Ltd)
      2. ВЛАДЕЛЕЦ, и все имена каталогов пользователей должны быть изменены с «sadi» на другое имя
      3. [1126 ] 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
    ответ дан 10.10.2019, 12:59

    В правиле 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]
    9
    ответ дан 10.10.2019, 12:59
    • 1
      Отключите и повторно включите свою клавиатуру и взгляд в /var/log/Xorg.0.log для возможных проблем. Можно также использовать udevadm info, чтобы проверить, что настройки применяются правильно. –  10.08.2016, 01:28
    • 2
      Эврика! Ваше умное решение начало работать только после того, как я ввел эту команду (раз и навсегда) для переопределения текущей установки gconf: gsettings set org.gnome.settings-daemon.plugins.keyboard active false. Если Вы также добавляете такое примечание, I' ll пытаются отметить Ваш как ответ (вместо той неуклюжей, длинной и извилистой дороги;-) – nurxyz 13.08.2016, 11:13
    • 3
      Это исключительно. На Ubuntu 14.04 возможные модели/разметки/опции/и т.д. перечислены в /usr/share/X11/xkb/rules/evdev.lst – Prajwal S Prakash 21.09.2016, 13:20
    • 4
      К сожалению, это хорошее и легкое решение прекратило работать на меня после обновления до Ubuntu Gnome 17.04:-( – Bartłomiej Semańczyk 14.04.2017, 12:04
    • 5
      Испытанный Linux Mint 18.2, который основан на Ubuntu 16.04 LTS, с udev версия, 229-4ubuntu19 , никакой эффект снова:-( Какие-либо идеи об этом нечетном udev поведении??? – Nubaslon 25.07.2017, 11:55

    У меня была проблема с разрешением сценария, выполненного 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
    
    1
    ответ дан 10.10.2019, 12:59
    • 1
      Я думаю, что может быть более полезно, если можно записать его полностью. Например, где Вы поместили строки выше? – JoshSGman 07.06.2018, 14:34

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


    Установите новый набор правил для 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 
    
    1
    ответ дан 10.10.2019, 12:59
    • 1
      Спасибо, большая работа! I' ve получил его работающий также. Однако, почему я вижу 14 раз " Добавьте action" и 3 раза " Другой action" когда я плагин моя внешняя команда являюсь тайной, который I' ll пытаются решить позже. Но I' ve нашел это it' s лучше для добавления также идентификатора устройства к setxkbmap управляют так, чтобы внутренняя клавиатура была все еще применима, а также внешняя клавиатура, как в моем последнем сценарии автозапуска. I' ll дают этому попытку в течение нескольких дней, и возвращаются и видят, если Ваш может рассматриваться как ответ, возможно, с небольшой модификацией тут и там;-) – Shaun 23.07.2017, 23:43
    • 2
      Также получая те же зарегистрированные строки многократно. Хорошая выгода на идентификаторе устройства на команде. – TonyTakeshi 24.07.2017, 01:17
    • 3
      @Sadi Также, я думаю строка gsettings set org.gnome.settings-daemon.plugins.keyboard active false работа doesn’t, как предназначено как сценарий, выполняется root. В моих тестах строка didn’t имеет эффект на ту установку. – kelin 24.07.2017, 09:18
    • 4
      Я думаю в таком сценарии, это могла бы быть хорошая идея выполнить команду gsettings set org.gnome.settings-daemon.plugins.keyboard active false как пользователя раз и навсегда, и затем использовать этот сценарий без gsettings set команды... – Community 24.07.2017, 12:20
    • 5
      До сих пор I' ve, замеченный, что мы все еще не можем получить эту вещь, работающую гладко; время от времени раскладка клавиатуры не реализуется udev, и необходимо включиться прочь и включить снова. Я думаю I' ll возвращаются к моему (обновленному) сценарию запуска наверху моего ответа снова в течение некоторого времени, который служит мне более гладко - только я должен выполнить его вручную, если я включаю свою внешнюю клавиатуру после запуска. Кажется, что udev является небольшим багги, как может также быть замечен в таком количестве повторений действия (это выполняет сценарий обертки много раз, и странными способами)... – Mago Nicolas Palacios 24.07.2017, 22:03

    Я только что улучшил это решение для клавиатуры bépo Typematrix (французская версия оптимизированного превосходного дворака) и в широком системном контексте (предполагается, что у вас есть 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 [111])
    command=$(basename [111])
    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
    ответ дан 10.10.2019, 12:59

    Теги

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