La actualización de las teclas modificadoras desde la línea de comandos no tiene efecto

El objetivo: asignar "Bloqueo de mayúsculas" a "Control" desde la línea de comandos.

Estoy tratando de actualizar las teclas modificadoras desde la línea de comandos con el siguiente comando como se explica aquí y aquí pero sin ningún efecto.

$ defaults -currentHost write -g "com.apple.keyboard.modifiermapping.1452-611-0" '(
{
  HIDKeyboardModifierMappingDst = 2;
  HIDKeyboardModifierMappingSrc = 0;
})'

Cuando lo hago desde las "Preferencias del sistema", funciona de inmediato y parece estar configurado de la misma manera que cuando lo hago manualmente, como se ve a continuación:

$ defaults -currentHost read -g "com.apple.keyboard.modifiermapping.1452-611-0"
(
        {
        HIDKeyboardModifierMappingDst = 2;
        HIDKeyboardModifierMappingSrc = 0;
    }
)

Este es exactamente el mismo resultado que cuando se ejecuta manualmente o desde la GUI.

Al reiniciar después de ejecutar la línea de comando, veo que en "Preferencias del sistema" está configurado correctamente, como esperaba, pero no funciona. Solo funciona cuando se restablece el valor predeterminado y se configura manualmente.

Incluso intenté copiar el plistarchivo como se sugiere aquí nuevamente sin ningún efecto (incluso con el reinicio).

Luego probé esto sin éxito (ideas de aquí ):

defaults -currentHost write -globalDomain <rest of command>
defaults write NSGlobalDomain <rest of command>
defaults write GlobalPreferences <rest of command>

Ejecutando OSX 10.9.4(Mavrics).

Cualquier idea es bienvenida.

Respuestas (1)

Es porque los valores se escriben como cadenas, no como números enteros. Puedes ver eso usando:

$ plutil -convert xml1 -o - ~/Library/Preferences/ByHost/.GlobalPreferences.*.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.keyboard.modifiermapping.1452-591-0</key>
    <array>
        <dict>
            <key>HIDKeyboardModifierMappingDst</key>
            <string>30064771303</string>
            <key>HIDKeyboardModifierMappingSrc</key>
            <string>30064771302</string>
        </dict>
        <dict>
            <key>HIDKeyboardModifierMappingDst</key>
            <string>30064771302</string>
            <key>HIDKeyboardModifierMappingSrc</key>
            <string>30064771303</string>
        </dict>
    </array>
</dict>
</plist>

Entonces, la forma correcta de actualizar la configuración es usar el formato XML:

$ defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-591-0 -array \
'<dict>
    <key>HIDKeyboardModifierMappingDst</key>
    <integer>30064771303</integer>
    <key>HIDKeyboardModifierMappingSrc</key>
    <integer>30064771302</integer>
</dict>' \
'<dict>
    <key>HIDKeyboardModifierMappingDst</key>
    <integer>30064771302</integer>
    <key>HIDKeyboardModifierMappingSrc</key>
    <integer>30064771303</integer>
</dict>'
Entonces, en el primer ejemplo del OP, ¿crea una matriz, con un objeto en ella, y el valor dentro del objeto es implícitamente una cadena (aunque parecen números)?
Al configurar varios valores a la vez, ¿usar la sintaxis XML es la única forma de hacerlo para especificar tipos? ¿Es obligatorio?
@trusktr Sí, los valores dentro de los objetos PLIST son implícitamente cadenas. No conozco la sintaxis PLIST para forzar que el valor sea entero. Parece que no hay otra forma que usar la sintaxis XML.