Як назавжди призначити іншу розкладку клавіатури USB-клавіатурі?


16

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

Мені потрібно вручну змінювати поточну розкладку клавіатури щоразу, коли я підключаю цю USB-клавіатуру.

І я хотів би використовувати для цього автоматизований спосіб, якщо це можливо.

Відповідь Раду на питання тут дає деякі підказки, але, схоже, мені знадобиться сценарій запуску для цього завдання, оскільки ідентифікатор пристрою для моєї USB-клавіатури змінюється щоразу, коли комп'ютер запускається.

Цей сценарій запуску, ймовірно, спочатку включає в себе команду xinput -list | grep "USB Keyboard"та іншу команду, щоб схопити перший відображений ідентифікаційний номер клавіатури USB, а потім використати його в остаточній команді, щоб встановити вибраний макет для цієї клавіатури USB:

setxkbmap -device <NUMBER> -layout <LAYOUT>



1
@Sadi Ви маєте на увазі перевернути прапорців Ратгерса та США догори ногами після вбивства доктора Мартіна Лютера Кінга? Пол Робесон: Великий провісник від Freedomways на сторінці 182
гость271314

@ guest271314 Дякую велике! Але мені цікаво, як ви потрапили сюди, щоб прокоментувати це питання: history.stackexchange.com/questions/48704/… ;-) Це також ще одна розумна форма протесту, але я не думаю, що це з часом може перерости в історія з чуток, яку я пригадую.
Саді

@Sadi Ваше запитання було видалено в політиці.
гість271314

Відповіді:


15

Після невеликого дослідження я знайшов рішення, хоча я все ще відкритий для інших (можливо, кращих) відповідей.

Ось скрипт запуску (який може бути доданий до запуску додатків ) , який встановить maually увійшов usbkbd_layout змінну в usbkbd DEVICE 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

Примітки:

  1. Звичайно, всі чотири файли у вашій папці "bin" повинні мати необхідні дозволи (читабельні та виконувані), які, можливо, реалізовані, наприклад, за допомогою команди Terminal, наприклад chmod - 755 /home/sadi/.bin/usb-keyboard-*
  2. Іноді після підключення USB-клавіатури вона все-таки використовує таку ж (за замовчуванням) розкладку клавіатури і перемикається на вказаний макет після другої спроби (можливо, десь потрібно трохи більше часу сну?)
  3. Розмітка USB-клавіатури не є ефективною на екрані входу (при виході з системи).
  4. Якщо ви використовуєте окремий розділ для / home , то може бути кращою ідеєю помістити чотири сценарії кудись у кореневий розділ, наприклад / usr / local / bin та змінити вміст усіх відповідних файлів відповідно, як іноді удев може шукати ці файли до монтажу вашого / домашнього розділу та можуть викликати проблеми.

ДЛЯ ЗАЯВЛЕННЯ ЦЕЙ НАСТРОЙКИ ДЛЯ РІЗНИХ ВИМОГИ:

  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 може бути будь-який інший правильний вибір

Було б чудово, якби інший подібний сценарій міг автоматично запускатися щоразу, коли підключена USB-клавіатура, на що тут запитували (ще не відповіли): askubuntu.com/questions/284224/…
Саді,

2
Це може бути корисно, якщо ви можете опублікувати ще одну відповідь з цієї брудної теми: superuser.com/questions/249064/…
nano - злийте мене

1
@MinimusHeximus Дякую мільйон !!! Пройшовши нитку, яку ви вказали, і зробила кілька проб і помилок, я нарешті її розібрав і додам це нове (майже) ідеальне рішення гарячої підключення!
Саді

1
Моя клавіатура чомусь має два ідентифікатори, тому замість використання IFI довелося використовувати FOR. Це працює для мене зараз, дякую! gist.github.com/zvictor/193b567c14b5b6a679fe
zVictor

1
@Sadi Я сам звичайний користувач. Я опублікую тут своє рішення. Можливо, ви можете зняти з цього кілька ідей.
kleinfreund

9

Можна вказувати параметри драйвера X11 всередині правила udev, не потрібні спеціальні сценарії. Як приклад, ось вміст мого /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 не замінює ваші налаштування.

Відключіть та підключіть живлення від клавіатури та знайдіть /var/log/Xorg.0.logможливі проблеми. Ви також udevadm infoможете перевірити правильність застосування параметрів.
pavel

Еврика! Ваше розумне рішення почав працювати тільки після того, як я увійшов в цю команду (один раз для всіх) , щоб змінити поточні настройки Gconf: gsettings set org.gnome.settings-daemon.plugins.keyboard active false. Якщо додати таку записку, я буду намагатися , щоб відзначити твоє , як в відповідь (замість цього незграбний, довгий і звивистий шлях ;-)
Сааді

Це винятково. У Ubuntu 14.04 можливі моделі / макети / параметри / тощо. перераховані в/usr/share/X11/xkb/rules/evdev.lst
Джон

2
На жаль, це приємне та просте рішення перестало працювати для мене після оновлення до Ubuntu Gnome 17.04 :-(
Саді,

Спробував Linux Mint 18.2, який базується на Ubuntu 16.04 LTS, з udev версією 229-4ubuntu19 , знову немає ефекту :-( Будь-які ідеї щодо цієї дивної поведінки
Саді

2

Я тільки вдосконалив це рішення для клавіатури 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 &

/ і т.д. / 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

1

Після того, як я багато обернувся, я зараз бігаю. Можливо, я напишу повну статтю сортів і опублікую код у сховищі, якщо це буде цікаво.


Налаштуйте новий набір правил для udev таким чином:

 sudo gedit /etc/udev/rules.d/80-external-keyboard.rules

Правило повинно викликати скрипт оболонки щоразу, коли на пристрої із заданою комбінацією ідентифікатора постачальника та продукту відбувається певна дія.

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
Дякую, чудова робота! У мене це також працює. Однак чому я бачу 14 разів "Додати дію" та 3 рази "Іншу дію", коли я підключаю свою зовнішню команду, це таємниця, яку я спробую розв'язати пізніше. Але я виявив, що краще додати також ідентифікатор пристрою до команди setxkbmap, щоб внутрішня клавіатура все ще використовувалася, а також зовнішня клавіатура, як у моєму останньому сценарії автозавантаження. Я спробую це на пару днів, і повернусь і побачу, чи можна вважати вашу відповідь, можливо, з невеликою модифікацією тут і там ;-)
Саді

Також отримувати одні й ті ж записи, що входили в систему, кілька разів. Хороший улов на ідентифікатор пристрою в команді.
kleinfreund

@Sadi Також я думаю, що рядок gsettings set org.gnome.settings-daemon.plugins.keyboard active falseне працює за призначенням, як керує сценарієм root. У моїх тестах лінія не впливала на це налаштування.
kleinfreund

Я думаю, що в такому сценарії може бути гарною ідеєю виконати команду gsettings set org.gnome.settings-daemon.plugins.keyboard active falseяк користувач раз і назавжди, а потім використати цей скрипт без gsettings setкоманд ...
Саді

Поки я бачив, що ми все ще не можемо зробити цю справу безперебійною; час від часу розкладку клавіатури не реалізовує udev, і вам доведеться відключити і підключити знову. Думаю, я знову на деякий час повернуться до свого (оновленого) сценарію запуску у верхній частині своєї відповіді, який служить мені більш гладко - лише я повинен запускати його вручну, якщо після запуску підключую зовнішню клавіатуру. Здається, удев трохи баггі, як це також можна побачити у такій кількості повторів дій (він багато разів виконує сценарій обгортки, і дивним чином) ...
Саді,

1

У мене виникли деякі проблеми з дозволом зі сценарієм, виконаним udev. Я вирішив із судо так:

# 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

Ви також можете визначити його у конфігураційному файлі Xorg.

Він розміщений у цій відповіді на зміну стек: /superuser//a/946575/437492


Це було б чудово, якби я міг змусити його працювати. Але, використовуючи останню версію LTS, Ubuntu 18.04, я бачу лише /usr/share/X11/xorg.conf.d/ каталог, який містить файл з назвою 40-libinput.conf . Тому я просто додав у цей файл розділ для зовнішньої клавіатури. Використовуючи libinput або evdev драйвера та довше і коротше ім’я постачальника, я не зміг отримати жодного результату. Будь-які ідеї?
Саді

@Sadi: Якщо ви трохи прочитаєте про конфігурацію Xorg, ви зрозумієте, що ви можете просто додати нові файли /etc/X11/xorg.conf.d/(це саме місце).
Golar Ramblar

Спасибі. Я, звичайно, читав зовсім небагато і спробував спочатку використовувати "/etc/X11/xorg.conf.d/30-keyboard.conf". Я спробую свою удачу під вищезазначеною відповіддю на зміну стакерів. ;-)
Саді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.