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

Обычно VIM работает в режиме совместимости VI по умолчанию.

Попробуйте переключить режимы и посмотрите, работают ли команды. Используйте это, чтобы посмотреть, в каком режиме вы находитесь:

:set compatible?

Затем

:set compatible

или

:set nocompatible 

переключиться в другой режим и дать

Добавление

set nocompatible

или

set compatible

в файл с именем .vimrc в вашем домашнем каталоге сделает настройку по умолчанию для vim.

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

3 ответа

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

Вот сценарий запуска (который можно добавить в приложения для запуска), который установит измененную переменную usbkbd_layout в usbkbd_layout на идентификаторы устройств usbkbd, найденные в 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 подключается ...

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

сценарий запуска

Теперь я могу просто подключить свою USB-клавиатуру и автоматически использовать ее ( TR-F), при сохранении раскладки клавиатуры по умолчанию (TR-Q) на моем ноутбуке!

Вот файлы и их содержимое, которые делают это возможным:

/ etc / udev / rules.d / 00-usb-keyboard.rules

[f 2]

/etc/udev/rules.d/00-usb-keyboard.rules

#!/bin/bash
/home/sadi/.bin/usb-keyboard-in &

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

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

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

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

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

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

Конечно, все четыре файла в вашей папке «bin» должны иметь необходимые разрешения (читаемые и исполняемые) который может быть реализован, например, с помощью команды Terminal, такой как chmod - 755 /home/sadi/.bin/usb-keyboard-* OWNER, и все имена пользовательских каталогов должны быть изменены с «sadi» на другое имя . Иногда после подключения USB-клавиатуры он все еще использует то же самое ( default) раскладка клавиатуры и переключается на указанный макет во второй попытке (возможно, где-то требуется немного больше времени сна). Значение для usbkbd_layout может быть любым другим допустимым выбором
11
ответ дан 24 May 2018 в 18:41
  • 1
    Было бы здорово, если бы другой похожий скрипт мог автоматически запускаться всякий раз, когда клавиатура USB подключена, как было предложено (еще не ответили): askubuntu.com/questions/284224/… – Sadi 27 August 2013 в 12:30
  • 2
    Это может быть полезно, если вы можете опубликовать еще один ответ из этого беспорядочного потока: superuser.com/questions/249064/… – user126106 30 August 2013 в 09:00
  • 3
    @MinimusHeximus Спасибо миллион! Пройдя через поток, который вы указали, и сделав пробную ошибку, я, наконец, разобрался и добавлю это новое (почти) идеальное решение для горячего подключения выше! – Sadi 20 September 2013 в 17:58
  • 4
    У моей клавиатуры по какой-то причине есть два идентификатора, поэтому вместо использования IF мне пришлось использовать FOR. Это работает для меня сейчас, спасибо! gist.github.com/zvictor/193b567c14b5b6a679fe – zVictor 9 July 2014 в 13:26
  • 5
    @Sadi Я просто обычный пользователь. Я отправлю свое решение здесь. Возможно, вы можете отказаться от некоторых идей. – kleinfreund 23 July 2017 в 16:58

Я только что улучшил это решение для клавиатуры 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/96-usb-keyboard.rules (абсолютно необходимо использовать промежуточный сценарий фонового рисунка)

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

2
ответ дан 24 May 2018 в 18:41

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

Настроить новый набор правил для 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/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
ответ дан 24 May 2018 в 18:41
  • 1
    Спасибо, отличная работа! У меня это тоже работает. Однако, почему я вижу 14 раз «Добавить действие», и 3 раза "Другое действие" когда я подключаю внешнюю команду, это тайна, которую я попытаюсь решить позже. Но я обнаружил, что лучше добавить идентификатор устройства в команду setxkbmap, чтобы внутренняя клавиатура по-прежнему использовалась, а также внешняя клавиатура, как в моем последнем сценарии автозапуска. Я попробую пару дней и вернусь и посмотрю, можно ли считать ваш ответ «Ответ», возможно, с небольшим изменением здесь и там ;-) – Sadi 23 July 2017 в 23:43
  • 2
    Также, получая одни и те же протоколируемые строки несколько раз. Хорошая привязка к идентификатору устройства в команде. – kleinfreund 24 July 2017 в 01:17
  • 3
    @Sadi Также я думаю, что строка gsettings set org.gnome.settings-daemon.plugins.keyboard active false не работает так, как предполагалось, поскольку скрипт запускается root. В моих тестах линия не влияла на эту настройку. – kleinfreund 24 July 2017 в 09:18
  • 4
    Я думаю, что в таком сценарии может быть хорошей идеей выполнить команду gsettings set org.gnome.settings-daemon.plugins.keyboard active false как пользователь раз и навсегда, а затем использовать этот скрипт без команд gsettings set ... – Sadi 24 July 2017 в 12:20
  • 5
    До сих пор я видел, что мы все еще не можем заставить эту работу работать гладко; время от времени раскладка клавиатуры не реализуется udev, и вам нужно снова подключить и подключить. Я думаю, что я вернусь к моему (обновленному) сценарию запуска в верхней части моего ответа снова в течение некоторого времени, который будет работать мне более плавно - только я должен запустить его вручную, если я подключу внешнюю клавиатуру после запуска. Кажется, udev немного глючит, что также можно увидеть во многих повторениях действий (он запускает сценарий оболочки много раз и по-странным) ... – Sadi 24 July 2017 в 22:03

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

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