Aktualizacja mapowania klawiszy modyfikatora za pomocą domyślnego narzędzia poleceń

16

Próbuję zautomatyzować początkową konfigurację mojego MacBooka, która obejmuje instalację oprogramowania i zmianę konfiguracji OS X do moich potrzeb.

Próbowałem zaktualizować klucze modyfikatora do wartości domyślnych, kod jest następujący:

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

Problem wydaje się, że nawet jeśli wzorzec zostanie zmieniony, Preferencje systemowe nie wychwycą aktualizacji, nawet nie uruchomią ponownie komputera.

Czy jest jakiś sposób na wykonanie tej operacji w Snow Leopard?

Dzięki.

Robot
źródło
użyj defaults -currentHost write -g key 'value'zamiast tego. Nadal nie działa.
Daniel Beck
1
Ten facet próbuje czegoś podobnego i również mu ​​się nie udało. Czy skrypty GUI AppleScript byłyby dla Ciebie realną opcją?
Daniel Beck

Odpowiedzi:

13

Ważne jest, aby defaultspolecenie używało poprawnego „identyfikatora klawiatury” w klawiszu, wydaje się, że:com.apple.keyboard.modifiermapping.$VendorID-$ProductID-0

Na przykład klawiatura wewnętrzna w moim MacBooku Air używa:, com.apple.keyboard.modifiermapping.1452-579-0natomiast klawiatura zewnętrzna w moim iMacucom.apple.keyboard.modifiermapping.1118-219-0

Jak uzyskać prawidłowy „identyfikator klawiatury”? W wierszu poleceń możesz użyć:

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

aby uzyskać listę urządzeń USB z odpowiednimi parametrami:

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

Domyślam się, że trzeci parametr (część „-0”) to „licznik”, na wypadek, gdy masz więcej niż jedną klawiaturę tego samego typu.

Aby wyłączyć klawisz CapsLock na klawiaturze zewnętrznej, mogę teraz używać:

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

I, dla kompletności, oto lista możliwych kodów kluczy do użycia ( z podpowiedzi Mac OS X ):

  • Brak - –1
  • Caps Lock - 0
  • Shift (w lewo) - 1
  • Sterowanie (lewy) - 2
  • Opcja (z lewej) - 3
  • Dowództwo (w lewo) - 4
  • Klawiatura 0–5
  • Pomoc - 6
  • Shift (w prawo) - 9
  • Sterowanie (z prawej) - 10
  • Opcja (z prawej) - 11
  • Dowództwo (z prawej) - 12

Aktualizacja: dzięki Lauri Ranta oto polecenie, które działa na klawiaturach Bluetooth i USB:

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

co daje nieco inną wydajność:

+-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x100000489, registered, matched, active, busy 0 (0 ms), retain 8>
  |   "Product" = "Apple Wireless Keyboard"
  |   "VendorID" = 1452
  |   "ProductID" = 570
Orangenhain
źródło
Czy nie użyć krótszej wersji wartości ustawienia domyślne '{ HIDKeyboardModifierMappingDst = -1; HIDKeyboardModifierMappingSrc = 0; }', które można znaleźć na niektórych stronach internetowych, przynajmniej dla mnie „-1” i „0” w wartości dict są następnie interpretowane jako ciągi, a nie liczbami całkowitymi. To prowadzi do dziwnego stanu, w którym Preferencje pokazują zmienione klawisze modyfikatora, ale klawiatura tak naprawdę nie zachowuje się w ten sposób.
Orangenhain,
1
ioreg -n IOHIDKeyboard -robejmuje również klawiatury Bluetooth.
Lri
Zrobiłem to, ale wydaje się, że nie przynosi to żadnego efektu. Czy muszę coś ponownie uruchomić, aby działało?
SimonW,
1
@SimonW Doświadczyłem tego samego. Przekonałem się, że po prostu wylogowanie i ponowne zalogowanie powoduje, że ustawienie działa.
Ryan Long,
To nie jest zabawne :(
SimonW,
2

Problemem jest to, że za każdym razem, gdy podłączam klawiaturę, dostaje ona inny identyfikator w ioreg. Wszystko, co muszę zrobić, to zamienić polecenie i klawisze Apple.

Postanowiłem rozwiązać ten problem w moim przypadku „w niewłaściwy sposób” za pomocą AppleScript i GUI Preferencji systemowych. To brzydki hack, ale działa! Twój przebieg może się różnić.

--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
Eliot
źródło
1

Ja również nie byłem w stanie uzyskać defaults write(ani zaktualizować plików .plist), aby wpłynąć na moje ustawienia HIDKeyboardModifierMappingSrc i HIDKeyboardModifierMappingDst w systemie Snow Leopard .

Próbuję „wstępnie wypełnić” moje konto gościa, aby obsługiwać klawiaturę PS2-USB (która najwyraźniej ma zamienione opcje i polecenia). Sugestie innych stron dotyczące „wylogowania się i ponownego zalogowania” nie pomagają; „wylogowanie” z konta gościa usuwa wszystkie moje zmiany.

(Udało mi się zaktualizować moje pliki plist „com.apple.dock” i „com.apple.menuextra.clock”, aby dostosować odpowiednio stację dokującą i zegar 24-godzinny, co jeszcze bardziej frustruje wygraną modyfikatorów klawiatury ” t praca ...)

Próbowałem użyć „dtruss -asf”, aby porównać to, co robi „System Preferences.app” (co najwyraźniej działa) z tym, co robi „default”. Najbliżej mogę zrozumieć, widzę wiadomości wzdłuż:

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

Jeśli ktoś wymyśli rozwiązanie, które działa pod Snow Leopardem, chętnie go usłyszę ...

Dabe
źródło
0
  • Czy diffsprawdziłeś, czy tworzysz ten plik dokładnie tak, jak zrobiłby to interfejs użytkownika?
  • Uruchom fs_usagelub, lsofaby dowiedzieć się, co jeszcze robi się podczas korzystania z interfejsu użytkownika.

źródło
fs_usagenie pokazuje nic ciekawego AFAICT, a ja zweryfikowałem (moim zmodyfikowanym poleceniem w komentarzu do pytania), że wynik jest zgodny z oczekiwaniami.
Daniel Beck