Actualización de asignaciones de teclas modificadoras a través de la herramienta de comando predeterminada

16

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

Intenté 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.

El robot
fuente
utilizar defaults -currentHost write -g key 'value'en su lugar. Aún así no funciona.
Daniel Beck
1
Este chico intenta algo similar y también falló. ¿Las secuencias de comandos de la GUI de AppleScript serían una opción viable para usted?
Daniel Beck

Respuestas:

13

Es importante que el defaultscomando use la "ID de teclado" correcta en la tecla, 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-0mientras que el teclado externo de mi iMac usacom.apple.keyboard.modifiermapping.1118-219-0

¿Cómo obtener la "ID de teclado" correcta? 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 las sugerencias de Mac OS X ):

  • Ninguno - –1
  • Bloqueo de mayúsculas - 0
  • Shift (izquierda) - 1
  • Control (izquierda) - 2
  • Opción (izquierda) - 3
  • Comando (izquierda) - 4
  • Teclado 0 - 5
  • Ayuda - 6
  • Shift (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

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
Orangenhain
fuente
No , no usar la versión más corta del valor por defecto '{ HIDKeyboardModifierMappingDst = -1; HIDKeyboardModifierMappingSrc = 0; }'que se puede encontrar en algunos sitios web, al menos para mí, el "-1" y "0" en los valores de la dict son interpretados como cadenas, no enteros. Eso lleva a un estado extraño donde Preferencias muestra las teclas modificadoras modificadas, pero el teclado en realidad no se comporta de esa manera.
Orangenhain
1
ioreg -n IOHIDKeyboard -rtambién incluiría teclados Bluetooth.
Lri
Hice esto pero no parece tener ningún efecto. ¿Necesito reiniciar algo para que funcione?
SimonW
1
@SimonW Experimenté lo mismo. Descubrí que simplemente cerrar sesión y volver a iniciarla hace que la configuración surta efecto.
Ryan Long
Eso no es divertido :(
SimonW
2

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 de 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
Eliot
fuente
1

Yo tampoco he podido obtener defaults write(o actualizar archivos .plist) que afecten 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 opciones y comandos intercambiados). Las sugerencias de otras páginas para "cerrar y volver a iniciar sesión" no ayudan; "Cerrar sesión" de la cuenta Invitado elimina todos mis cambios.

(Me he actualizado mi éxito "com.apple.dock" y "archivos plist com.apple.menuextra.clock" para personalizar el muelle y el reloj de 24 horas, respectivamente, lo que hace aún más frustrante que los modificadores de teclado ganaron' t trabajo ...)

He intentado usar "dtruss -asf" para comparar lo que está haciendo "System Preferences.app" (que aparentemente funciona) con lo que está haciendo "default". Más cerca que puedo imaginar, veo mensajes en la línea 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 ...

Dabe
fuente
0
  • ¿Has corrido diffpara verificar que estás 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.

fuente
fs_usageno muestra nada interesante AFAICT, y verifiqué (con mi comando modificado en el comentario a la pregunta) que el resultado se muestra como cabría esperar.
Daniel Beck