Bir USB klavyeye kalıcı olarak farklı bir klavye düzeni nasıl atanır?


16

Genellikle dizüstü bilgisayarıma bir USB klavye eklerim (dizüstü bilgisayarımı sanal olarak bir masaüstü bilgisayara dönüştüren harici monitör ve fareye ek olarak) ve o zaman farklı bir klavye düzeni kullanmayı tercih ederim.

Bu USB klavyeyi her taktığımda geçerli klavye düzenini manuel olarak değiştirmem gerekiyor.

Mümkünse bunun için otomatik bir yol kullanmak istiyorum.

Radu sorusuna bireyin cevabı burada bazı ipuçları verir, ancak ben gerekir gibi görünüyor başlangıç komut dosyası benim USB klavye için cihaz kimlik her seferinde bilgisayar başlatıldığında değiştirir olarak bu görev için.

Bu başlangıç ​​komut dosyası muhtemelen önce komutu xinput -list | grep "USB Keyboard"ve görüntülenen ilk USB Klavye Kimlik numarasını almak için başka bir komut içerecek ve daha sonra bu USB klavye için seçtiğim düzenimi aşağıdaki gibi ayarlamak için son komutta kullanacaktır:

setxkbmap -device <NUMBER> -layout <LAYOUT>



1
@Sadi Dr. Martin Luther King'in suikastının ardından Rutgers ve ABD bayraklarını ters çevirmeye mi atıfta bulunuyorsunuz? Paul Robeson: Freedomways'in Büyük Öncüsü sayfa 182
guest271314

@ guest271314 Çok teşekkürler! : Ama bu sorunda yorumuna burada bitti gel acaba history.stackexchange.com/questions/48704/... ;-) Bu protestonun başka akıllı biçimi de ama bu nihayetinde dahil olmasıyla devam edebilir sanmıyorum kulaktan dolma hikaye hatırlıyorum.
Sadi

@Sadi Sorunuz Politika'da silindi.
guest271314

Yanıtlar:


15

Biraz araştırma yaptıktan sonra, yine de başka (muhtemelen daha iyi) cevaplara açık olmasına rağmen bir çözüm buldum.

İşte bu başlangıç komut dosyası (eklenebilir Başlangıç Uygulamaları oluşturacak olan) maually girilen usbkbd_layout değişkenin usbkbd cihaz kimliğinin s, bulan Xinput -Tedarikçilerin listesi :

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

Bu komut dosyası, kullanıcının dizüstü bilgisayarı bir masaüstü kurulumunda (harici klavye, fare ve monitör vb. İle) kullanmaya başladığı senaryolar için oldukça yararlıdır (ve daha kararlıdır) ve harici USB klavye her takıldığında manuel olarak da çalıştırılabilir. ...

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

DAHA İYİ (neredeyse mükemmel) ÇÖZÜM - MinimusHeximus ve aşağıdaki yorumunda bahsettiği konuya katkıda bulunanlar sayesinde bulundu :

Şimdi sadece USB klavyemi ekleyebilirim ve dizüstü bilgisayarımda varsayılan klavye düzenini (TR-Q) korurken otomatik olarak farklı (TR-F) klavye düzenine sahip olabilirim!

Bunu mümkün kılan dosyalar ve içerikleri şunlardır:

/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

Notlar:

  1. Tabii ki. "Bin" klasörünüzdeki dört dosyanın tümü, örneğin bir Terminal komutu ile uygulanabilecek gerekli izinlere (okunabilir ve yürütülebilir) sahip olmalıdır. chmod - 755 /home/sadi/.bin/usb-keyboard-*
  2. Bazen USB klavye takıldıktan sonra hala aynı (varsayılan) klavye düzenini kullanır ve ikinci denemede belirtilen düzene geçer (belki bir yerde biraz daha fazla uyku süresi gerektirir?)
  3. USB klavyeye özgü düzen, giriş ekranında (Oturumu Kapattığınızda) etkili değildir.
  4. / Home için ayrı bir bölüm kullanırsanız , dört komut dosyasını kök bölümün herhangi bir yerine koymak daha iyi bir fikir olabilir, örneğin / usr / local / bin ve bazen udev aradığı şekilde ilgili tüm dosyaların içeriğini değiştirin. / home bölümünüz yüklenmeden önce bu dosyaları sorunlara neden olabilir.

BU KURULUMU FARKLI ŞARTLARA UYARLAMAK İÇİN:

  1. USB klavye satıcı ve ürün kimlikleri komutunun çıktısı göre değiştirilmelidir lsusb(Örneğin benim lsusbçıkış benim USB Klavye için bu var: Bus 001 Device 006: ID 09da:0260 A4 Tech Co., Ltd)
  2. SAHİBİ ve tüm kullanıcı dizini adları "sadi" yerine başka bir adla değiştirilmelidir
  3. Usbkbd_id, doğru cihaz kimliğini almak için küçük bir ayarlama gerektirebilir (Örneğin, komutların çıktısı xinput -list | grep "USB Keyboard"bana iki satır verir; ↳ USB Keyboard id=14 [slave keyboard (3)]ve ↳ USB Keyboard id=16 [slave keyboard (3)]daha sonra awkalan sınırlayıcı olarak "=" kullanılarak filtrelenir ve ikinci kısmı yakalar; ilk iki hane ve daha sonra yalnızca ilk satırdaki değeri kullanarak)
  4. Usbkbd_layout değeri geçerli başka bir seçenek olabilir

USB klavye her takıldığında benzer bir komut dosyasının otomatik olarak çalışıp çalışmadığı
Sadi

2
Bu dağınık iplikten başka bir cevap gönderebilirseniz yardımcı olabilir: superuser.com/questions/249064/…
nano - beni birleştir

1
@MinimusHeximus Bir milyon teşekkürler !!! İşaret ettiğiniz konudan geçtikten ve biraz deneme yanılma yaptıktan sonra, nihayet çözdüm ve yukarıdaki bu yeni (neredeyse) mükemmel hotplugging çözümünü ekleyeceğim!
Sadi

1
Klavyemin herhangi bir nedenle iki kimliği var, bu yüzden kullanmak yerine IFa kullanmak zorunda kaldım FOR. Şimdi benim için çalışıyor, teşekkürler! gist.github.com/zvictor/193b567c14b5b6a679fe
zVictor

1
@Sadi Ben sadece ortalama bir kullanıcıyım. Çözümümü buraya göndereceğim. Belki bundan bazı fikirler çıkarabilirsiniz.
kleinfreund

9

Udev kuralı içinde X11 sürücü seçenekleri belirtilebilir, özel komut dosyalarına gerek yoktur. Örnek olarak, /etc/udev/rules.d/99-usb-kbd.rules içeriğimi burada bulabilirsiniz

ACTION=="add", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="2323", ENV{XKBMODEL}="pc104", ENV{XKBLAYOUT}="us", ENV{XKBVARIANT}="euro", ENV{XKBOPTIONS}="compose:caps"

Bu kural, belirli bir USB klavyenin Xorg'da ABD düzenini kullanmasını sağlar (dizüstü bilgisayarımın dahili klavyesi Almanca'dır ve bu da birincil düzenimdir). Önemli noktalar:

  1. Öğrenebilirsiniz idVendorve idProductkullanarak cihazın lsusbveyaevtest
  2. Öğesinden herhangi bir düzeni kullanabilirsiniz /usr/share/X11/xkb/symbols. Hem geçerli bir düzen hem de geçerli bir değişken belirtmeye dikkat edin.
  3. Ayarların sistem genelindeki ayarların üzerine yazabilmesi için dosya adı> 64 ile başlamalıdır. /lib/udev/rules.d/64-xorg-xkb.rules
  4. Gnome / KDE mizanpaj yönetiminin ayarlarınızın üzerine yazmadığından emin olun.

Klavyenizi çıkarıp yeniden takın ve /var/log/Xorg.0.logolası sorunları arayın . udevadm infoAyarların doğru uygulandığını kontrol etmek için de kullanabilirsiniz .
pavel

Eureka! Sizin akıllı çözüm akım gconf ayarını geçersiz kılmak için (hepsi için bir kere) Ben bu komutu girmelerinin ardından çalışmaya başladı: gsettings set org.gnome.settings-daemon.plugins.keyboard active false. Ayrıca böyle bir not eklemek, ben olarak seninkini işaretlemek çalışacağım ;-) uzun ve dolambaçlı yol, cevap (yerine kadar sakar
Sadi

Bu olağanüstü. Ubuntu 14.04'te olası modeller / düzenler / seçenekler / vb. /usr/share/X11/xkb/rules/evdev.lst
Jon

2
Ne yazık ki bu güzel ve kolay çözüm çalışmayı durdurdu yükseltme sonra benim için Ubuntu Gnome 17.04 :-(
Sadi

Udev sürüm 229-4ubuntu19 ile Ubuntu 16.04 LTS tabanlı Denenmiş Linux Mint 18.2, bir daha etkisi yok :-( Bu garip udev davranışı hakkında herhangi bir fikir ???
Sadi

2

Ben sadece bir bépo Typematrix klavye (optimize edilmiş mükemmel dvorak'ın fransız versiyonu) ve geniş bir sistem bağlamında (makineye root erişiminiz olduğunu varsayar) bu çözümü geliştirdim. Çalışması için sadece 3 dosyaya ihtiyacı var. Neyin başarısız olduğunu anlayamamanız durumunda bir günlük dosyasına başvurabilirsiniz.

/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 (bir ara arka plan komut dosyası kullanmak için kesinlikle gereklidir)

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

Çok uğraştıktan sonra, şimdilik bu var. Belki bir tür makale yazacağım ve ilgimi çekerse kodu bir depoda yayınlayacağım.


Udev için şu şekilde yeni bir kural seti oluşturun:

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

Kural, verilen satıcı ve ürün kimliği kombinasyonuna sahip bir cihaz tarafından bazı eylemler tetiklendiğinde bir kabuk komut dosyası çağırması gerekir.

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

Yeni kural kümesini ekledikten sonra udev hizmetini yeniden başlatın:

sudo service udev restart

Not: Bu dosyada daha spesifik eşleme kuralları sağlayarak güvenilir sonuçlar elde edemedim. En önemlisi, ACTIONeşleşen bir kural eklemek işe yaramadı. Bildiğim kadarıyla, senaryo yine de tetiklendi. Ekleme ACTION=="add"sırasında, aygıt kaldırıldıktan sonra komut dosyası çağrılır. Çok garip ve kafa karıştırıcı.

Ancak udev kuralını tetikleyen eylem, çağrılan komut dosyası için aşağıda gösterildiği gibi kullanılabilir.


Sonra, komut dosyasının kendisi. Pek iyi değil. wrapperDosya adındaki soneki not edin . Bu, bunun gerçek komut dosyası değil, komut dosyasını çağıran ve arkaplanda yürüten bir sarmalayıcı olduğunu gösterir, böylece udev işlemi tamamlayabilir.

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

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

Değişken ACTION, cihaz tarafından tetiklenen udev işlemini içerir. add(Cihaz takıldı) ve remove(cihaz çıkarıldı) gibi değerler verir . Bunları daha sonra kullanacağız.

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

HOMEDeğişkeni ayarlarken kullanıcı adımı sizinkiyle değiştirin ( $(whoami)burada kullanılamaz, çünkü bu sizin kullanıcınız tarafından çağrılmayacaktır root).

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

Test amacıyla, her şeyin işe yarayıp yaramadığını görmek için ana dizindeki bir dosyaya belirli olayları kaydeden bazı satırlar ekledim. Bunları güvenle kaldırabilirsiniz.


Son olarak, bu komut dosyalarının yürütme izinlerine sahip olması gerekir. Ayrıca, bu komut dosyalarının rootkullanıcı tarafından çağrılacağını unutmayın, bu yüzden orada ne yaptığınıza dikkat edin.

chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh 

1
Teşekkürler, harika çalışmalar! Ben de çalışıyordum. Ancak, harici komutumu eklediğimde neden 14 kez "Eylem ekle" ve 3 kez "Diğer eylem" görüyorum, daha sonra çözmeye çalışacağım bir gizem. Ancak, en son otomatik başlatma komut dosyamda olduğu gibi dahili klavyenin yanı sıra harici klavyenin de kullanılabilir olması için setxkbmap komutuna aygıt kimliği eklemenin daha iyi olduğunu gördüm. Bunu birkaç gün boyunca deneyeceğim ve geri dönün ve belki de burada ve orada küçük bir değişiklikle sizin yanıtınız olarak kabul edilip edilemeyeceğine bakın ;-)
Sadi

Ayrıca aynı kayıtlı satırları birden çok kez alıyorum. Komuttaki cihaz kimliğini iyi yakalayın.
kleinfreund

@Sadi Ayrıca gsettings set org.gnome.settings-daemon.plugins.keyboard active falsekomut dosyası tarafından çalıştırıldığı gibi satırın istendiği gibi çalışmadığını düşünüyorum root. Testlerimde, hattın bu ayar üzerinde bir etkisi yoktu.
kleinfreund

Böyle bir senaryoda, komutu gsettings set org.gnome.settings-daemon.plugins.keyboard active falsekullanıcı olarak bir kez ve herkes için yürütmek ve sonra gsettings setkomutları olmadan bu komut dosyasını kullanmak iyi bir fikir olabilir ...
Sadi

Şimdiye kadar bu şeyin sorunsuz bir şekilde çalışmasını sağlayamadığımızı gördüm; zaman zaman klavye düzeni udev tarafından uygulanmıyor ve tekrar takıp takmanız gerekiyor. Sanırım bir süre daha cevabımın üstündeki (güncellenmiş) başlangıç ​​komut dosyasına geri döneceğim, bu da bana daha sorunsuz bir şekilde hizmet ediyor - başlangıçtan sonra harici klavyemi taktığımda sadece manuel olarak çalıştırmam gerekiyor. Görünüşe göre udev biraz fazla eylem tekrarında da görülebileceği gibi biraz hatalı görünüyor (sarıcı komut dosyasını birçok kez ve garip yollarla çalıştırıyor) ...
Sadi

1

Ben udev tarafından yürütülen komut dosyası ile ilgili bazı izin sorunu vardı. Sudo ile aşağıdaki gibi çözdüm:

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

Her aygıt için klavye haritasını ayarlama

    for ID in $IDLIST; do
            sudo -u max /usr/bin/setxkbmap -device $ID -layout "${kb_layout}" -display :0
    done

Tam yazabiliyorsanız daha yararlı olabileceğini düşünüyorum. Örneğin, çizgileri nereye koydunuz?
Sadi

0

Bunu bir Xorg yapılandırma dosyasında da tanımlayabilirsiniz.

Bu yığın değişiminde düzenlenmiştir: /superuser//a/946575/437492


İşe yarayabilirsem bu harika olurdu. Ancak en son LTS sürümü olan Ubuntu 18.04'ü kullanarak, yalnızca /usr/share/X11/xorg.conf.d/ dizinini 40-libinput.conf adlı bir dosya içeren dizini görebiliyorum . Bu dosyadaki harici klavye için bir bölüm ekledim. Sürücü libinput veya evdev ve daha uzun ve daha kısa bir satıcı adı kullanarak, sonuç alamadım. Herhangi bir fikir?
Sadi

@Sadi: Xorg yapılandırması hakkında biraz okursanız, yeni dosyalar ekleyebileceğinizi anlayacaksınız /etc/X11/xorg.conf.d/(gidilecek yer budur).
Golar Ramblar

Teşekkürler. Kesinlikle biraz okudum ve ilk önce "/etc/X11/xorg.conf.d/30-keyboard.conf" komutunu kullanarak denedim. Şansımı yukarıda belirtilen stackexchange cevabının altında deneyeceğim. ;-)
Sadi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.