Wie ordne ich einer USB-Tastatur dauerhaft ein anderes Tastaturlayout zu?

16

Ich stecke oft eine USB-Tastatur in meinen Laptop (zusätzlich zu einem externen Monitor und einer Maus, die meinen Laptop virtuell in einen Desktop-Computer verwandeln) und bevorzuge dann die Verwendung eines anderen Tastaturlayouts.

Ich muss das aktuelle Tastaturlayout jedes Mal manuell ändern, wenn ich diese USB-Tastatur einstecke.

Und ich würde gerne eine automatisierte Methode verwenden, wenn dies möglich ist.

Radus Antwort auf die Frage hier gibt einige Hinweise, aber es scheint, dass ich ein Startskript für diese Aufgabe benötige, da sich die Geräte-ID für meine USB-Tastatur jedes Mal ändert, wenn der Computer gestartet wird.

Dieses Startskript enthält wahrscheinlich zuerst den Befehl xinput -list | grep "USB Keyboard"und einen weiteren Befehl, um die erste angezeigte USB-Tastatur-ID-Nummer abzurufen und dann im letzten Befehl das von mir gewählte Layout für diese USB-Tastatur wie folgt festzulegen:

setxkbmap -device <NUMBER> -layout <LAYOUT>

Sadi
quelle
1
@Sadi Wollen Sie damit sagen, dass Sie nach der Ermordung von Dr. Martin Luther King die Fahnen der Rutger und der USA auf den Kopf gestellt haben? Paul Robeson: Der große Vorläufer von Freedomways auf Seite 182
guest271314
@ guest271314 Vielen Dank! Aber ich frage mich, warum Sie hier gelandet sind, um diese Frage zu kommentieren: history.stackexchange.com/questions/48704/… ;-) Dies ist auch eine andere kluge Form des Protests, aber ich glaube nicht, dass sich daraus irgendwann etwas entwickeln könnte Hörensagengeschichte, erinnere ich mich.
Sadi
@Sadi Deine Frage wurde bei Politics gelöscht.
guest271314

Antworten:

15

Nach ein wenig Recherche habe ich eine Lösung gefunden, obwohl ich immer noch offen für andere (wahrscheinlich bessere) Antworten bin.

Hier ist ein Startskript (das zu Startup Applications hinzugefügt werden kann ), das die maually eingegebene usbkbd_layout- Variable auf die in der xinput-Liste gefundene usbkbd- Geräte- ID setzt :

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

Dieses Skript ist sehr nützlich (und stabiler) für Szenarien, in denen der Benutzer den Laptop auf einem Desktop-Setup (mit externer Tastatur, Maus und Monitor usw.) verwendet. Es kann auch manuell ausgeführt werden, wenn die externe USB-Tastatur angeschlossen ist ...

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

DIE BESSERE (fast perfekte) LÖSUNG - gefunden dank MinimusHeximus und den jeweiligen Mitwirkenden zu dem Thread, den er in seinem Kommentar unten erwähnt hat:

Ich kann jetzt einfach meine USB-Tastatur anschließen und das andere Tastaturlayout (TR-F) automatisch anwenden, wobei das Standard-Tastaturlayout (TR-Q) auf meinem Laptop erhalten bleibt!

Hier sind die Dateien und deren Inhalte, die dies ermöglichen:

/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

Anmerkungen:

  1. Natürlich sollten alle vier Dateien in Ihrem "bin" -Ordner die erforderlichen Berechtigungen (lesbar und ausführbar) haben, die zum Beispiel mit einem Terminal-Befehl wie implementiert werden können chmod - 755 /home/sadi/.bin/usb-keyboard-*
  2. Manchmal wird nach dem Anschließen der USB-Tastatur immer noch dasselbe (Standard-) Tastaturlayout verwendet und beim zweiten Versuch auf das angegebene Layout umgeschaltet (erfordert dies möglicherweise etwas mehr Ruhezeit?).
  3. Das für die USB-Tastatur spezifische Layout ist im Anmeldebildschirm nicht wirksam (wenn Sie sich abmelden).
  4. Wenn Sie eine separate Partition für / home verwenden , ist es möglicherweise besser, die vier Skripte an einer beliebigen Stelle in der Root-Partition abzulegen , z. B. / usr / local / bin, und den Inhalt aller entsprechenden Dateien entsprechend zu ändern, wie es manchmal bei udev der Fall ist Diese Dateien, bevor Ihre / home- Partition eingehängt wird, verursachen Probleme.

UM DIESES SETUP AN VERSCHIEDENE ANFORDERUNGEN ANZUPASSEN:

  1. USB - Tastatur Hersteller- und Produkt - IDs sollte gemäß der Ausgabe des Befehls geändert wird lsusb(zum Beispiel meiner lsusbAusgabe hat dies für meine USB - Tastatur: Bus 001 Device 006: ID 09da:0260 A4 Tech Co., Ltd)
  2. Der Name des Besitzers und aller Benutzerverzeichnisse sollte von "sadi" in einen anderen Namen geändert werden
  3. Die usbkbd_id muss möglicherweise ein wenig angepasst werden, um die richtige Geräte-ID zu ermitteln (Die Ausgabe der Befehle xinput -list | grep "USB Keyboard"gibt mir beispielsweise zwei Zeilen; ↳ USB Keyboard id=14 [slave keyboard (3)]und ↳ USB Keyboard id=16 [slave keyboard (3)]; die dann gefiltert werden, awkindem "=" als Feldbegrenzer verwendet und der zweite Teil erfasst wird; dann nur der die ersten beiden Ziffern und dann nur den Wert in der ersten Zeile verwenden)
  4. Der Wert für usbkbd_layout kann eine andere gültige Wahl sein
Sadi
quelle
Es wäre großartig, wenn ein anderes ähnliches Skript automatisch ausgeführt werden könnte, wenn eine USB-Tastatur angeschlossen wird, wie hier gefragt (noch nicht beantwortet): askubuntu.com/questions/284224/…
Sadi
2
Es kann hilfreich sein , wenn Sie eine andere Antwort aus diesem unordentlichen Thread Beiträge verfassen können superuser.com/questions/249064/...
user126106
1
@MinimusHeximus Tausend Dank !!! Nachdem Sie den Thread durchgearbeitet haben, auf den Sie hingewiesen haben, und einige Versuche unternommen haben, habe ich ihn endlich geklärt und werde diese neue (fast) perfekte Hotplug-Lösung oben hinzufügen!
Sadi
1
Meine Tastatur hat aus irgendeinem Grund zwei IDs, daher IFmusste ich anstelle einer eine verwenden FOR. Es funktioniert jetzt für mich, danke! gist.github.com/zvictor/193b567c14b5b6a679fe
zVictor
1
@Sadi Ich bin selbst nur ein durchschnittlicher Benutzer. Ich werde meine Lösung hier posten. Vielleicht können Sie sich davon ein paar Gedanken machen.
Kleinfreund
9

Innerhalb der udev-Regel können X11-Treiberoptionen angegeben werden, es sind keine benutzerdefinierten Skripte erforderlich. Als Beispiel hier der Inhalt meiner /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"

Diese Regel stellt sicher, dass eine bestimmte USB-Tastatur in Xorg ein US-amerikanisches Layout verwendet (die interne Tastatur meines Laptops ist deutsch und dies ist auch mein primäres Layout). Wichtige Punkte:

  1. Mit oder können Sie idVendorund idProductIhr Gerät herausfindenlsusbevtest
  2. Sie können jedes Layout von verwenden /usr/share/X11/xkb/symbols. Achten Sie darauf, sowohl ein gültiges Layout als auch eine gültige Variante anzugeben.
  3. Der Dateiname muss mit einer Zahl> 64 beginnen, damit die Einstellungen die in angegebenen systemweiten Einstellungen überschreiben /lib/udev/rules.d/64-xorg-xkb.rules
  4. Stellen Sie sicher, dass die Gnome / KDE-Layoutverwaltung Ihre Einstellungen nicht überschreibt.
pavel
quelle
Trennen Sie die Tastatur vom Computer, und schließen Sie sie wieder an. Suchen Sie /var/log/Xorg.0.lognach möglichen Problemen. Sie können auch udevadm infoüberprüfen, ob die Einstellungen korrekt angewendet wurden.
Pavel
Eureka! Ihre intelligente Lösung zu arbeiten begann erst , nachdem ich diesen Befehl eingegeben (ein für alle Mal) die aktuelle gconf Einstellung außer Kraft zu setzen: gsettings set org.gnome.settings-daemon.plugins.keyboard active false. Wenn Sie auch eine solche Notiz hinzufügen möchten , werde ich versuchen , Ihnen so zu markieren , die Antwort (statt dieser plumpen, langer und steiniger Weg ;-)
Sadi
Das ist außergewöhnlich. Unter Ubuntu 14.04 sind die möglichen Modelle / Layouts / Optionen / etc. sind gelistet bei/usr/share/X11/xkb/rules/evdev.lst
Jon
2
Leider funktionierte diese nette und einfache Lösung nach dem Upgrade auf Ubuntu Gnome 17.04 nicht mehr :-(
Sadi
Versucht Linux Mint 18.2, die auf Ubuntu 16.04 LTS basiert, mit udev-Version 229-4ubuntu19 , wieder keine Wirkung :-( Irgendwelche Ideen zu diesem seltsamen udev-Verhalten ???
Sadi
2

Ich habe diese Lösung gerade für eine bépo Typematrix-Tastatur (französische Version von Optimized Excellent Dvorak) und in einem breiten Systemkontext (es wird vorausgesetzt, dass Sie einen Root-Zugriff auf die Maschine haben) verbessert. Es werden nur 3 Dateien benötigt, um zu arbeiten. Sie können eine Protokolldatei konsultieren, wenn Sie nicht herausfinden, was fehlerhaft ist.

/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 (unbedingt erforderlich, um ein intermediäres Hintergrundskript zu verwenden)

#!/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
JP Ayanidès
quelle
1

Nachdem ich viel rumgespielt habe, ist es das, was ich jetzt laufen habe. Vielleicht schreibe ich einen kompletten Artikel und veröffentliche den Code in einem Repository, wenn das von Interesse wäre.


Richten Sie einen neuen Regelsatz für udev ein:

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

Die Regel soll ein Shell-Skript aufrufen, wenn eine Aktion von einem Gerät mit der angegebenen Kombination aus Anbieter- und Produkt-ID ausgelöst wird.

ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"

Starten Sie den udev-Dienst nach dem Hinzufügen des neuen Regelsatzes neu:

sudo service udev restart

Hinweis: Ich konnte keine zuverlässigen Ergebnisse erzielen, indem ich spezifischere Übereinstimmungsregeln in dieser Datei angegeben habe. Am wichtigsten ist, dass das Hinzufügen einer ACTIONÜbereinstimmungsregel nicht funktioniert hat. Soweit ich das beurteilen kann, wurde das Skript trotzdem ausgelöst. Beim Hinzufügen ACTION=="add"wird das Skript beim Entfernen des Geräts weiterhin aufgerufen. Sehr seltsam und verwirrend.

Die Aktion, die die udev-Regel ausgelöst hat, steht dem aufgerufenen Skript jedoch zur Verfügung (siehe unten).


Als nächstes das Skript selbst. Nicht ganz. Beachten Sie das wrapperSuffix im Dateinamen. Dies zeigt an, dass dies nicht das eigentliche Skript ist, sondern ein Wrapper, der das Skript aufruft und im Hintergrund ausführt, damit udev seinen Prozess beenden kann.

~/.bin/switch-kb-layout-wrapper.sh:

#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &

Die Variable ACTIONenthält die udev-Aktion, die vom Gerät ausgelöst wurde. Es liefert Werte wie add(Gerät wurde eingesteckt) und remove(Gerät wurde entfernt). Wir werden diese später verwenden.

~/.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

Ersetzen Sie meinen Benutzernamen durch Ihren, wenn Sie die HOMEVariable setzen ( $(whoami)funktioniert hier nicht, da dies nicht von Ihrem Benutzer, sondern von aufgerufen wird root).

sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh

Zu Testzwecken habe ich einige Zeilen hinzugefügt, die bestimmte Ereignisse in einer Datei in meinem Ausgangsverzeichnis protokollieren, um festzustellen, ob alles funktioniert. Sie können diese sicher entfernen.


Schließlich müssen diese Skripte über Ausführungsberechtigungen verfügen. Es kann auch wichtig sein, zu beachten, dass diese Skripte vom rootBenutzer aufgerufen werden. Seien Sie also vorsichtig, was Sie dort tun.

chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh 
kleinfreund
quelle
1
Danke, tolle Arbeit! Ich habe es auch zum Laufen gebracht. Es ist jedoch ein Rätsel, warum ich 14 Mal "Aktion hinzufügen" und 3 Mal "Andere Aktion" sehe, wenn ich meinen externen Befehl einbinde, den ich später zu lösen versuchen werde. Ich habe jedoch festgestellt, dass es besser ist, dem Befehl setxkbmap auch eine Geräte-ID hinzuzufügen, damit die interne Tastatur und die externe Tastatur weiterhin verwendet werden können, wie in meinem neuesten Autostart-Skript. Ich werde es ein paar Tage lang versuchen und dann zurückkommen und sehen, ob deine Antwort als DIE Antwort angesehen werden kann, vielleicht mit einer kleinen Modifikation hier und da ;-)
Sadi
Außerdem werden dieselben protokollierten Zeilen mehrmals abgerufen. Guter Fang für die Geräte-ID im Befehl.
kleinfreund
@Sadi Ich denke auch, dass die Leitung gsettings set org.gnome.settings-daemon.plugins.keyboard active falsenicht wie vorgesehen funktioniert, da das Skript von ausgeführt wird root. In meinen Tests hatte die Linie keinen Einfluss auf diese Einstellung.
Kleinfreund
Ich denke, in einem solchen Szenario ist es eine gute Idee, den Befehl gsettings set org.gnome.settings-daemon.plugins.keyboard active falseein für alle Mal als Benutzer auszuführen und dann dieses Skript ohne die gsettings setBefehle zu verwenden ...
Sadi
Bisher habe ich gesehen, dass wir das Ding immer noch nicht reibungslos zum Laufen bringen können. Von Zeit zu Zeit wird das Tastaturlayout nicht von udev implementiert, und Sie müssen das Gerät aus- und wieder einstecken. Ich denke, ich werde für einige Zeit wieder auf mein (aktualisiertes) Startskript am Anfang meiner Antwort zurückgreifen, was für mich reibungsloser ist - nur muss ich es manuell ausführen, wenn ich meine externe Tastatur nach dem Start einstecke. Es scheint, dass udev ein bisschen fehlerhaft ist, wie auch in so vielen Aktionswiederholungen zu sehen ist (es führt das Wrapper-Skript oft und auf seltsame Weise aus) ...
Sadi
1

Ich hatte ein Berechtigungsproblem mit dem von udev ausgeführten Skript. Ich habe mich mit sudo wie folgt aufgelöst:

# 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')

Stellen Sie die Tastaturbelegung für jedes Gerät ein

    for ID in $IDLIST; do
            sudo -u max /usr/bin/setxkbmap -device $ID -layout "${kb_layout}" -display :0
    done
user835020
quelle
Ich denke, es kann nützlicher sein, wenn Sie es vollständig schreiben können. Wo haben Sie zum Beispiel die obigen Zeilen platziert?
Sadi
0

Sie können es auch in einer Xorg-Konfigurationsdatei definieren.

Sie ist in dieser Stapelaustauschantwort aufgeführt: /superuser//a/946575/437492

Golar Ramblar
quelle
Das wäre toll, wenn ich es zum Laufen bringen könnte. Mit der neuesten LTS-Version Ubuntu 18.04 kann ich jedoch nur das Verzeichnis /usr/share/X11/xorg.conf.d/ sehen, das eine Datei mit dem Namen 40-libinput.conf enthält . Also habe ich einfach einen Abschnitt für die externe Tastatur in diese Datei eingefügt. Mit dem Treiber libinput oder evdev und einem längeren und kürzeren Anbieternamen konnte ich kein Ergebnis erzielen. Irgendwelche Ideen?
Sadi
@Sadi: Wenn Sie etwas über die Xorg-Konfiguration lesen, werden Sie feststellen, dass Sie einfach neue Dateien hinzufügen können /etc/X11/xorg.conf.d/(das ist der richtige Ort).
Golar Ramblar
Vielen Dank. Ich habe sicherlich einiges gelesen und es zuerst mit "/etc/X11/xorg.conf.d/30-keyboard.conf" versucht. Ich werde dann mein Glück unter der oben genannten Stackexchange-Antwort versuchen. ;-)
Sadi