Actualización de asignaciones de teclas modificadoras a través de la herramienta de comandos predeterminados

Estoy tratando de automatizar la configuración inicial de mi macbook, que incluye instalar software y cambiar la configuración de OS X según mis necesidades.

He intentado actualizar las teclas modificadoras con los valores predeterminados, el código es el siguiente:

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

El problema parece que incluso si se cambia el patrón, las Preferencias del sistema no detectan la actualización, ni siquiera reinician la computadora.

¿Hay alguna forma de realizar esta operación en Snow Leopard?

Gracias.

usar en su defaults -currentHost write -g key 'value'lugar. Aunque todavía no funciona.
Este tipo intenta algo similar y también falla. ¿Las secuencias de comandos de GUI de AppleScript serían una opción viable para usted?

Respuestas (4)

Es importante que el defaultscomando use la "ID de teclado" correcta en la clave, parece ser:com.apple.keyboard.modifiermapping.$VendorID-$ProductID-0

Por ejemplo, el teclado interno de mi MacBook Air usa: com.apple.keyboard.modifiermapping.1452-579-0, mientras que el teclado externo de mi iMac usacom.apple.keyboard.modifiermapping.1118-219-0

¿Cómo obtener el "ID de teclado" correcto? En la línea de comando puedes usar:

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

para obtener una lista de sus dispositivos USB con los parámetros relevantes:

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

Supongo que el tercer parámetro (la parte "-0") es un "contador", en caso de que tenga más de un teclado del mismo tipo.

Entonces, para desactivar la tecla Bloq Mayús en mi teclado externo, ahora puedo usar:

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

Y, para completar, aquí hay una lista de posibles códigos clave para usar ( de Mac OS X Sugerencias ):

  • Ninguno — –1
  • Bloqueo de mayúsculas — 0
  • Desplazamiento (izquierda) — 1
  • Control (izquierda) — 2
  • Opción (izquierda) — 3
  • Comando (izquierda) — 4
  • Teclado 0 — 5
  • Ayuda — 6
  • Desplazamiento (derecha) — 9
  • Control (Derecha) — 10
  • Opción (derecha) — 11
  • Comando (Derecha) — 12

Actualización: gracias a Lauri Ranta, aquí hay un comando que funciona para teclados Bluetooth y USB:

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

lo que te da una salida ligeramente diferente:

+-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x100000489, registered, matched, active, busy 0 (0 ms), retain 8>
  |   "Product" = "Apple Wireless Keyboard"
  |   "VendorID" = 1452
  |   "ProductID" = 570
No use la versión más corta del valor predeterminado que puede encontrar en algunos sitios web, al menos para mí, el "-1" y el "0" en los valores del dict se interpretan como cadenas, no como números enteros . '{ HIDKeyboardModifierMappingDst = -1; HIDKeyboardModifierMappingSrc = 0; }'Eso lleva a un estado extraño en el que Preferencias muestra las teclas modificadoras modificadas, pero el teclado en realidad no se comporta de esa manera.
ioreg -n IOHIDKeyboard -rTambién incluiría teclados Bluetooth.
Hice esto pero no parece tener ningún efecto. ¿Necesito reiniciar algo para que funcione?
@SimonW Experimenté lo mismo. Descubrí que simplemente cerrar la sesión y volver a iniciarla hace que la configuración surta efecto.
eso no es divertido :(
¿Podría usarse en Sierra para que esto funcione ? apple.stackexchange.com/questions/280855/…
Mi nueva MacBook Pro (13 pulgadas, 2017, cuatro puertos Thunderbolt 3) tiene el teclado interno y el trackpad en el bus SPI. Los ioregfiltros anteriores no parecen funcionar. Pude encontrar mi teclado con ioreg -r -c AppleHSSPIDevicey ioreg -r -n "Apple Internal Keyboard / Trackpad".

El problema que tengo es que cada vez que conecto mi teclado, obtiene una ID diferente en ioreg. Todo lo que necesito hacer es intercambiar el comando y las teclas Apple.

Decidí resolver esto en mi caso de la "manera incorrecta" usando AppleScript y la GUI de Preferencias del sistema. Es un truco feo, ¡pero funciona! Su experiencia puede ser diferente.

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

Yo tampoco he podido obtener defaults write(o actualizar archivos .plist) para afectar mi configuración HIDKeyboardModifierMappingSrc y HIDKeyboardModifierMappingDst en Snow Leopard .

Estoy tratando de "rellenar previamente" mi cuenta de invitado para admitir mi teclado PS2 a USB (que aparentemente tiene la opción y el comando intercambiados). Las sugerencias de otras páginas para "cerrar sesión y volver a iniciarla" no ayudan; "cerrar sesión" de la cuenta de invitado elimina todos mis cambios.

(He actualizado con éxito mis archivos plist "com.apple.dock" y "com.apple.menuextra.clock" para personalizar el dock y el reloj de 24 horas, respectivamente, lo que hace que sea aún más frustrante que los modificadores de teclado no funcionen. no funciona...)

Intenté usar "dtruss -asf" para comparar lo que está haciendo "System Preferences.app" (que aparentemente funciona) con lo que está haciendo "predeterminado". Lo más cerca que puedo imaginar, veo mensajes a lo largo de las líneas de:

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

Si alguien ha descubierto una solución que funcione con Snow Leopard, me encantaría escucharla...

  • ¿Ha corrido diffpara verificar que está creando este archivo exactamente como lo haría la interfaz de usuario?
  • Ejecute fs_usageo lsofpara averiguar qué más se está haciendo cuando usa la interfaz de usuario.
fs_usageno muestra nada interesante AFAICT, y verifiqué (con mi comando modificado en el comentario de la pregunta) que el resultado aparece como cabría esperar.