Mengganti <esc> dan <caps lock> dengan cara yang tetap menggunakan keyboard eksternal

8

Saya memiliki file bernama ~ / .speedswapper yang berisi yang berikut:

! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

... ketika saya menjalankan xmodmap ~/.speedswapper, ini akan beralih escdan Caps Lockkunci. Saya memiliki baris ini di profil ~ /., Sehingga setiap kali saya masuk, kunci-kunci ini diaktifkan.

Namun , jika saya mencolokkan keyboard USB eksternal, pengaturan ini sepertinya tidak berlanjut. Keyboard laptop saya berfungsi dengan sangat baik, tetapi saya harus menjalankan perintah lagi agar keyboard eksternal dapat mengganti dua tombol. Untungnya, melakukan hal itu tampaknya tidak mempengaruhi keyboard laptop saya - mereka sepertinya bersinkronisasi.

Salah satu solusinya adalah menemukan beberapa cara untuk menjalankan perintah xmodmap itu setiap kali keyboard eksternal dicolokkan, tetapi saya akan terbuka untuk solusi keyswapping lain, jika itu akan lebih kuat. OS adalah Ubuntu 13.04.

Diberikan komentar justbrowsing, sepertinya ini dapat dicapai dengan menulis aturan udev - saya pikir saya harus menggunakan opsi RUN, dan itu harus dipicu pada / dev / hidraw0 atau / dev / hidraw1, yang merupakan perangkat yang muncul ketika saya mencolokkan keyboard saya ... tapi saya masih mencoba membungkus kepala saya di sekitar konsep, jadi saya menghargai bantuan dari seseorang yang tahu apa yang mereka lakukan dengan udev.

Evilsoup
sumber
Lihatlah ke penulisan aturan udev untuk ini.
justbrowsing

Jawaban:

3

Karena Anda memiliki perintah ini di Anda ~/.profile, itu hanya akan dieksekusi sekali, ketika Anda masuk. Satu, tidak terlalu elegan, solusi akan menempatkan perintah di Anda ~/.bashrcsebagai gantinya sehingga akan dijalankan setiap kali Anda membuka terminal.

Solusi yang lebih baik adalah dengan menetapkan udevaturan yang akan dijalankan xmodmapketika keyboard USB Anda dimasukkan (saya menggunakan nilai yang dikembalikan untuk keyboard USB saya, Anda perlu mengedit solusi ini agar sesuai dengan milik Anda):

  1. Dapatkan detail keyboard USB Anda. Jalankan perintah ini dengan keyboard terpasang:

    $ /lib/udev/findkeyboards | grep USB
    USB keyboard: input/event6
    
  2. Untuk menulis udevaturan, Anda perlu tahu apa yang harus dicocokkan. Anda bisa mendapatkannya dengan mencari output udevadm info --export-dbuntuk event6entri, atau langsung menguraikannya seperti:

    udevadm info --export-db | perl -ne 'BEGIN{$/="\n\n"}print if /event6/'
    

    Itu menghasilkan beberapa baris teks termasuk yang akan kita gunakan:

    E: ID_MODEL_ID=0002
    [...]
    E: ID_VENDOR_ID=1c4f
    
  3. udevjadi rumit ketika menggunakan program X seperti xmodmap, Saya bahkan tidak bisa menggunakannya ketika mengekspor $DISPLAYdan $XAUTHORITY. Lagi pula, saya tidak bisa membuatnya bekerja dengan metode Anda, jadi solusi saya menggunakan keymapsebagai gantinya. Pertama, Anda perlu mengetahui kode kunci untuk Escdan Caps Lock, Anda dapat melakukan ini dengan menjalankan

    sudo /lib/udev/keymap -i input/event6
    

    dan kemudian menekan tombol yang relevan. Di sistem saya, ini mengembalikan:

    scan code: 0x70029   key code: esc
    scan code: 0x70039   key code: capslock
    
  4. Buat aturan keymap baru yang berisi baris-baris ini:

    0x70029 capslock
    0x70039 esc
    

    dan simpan sebagai /lib/udev/keymaps/speedswap.

  5. Tetapkan udevaturan baru . Buat file yang dipanggil /etc/udev/rules.d/95-speedswap.rulesdan tambahkan baris ini ke sana:

    ACTION=="add", 
    SUBSYSTEM=="input", 
    ATTRS{idVendor}=="1c4f", 
    ATTRS{idProduct}=="0002", 
    RUN+="keymap $name speedswap"
    

Itu harus melakukannya, setidaknya pada sistem saya, mencolokkan USB eksternal saya menyebabkan Escbertindak seperti Caps Lockdan sebaliknya .

terdon
sumber
Ini terlihat bagus & saya akan mencobanya besok atau lusa. Saya berharap cara keyboard-agnostik untuk melakukan ini, tapi itu lebih merupakan hal yang 'rapi' daripada kebutuhan asli .
evilsoup
@ evilsoup Anda harus dapat membuat aturan yang lebih umum, coba udevadm info --export-dbdengan beberapa keyboard dan lihat kesamaannya. Mungkin ID_MODEL=USB_Keykoardatau ID_USB_DRIVER=usbhidtetapi itu mungkin juga memicu aturan dengan perangkat yang salah. Terserah kamu.
terdon