Aktualisieren der Modifizierertastenzuordnungen mit dem Befehlstool "Standard"


16

Ich versuche, die anfängliche Einrichtung meines Macbooks zu automatisieren, einschließlich der Installation von Software und der Anpassung der OS X-Konfiguration an meine Bedürfnisse.

Ich habe versucht, die Modifizierertasten mit den Standardeinstellungen zu aktualisieren. Der Code lautet wie folgt:

# The apple keyboard id (1452-567-0) should probably be modified in case you use other different model 
COMPUTER_UUID=`ioreg -rd1 -c IOPlatformExpertDevice | grep -E '(UUID)' | awk '{print $3}' | tr -d \"`
defaults write ~/Library/Preferences/ByHost/.GlobalPreferences.$COMPUTER_UUID com.apple.keyboard.modifiermapping.1452-567-0 '( { HIDKeyboardModifierMappingDst = 2;   HIDKeyboardModifierMappingSrc = 0; } )'

Das Problem scheint, dass die Systemeinstellungen das Update nicht abfangen, auch wenn das Muster geändert wird, und den Computer nicht neu starten.

Gibt es eine Möglichkeit, diese Operation in Snow Leopard auszuführen?

Vielen Dank.


Verwenden Sie defaults -currentHost write -g key 'value'stattdessen. Funktioniert aber immer noch nicht.
Daniel Beck

1
Dieser Typ versucht etwas Ähnliches und ist auch gescheitert. Wäre AppleScript GUI Scripting eine sinnvolle Option für Sie?
Daniel Beck

Antworten:


12

Es ist wichtig, dass der defaultsBefehl die richtige "Tastatur-ID" in der Taste verwendet. Es scheint:com.apple.keyboard.modifiermapping.$VendorID-$ProductID-0

Zum Beispiel die interne Tastatur für mein MacBook Air verwendet:, com.apple.keyboard.modifiermapping.1452-579-0während die externe Tastatur auf meinem iMac verwendetcom.apple.keyboard.modifiermapping.1118-219-0

Wie erhalte ich die richtige "Tastatur-ID"? In der Befehlszeile können Sie Folgendes verwenden:

ioreg -p IOUSB -c IOUSBDevice | grep -e class -e idVendor -e idProduct

So rufen Sie eine Liste Ihrer USB-Geräte mit den entsprechenden Parametern ab:

  [...]
  +-o Natural® Ergonomic Keyboard 4000@fa140000  <class IOUSBDevice, id 0x100000452, registered, matched, active, busy 0 (115 ms), retain 12>
        "idProduct" = 219
        "idVendor" = 1118

Ich vermute, dass der dritte Parameter (der "-0" -Teil) ein "Zähler" ist, falls Sie mehr als eine Tastatur des gleichen Typs haben.

Um die Feststelltaste auf meiner externen Tastatur auszuschalten, kann ich jetzt Folgendes verwenden:

defaults -currentHost write -g com.apple.keyboard.modifiermapping.1118-219-0 -array-add '<dict><key>HIDKeyboardModifierMappingDst</key><integer>-1</integer><key>HIDKeyboardModifierMappingSrc</key><integer>0</integer></dict>'

Der Vollständigkeit halber finden Sie hier eine Liste der möglichen Schlüsselcodes ( aus Mac OS X Hints) ):

  • Keine - –1
  • Feststelltaste - 0
  • Shift (Links) - 1
  • Steuerung (links) - 2
  • Option (links) - 3
  • Befehl (links) - 4
  • Tastatur 0 - 5
  • Hilfe - 6
  • Umschalt (rechts) - 9
  • Steuerung (rechts) - 10
  • Option (rechts) - 11
  • Befehl (rechts) - 12

Update: Dank Lauri Ranta gibt es hier einen Befehl, der für Bluetooth- und USB-Tastaturen funktioniert:

ioreg -n IOHIDKeyboard -r | grep -e 'class IOHIDKeyboard' -e VendorID\" -e Product

Das gibt Ihnen etwas andere Ausgabe:

+-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x100000489, registered, matched, active, busy 0 (0 ms), retain 8>
  |   "Product" = "Apple Wireless Keyboard"
  |   "VendorID" = 1452
  |   "ProductID" = 570

Verwenden Sie nicht die kürzere Version des Standardwerts '{ HIDKeyboardModifierMappingDst = -1; HIDKeyboardModifierMappingSrc = 0; }', den Sie auf einigen Websites finden. Zumindest für mich werden die Werte "-1" und "0" im Diktat dann als Zeichenfolgen interpretiert, nicht als ganze Zahlen. Das führt zu einem seltsamen Zustand, in dem in den Einstellungen die geänderten Zusatztasten angezeigt werden, die Tastatur sich jedoch nicht so verhält.
Orangenhain

1
ioreg -n IOHIDKeyboard -rwürde auch Bluetooth-Tastaturen einschließen.
Lri

Ich habe das getan, aber es scheint keine Wirkung zu haben. Muss ich etwas neu starten, damit es funktioniert?
SimonW

1
@SimonW das habe ich auch erlebt. Ich habe festgestellt, dass durch einfaches Aus- und erneutes Anmelden die Einstellung wirksam wird.
Ryan Long

Das macht keinen Spaß :(
SimonW

1

Ich konnte auch keine defaults write.plist-Dateien abrufen (oder aktualisieren), um die Einstellungen für HIDKeyboardModifierMappingSrc und HIDKeyboardModifierMappingDst unter zu beeinflussen Snow Leopard zu beeinflussen .

Ich versuche, mein Gastkonto vorab zu füllen, um meine PS2-zu-USB-Tastatur zu unterstützen (bei der anscheinend Option und Befehl vertauscht wurden). Durch "Abmelden" des Gastkontos werden alle meine Änderungen gelöscht.

(ICH habe meine Plist-Dateien "com.apple.dock" und "com.apple.menuextra.clock" erfolgreich aktualisiert, um das Dock bzw. die 24-Stunden-Uhr anzupassen. Dies macht es noch frustrierender, dass die Keyboard Modifiers gewonnen haben. ' nicht funktionieren ...)

Ich habe versucht, mit "dtruss -asf" zu vergleichen, was "System Preferences.app" macht (was anscheinend funktioniert), was "Defaults" macht. Soweit ich es beurteilen kann, sehe ich Nachrichten in folgender Form:

   Foundation`+[__NSOperationInternal _observeValueForKeyPath:ofObject:changeKind:oldValue:newValue:indexes:context:]+0x151
   Foundation`NSKeyValueNotifyObserver+0x81
   Foundation`NSKeyValueDidChange+0x1ca
   Foundation`-[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:usingBlock:]+0x176

Wenn jemand eine Lösung gefunden hat, die unter Snow Leopard funktioniert, würde ich mich freuen, sie zu hören ...


1

Das Problem ist, dass ich jedes Mal, wenn ich meine Tastatur einstecke, eine andere ID in ioreg bekomme. Ich muss nur den Befehl und die Apfeltasten tauschen.

Ich habe mich entschlossen, dieses Problem in meinem Fall mit AppleScript und der GUI für die Systemeinstellungen auf "falsche Weise" zu lösen. Es ist ein hässlicher Hack, aber es funktioniert! Ihr Kilometerstand kann variieren.

--The beginning of the name of the target keyboard (to type into the drop-down selection list)
set keyboardName to "natural"

--reboot system preferences to make GUI state more predictable
tell application "System Preferences"
    quit
    delay 1
    activate
    delay 1
    activate
end tell

tell application "System Events"

    --Bring up keyboard prefs
    key code 53 --escape
    keystroke "f" using command down
    delay 0.5
    key code 53 --escape
    keystroke "keyboard"
    delay 0.5
    key code 36 --return
    delay 1

    --Open modifier keys submenu
    repeat 4 times
        keystroke tab using shift down
        --delay 0.1
    end repeat
    --delay 0.1
    keystroke space
    delay 0.1

    --Select keyboard
    keystroke space
    keystroke keyboardName
    keystroke return
    delay 0.1

    --Select "option key" drop-down
    repeat 3 times
        keystroke tab
    end repeat

    delay 0.5

    --Open drop-down and go to top
    keystroke space
    delay 0.1
    repeat 4 times
        key code 126 --up arrow
    end repeat

    --Select "command" option
    repeat 3 times
        key code 125 --down arrow
    end repeat
    delay 0.1

    keystroke return

    -- Select "command key" drop-down
    keystroke tab
    delay 0.1

    --Open drop-down and go to top
    keystroke space
    delay 0.1
    repeat 4 times
        key code 126 --up arrow
    end repeat

    --Select "command" option
    repeat 2 times
        key code 125 --down arrow
    end repeat
    delay 0.1

    keystroke return
    delay 0.1

    --Commit changes! phew.
    keystroke return
end tell

0
  • Bist du gelaufen? diff , um zu überprüfen, ob Sie diese Datei genau wie die Benutzeroberfläche erstellen?
  • Führen Sie fs_usageoder aus lsof, um herauszufinden, was bei Verwendung der Benutzeroberfläche noch getan wird.

fs_usagezeigt nichts interessantes AFAICT, und ich habe (mit meinem modifizierten Befehl im Kommentar zur Frage) überprüft, dass das Ergebnis so angezeigt wird, wie man es erwarten würde.
Daniel Beck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.