Tauschen Sie <esc> und <capslock> so aus, dass sie bei externen Tastaturen erhalten bleiben

8

Ich habe eine Datei namens ~ / .speedswapper, die Folgendes enthält:

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

... wenn ich renne xmodmap ~/.speedswapper, werden die Tasten escund umgeschaltet Caps Lock. Ich habe diese Zeile in meinem ~ / .profile, so dass bei jeder Anmeldung diese Schlüssel gewechselt werden.

Allerdings , wenn ich in einer externen USB - Tastatur anschließen, ist diese Einstellung nicht scheinen , bestehen bleiben. Die Tastatur meines Laptops funktioniert einwandfrei, aber ich muss den Befehl erneut ausführen, damit die externe Tastatur die beiden Tasten wechselt. Glücklicherweise scheint dies die Tastatur meines Laptops nicht zu beeinträchtigen - sie scheinen sich zu synchronisieren.

Eine Lösung wäre, einen Weg zu finden, um diesen xmodmap-Befehl auszuführen, wenn eine externe Tastatur angeschlossen ist, aber ich wäre offen für eine andere Tastenwechsellösung, wenn sie robuster wäre. Betriebssystem ist Ubuntu 13.04.

Angesichts des Kommentars von justbrowsing sieht es so aus, als ob dies durch das Schreiben einer udev-Regel erreicht werden kann. Ich denke, ich muss die RUN-Option verwenden und sie sollte auf / dev / hidraw0 oder / dev / hidraw1 ausgelöst werden erscheint, wenn ich meine Tastatur anschließe ... aber ich versuche immer noch, mich mit dem Konzept zu beschäftigen, daher würde ich mich über jede Hilfe von jemandem freuen, der weiß, was er mit udev macht.

Übelsuppe
quelle
Schauen Sie sich an , wie Sie udev-Regeln dafür schreiben .
Justbrowsing

Antworten:

3

Da Sie diesen Befehl in Ihrem haben ~/.profile, wird er beim Anmelden nur einmal ausgeführt. Eine nicht sehr elegante Lösung besteht darin, den Befehl ~/.bashrcstattdessen in Ihren Befehl einzufügen, damit er jedes Mal ausgeführt wird, wenn Sie ein Terminal öffnen.

Eine bessere Lösung wäre, eine udevRegel zu definieren , die ausgeführt wird, xmodmapwenn Ihre USB-Tastatur eingesteckt wird (ich verwende die für meine USB-Tastatur zurückgegebenen Werte, Sie müssen diese Lösung bearbeiten, um sie an Ihre anzupassen):

  1. Holen Sie sich die Details Ihrer USB-Tastatur. Führen Sie diesen Befehl mit angeschlossener Tastatur aus:

    $ /lib/udev/findkeyboards | grep USB
    USB keyboard: input/event6
    
  2. Um udevRegeln zu schreiben , müssen Sie wissen, mit welchen Regeln sie übereinstimmen sollen. Sie können dies erreichen, indem Sie die Ausgabe von udevadm info --export-dbnach dem event6Eintrag durchsuchen oder ihn direkt wie folgt analysieren:

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

    Das gibt mehrere Textzeilen zurück, einschließlich der folgenden, die wir verwenden werden:

    E: ID_MODEL_ID=0002
    [...]
    E: ID_VENDOR_ID=1c4f
    
  3. udevwird kompliziert bei der Verwendung von X-Programmen wie xmodmap, ich konnte es beim Exportieren nicht einmal zum Laufen bringen $DISPLAYund $XAUTHORITY. Wie auch immer, ich konnte es nicht mit Ihrer Methode zum Laufen bringen, also verwendet meine Lösung keymapstattdessen. Zuerst müssen Sie die Schlüsselcodes für Escund herausfinden, und Caps LockSie können dies tun, indem Sie ausführen

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

    und dann die entsprechenden Tasten drücken. Auf meinem System gibt dies Folgendes zurück:

    scan code: 0x70029   key code: esc
    scan code: 0x70039   key code: capslock
    
  4. Erstellen Sie eine neue Keymap-Regel mit folgenden Zeilen:

    0x70029 capslock
    0x70039 esc
    

    und speichern Sie es als /lib/udev/keymaps/speedswap.

  5. Definieren Sie eine neue udevRegel. Erstellen Sie eine Datei mit dem Namen /etc/udev/rules.d/95-speedswap.rulesund fügen Sie diese Zeilen hinzu:

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

Das sollte es tun, zumindest auf meinem System, wenn ich meinen externen USB-Anschluss anschließe, verhält Esces sich wie Caps Lockund umgekehrt .

terdon
quelle
Das sieht gut aus und ich werde es morgen oder übermorgen versuchen. Ich hatte auf eine tastaturunabhängige Methode gehofft, aber das ist eher eine "es wäre ordentlich" Sache als ein echtes Bedürfnis .
Evilsoup
@evilsoup Sie sollten in der Lage sein, eine allgemeinere Regel zu erstellen, es udevadm info --export-dbmit ein paar Tastaturen zu versuchen und zu sehen, was sie gemeinsam haben. Vielleicht ID_MODEL=USB_Keykoardoder ID_USB_DRIVER=usbhidaber das könnte auch die Regel mit dem falschen Gerät auslösen. Wie du willst.
Terdon