USBキーボードに異なるキーボードレイアウトを永続的に割り当てる方法


16

USBキーボードをラップトップにプラグインすることがよくあり(外部モニタとマウスに加えて、ラップトップをデスクトップコンピュータに仮想的に変換します)、その場合は別のキーボードレイアウトを使用することを好みます。

このUSBキーボードをプラグインするたびに、現在のキーボードレイアウトを手動で変更する必要があります。

そして、可能であれば自動化された方法を使用したいと思います。

ここでの質問に対するRaduの答えはいくつかの手がかりを与えますが、USBキーボードのデバイスIDはコンピューターが起動するたびに変化するため、このタスクの起動スクリプトが必要になるようです。

この起動スクリプトには、おそらく最初にcommandが含まれ、最初にxinput -list | grep "USB Keyboard"表示される最初のUSBキーボードID番号を取得する別のコマンドが含まれ、それを最終コマンドで使用して、そのUSBキーボードの選択したレイアウトを以下のように設定します。

setxkbmap -device <NUMBER> -layout <LAYOUT>



1
@サディマーティン・ルーサー・キング博士の暗殺に続いて、ラトガーズとアメリカの国旗を逆さまにすることについて言及していますか?ポール・ロブソン:フリーダムウェイズの偉大な先駆者 182ページ
-guest271314

@ guest271314ありがとうございます!:しかし、私はこの質問へのコメントに、ここで終わって来るか疑問history.stackexchange.com/questions/48704/... ;-)これは抗議の別のスマートな形でもあるが、私はこれが最終的に発展することができるとは思いません私が思い出す伝聞物語。
サディ

@Sadi Politicsで質問が削除されました。
guest271314

回答:


15

少し調査した結果、解決策が見つかりましたが、他の(おそらくより良い)答えにはまだ心を開いています。

ここだスタートアップスクリプト(に追加することができスタートアップアプリケーション maually入力された設定されます)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-Q)を維持したまま、自動的に異なる(TR-F)キーボードレイアウトを適用できます!

これを可能にするファイルとその内容は次のとおりです。

/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"フォルダー内の4つのファイルすべてに必要なアクセス許可(読み取り可能および実行可能)が必要です。これは、たとえば、 chmod - 755 /home/sadi/.bin/usb-keyboard-*
  2. USBキーボードを接続した後でも、同じ(デフォルトの)キーボードレイアウトが使用され、2回目の試行で指定されたレイアウトに切り替えられる場合があります(おそらくもう少しスリープ時間が必要ですか?)
  3. USBキーボード固有のレイアウトは、ログイン画面(ログアウト時)では無効です。
  4. / homeに別のパーティションを使用する場合は、ルートパーティションのどこかに4つのスクリプト(たとえば、/ usr / local / bin)を置き、udevが検索する可能性があるため、それぞれのファイルの内容を適宜変更することをお勧めします/ homeパーティションがマウントされる前にこれらのファイルを使用すると、問題が発生します。

このセットアップをさまざまな要件に適応させるには:

  1. USBキーボードのベンダーと製品IDは、コマンドの出力ごとに変更する必要がありますlsusb(たとえば、私のlsusb出力は私のUSBキーボードのためにこれを持っています。Bus 001 Device 006: ID 09da:0260 A4 Tech Co., Ltd
  2. OWNERおよびすべてのユーザーディレクトリ名を「sadi」から別の名前に変更する必要があります
  3. usbkbd_idは、正しいデバイスIDを取得するために少し調整する必要がある場合があります(たとえば、コマンドの出力にxinput -list | grep "USB Keyboard"2行が表示されます; ↳ USB Keyboard id=14 [slave keyboard (3)]そして↳ USB Keyboard id=16 [slave keyboard (3)]awkフィールド区切り文字として「=」を使用し、2番目の部分をキャプチャすることでフィルタリングされます。最初の2桁、次に最初の行の値のみを使用)
  4. usbkbd_layoutの値は、他の有効な選択肢である可能性があります

ここで尋ねられたように(まだ回答されていません)、askubuntu.com
Sadi

2
この厄介なスレッドから別の回答を投稿できると便利です:superuser.com/questions/249064/…–
user126106

1
@MinimusHeximusありがとうございます!!! あなたが指摘したスレッドを通過し、試行錯誤を行った後、私は最終的にそれを整理し、上記の新しい(ほぼ)完全なホットプラグソリューションを追加します!
サディ

1
何らかの理由でキーボードに2つのIDがあるため、を使用する代わりにを使用するIF必要がありましたFOR。今はうまくいきます、ありがとう!gist.github.com/zvictor/193b567c14b5b6a679fe
zVictor 14

1
@Sadi私は単なる平均的なユーザーです。ソリューションをここに投稿します。たぶんあなたはそれからいくつかのアイデアを取ることができます。
kleinfreund

9

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のUSレイアウトを使用することを保証します(私のラップトップの内部キーボードはドイツ語であり、これも私の主要なレイアウトです)。重要なポイント:

  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して、設定が正しく適用されていることを確認することもできます。
パベル

ユーレカ!現在の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にアップグレードした後、この素晴らしく簡単なソリューションは機能なくなりました:
Sadi

Ubuntuの16.04 LTSに基づいているLinuxのミント18.2を、試してみましたudevのバージョン229-4ubuntu19、再び何も影響しない:-( ???この奇妙なudevの行動についての任意のアイデア
サディ

2

このソリューションを、bépoTypematrixキーボード(最適化された優れたdvorakのフランス語版)および幅広いシステムコンテキスト(マシンへのルートアクセスがあると仮定)で改善しました。動作するのに必要なファイルは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

1

多くのことをいじった後、これは私が今実行しているものです。興味のある場合は、完全な種類の記事を書いて、リポジトリ内でコードを公開するかもしれません。


次のような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
ありがとう、すばらしい仕事です!私もそれが機能している。ただし、外部コマンドをプラグインするときに14回の「アクションの追加」と3回の「その他のアクション」が表示されるのは謎であり、後で解決しようとします。しかし、最新の自動起動スクリプトのように、内部キーボードと外部キーボードを引き続き使用できるように、デバイスIDもsetxkbmapコマンドに追加する方がよいことがわかりました。私はこの数日のカップルのために試してみると、ここで少し修正して、おそらく、戻ってきて、あなたが答えとみなすことができるかどうかを確認し、そこ;-)よ
サディ

また、同じログ行を複数回取得します。コマンドのデバイスIDを十分に把握してください。
kleinfreund

@Sadiまたgsettings set org.gnome.settings-daemon.plugins.keyboard active false、スクリプトはによって実行されるため、この行は意図したとおりに機能しないと思いますroot。私のテストでは、行はその設定に影響しませんでした。
kleinfreund

このようなシナリオでは、gsettings set org.gnome.settings-daemon.plugins.keyboard active falseユーザーとしてコマンドを1回実行し、コマンドなしでこのスクリプトを使用することをお勧めしgsettings setます
...-サディ

これまでのところ、私たちはまだこのことをスムーズに機能させることができないことを見てきました。時々、キーボードレイアウトがudevによって実装されていないため、電源を切って再度接続する必要があります。しばらくの間、回答の上部にある(更新された)起動スクリプトに再び戻ると思いますが、それはよりスムーズに役立ちます-起動後に外部キーボードを接続する場合は手動で実行するだけです ... udevはまた、(それは奇妙な方法で、ラッパースクリプトを何度も実行されている)ので、多くのアクションの繰り返しに見られるようにビットバギーようです
サディ

1

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

Xorg構成ファイルで定義することもできます。

このstackexchangeの答えにレイアウトされています:https ://superuser.com/a/946575/437492


私はそれを動作させることができれば、それは素晴らしいだろう。しかし、最新のLTSリリースであるUbuntu 18.04を使用すると、40-libinput.confという名前のファイルを含む/usr/share/X11/xorg.conf.d/ディレクトリーのみが表示されます。そのため、そのファイルに外部キーボード用のセクションを追加しただけです。ドライバーlibinputまたはevdevと、より長いベンダー名とより短いベンダー名を使用しても、結果が得られませんでした。何か案は?
サディ

@Sadi:Xorgの構成について少し読んでみると、新しいファイルを簡単に追加できることがわかります/etc/X11/xorg.conf.d/(これが場所です)。
ゴラーランブラー

ありがとう。私は確かにかなり読み、最初に「/etc/X11/xorg.conf.d/30-keyboard.conf」を使用してみました。上記のstackexchangeの答えの下で私の運を試してみます。;-)
サディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.