Cambio de teclas modificadoras desde la línea de comando


13

Como gran usuario de Emacs, me gusta reasignar mi tecla Bloq Mayús para que funcione como la tecla Ctrl. Hay un diálogo conveniente en el Panel de preferencias del teclado para hacerlo. Pero el problema es que esta configuración se pierde después de que alguien inicia sesión en otra cuenta que no tiene esta preferencia establecida.

Entonces, ¿hay alguna manera de hacer lo mismo que el cuadro de diálogo del panel de preferencias desde la línea de comandos?


2
Posible duplicado de la actualización de asignaciones de teclas modificadoras a través de la herramienta de comando predeterminada . Aunque la otra pregunta es históricamente más nueva, tiene una respuesta mejor (que realmente funciona).
techraf

Respuestas:


7

Al cambiar las preferencias y la ejecución, le defaults -currentHost read -gmuestra qué cambios se están escribiendo. Iba a escribir un breve script bash para automatizarlo, pero parece que fui golpeado hasta el golpe:

#!/bin/bash                                                                      

mappingplist=com.apple.keyboard.modifiermapping

if [ $1 == "emacs" ]; then
    echo "Switching to emacs modifiers"
    defaults -currentHost write -g $mappingplist '(                              
                {                                                                
            HIDKeyboardModifierMappingDst = 4;                                   
            HIDKeyboardModifierMappingSrc = 2; },                                
                {                                                                
            HIDKeyboardModifierMappingDst = 12;                                  
            HIDKeyboardModifierMappingSrc = 10;                                  
        },                                                                       
                {                                                                
            HIDKeyboardModifierMappingDst = 2;                                   
            HIDKeyboardModifierMappingSrc = 4;                                   
        },                                                                       
                {                                                                
            HIDKeyboardModifierMappingDst = 10;                                  
            HIDKeyboardModifierMappingSrc = 12;                                  
        })'


else
    echo "Switching to default modifiers"
    defaults -currentHost delete -g $mappingplist
fi

El script toma un argumento, si el argumento es emacs, intercambia comando y control, si el argumento es cualquier otra cosa, restaura los valores predeterminados.

http://forums.macrumors.com/showthread.php?t=949280


No parece funcionar de mí aquí con Snow Leopard, pero es claramente un paso en la dirección correcta.
pantulis

@pith ... ¿qué hace la -gbandera? No vi eso en la página del manual para defaults. Además, parece que está intercambiando dos conjuntos de valores: 4 con 2 y 10 con 12, aunque solo hay dos modificadores que cambian. ¿Puedes dar más detalles o simplemente miraste la salida pero no sabes lo que realmente representan? (Al principio sospeché cuatro códigos clave, dos a la izquierda, dos a la derecha, pero no parecen ser códigos clave, al menos no según lo informado por el controlador del teclado.)
Mark A. Donohoe

Hago las asignaciones como sugiere, pero no parece surtir efecto, aunque en la interfaz de usuario parece mapeado. Solo hacerlo a través de la interfaz de usuario parece funcionar ... ¿Alguna idea?
SimonW


2

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

defaults -currentHost write -g com.apple.keyboard.modifiermapping.1133-50475-0 -array '<dict><key>HIDKeyboardModifierMappingSrc</key><integer>0</integer><key>HIDKeyboardModifierMappingDst</key><integer>2</integer></dict>

Cambie 1133y 50475a las ID de proveedor y producto mostradas por ioreg -n IOHIDKeyboard -r. src 0y dst -1sería desactivar caps lock.

defaults -currentHost write -g modifica:

~/Library/Preferences/ByHost/.GlobalPreferences.*.plist

Debe cerrar sesión y volver a iniciarla para aplicar los cambios. Si los valores son cadenas (como en la respuesta de @pithyless), los cambios se muestran en Preferencias del sistema pero no tienen ningún efecto.

Valores de claves :

-1 none
0 caps lock
1 left shift
2 left control
3 left option
4 left command
5 keypad 0
6 help
9 right shift
10 right control
11 right option
12 right command

0

Combinando algunas respuestas juntas, se me ocurrió este script que parece funcionar ( mapeando Caps-lock a Control ).

$ keyboard_id = "$(ioreg -n IOHIDKeyboard -r | grep -e VendorID\" -e ProductID | tr -d \"\|[:blank:] | cut -d\= -f2 | tr '\n' -)"
$ defaults -currentHost write -g "com.apple.keyboard.modifiermapping.${keyboard_id}0" '(
{
  HIDKeyboardModifierMappingDst = 2;
  HIDKeyboardModifierMappingSrc = 0;
})'

El único problema es que no parece tener ningún efecto ... :(

Lo actualizaré si lo consigo para que funcione.


0

Quería intercambiar comando de la derecha con opción correcta únicas teclas.

Cuando configuro el intercambio global de comandos y opciones en Preferencias del sistema ...> Teclado> Teclas modificadoras ..., hay la siguiente configuración en el sistema (que funciona como se esperaba):

$ defaults -currentHost read -g com.apple.keyboard.modifiermapping.1452-591-0
(
        {
        HIDKeyboardModifierMappingDst = 30064771299;
        HIDKeyboardModifierMappingSrc = 30064771298;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771303;
        HIDKeyboardModifierMappingSrc = 30064771302;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771298;
        HIDKeyboardModifierMappingSrc = 30064771299;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771302;
        HIDKeyboardModifierMappingSrc = 30064771303;
    }
)

Pero cuando lo modifico, para intercambiar solo el lado derecho como se muestra a continuación, no funciona:

$ defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-591-0 '(
        {
        HIDKeyboardModifierMappingDst = 30064771303;
        HIDKeyboardModifierMappingSrc = 30064771302;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771302;
        HIDKeyboardModifierMappingSrc = 30064771303;
    }
)'

Es porque los valores se escriben como cadenas, no 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>'

Al final, debe cerrar sesión e iniciar sesión nuevamente.


¿Conseguiste que esto funcionara? ¿Es necesario reiniciar quizás?
William

Ah, sí. Debe cerrar sesión e iniciar sesión nuevamente.
Virus_7

Estoy tratando de responder a esta pregunta apple.stackexchange.com/questions/280855/… ¿Puedes chatear tal vez? chat.stackexchange.com/rooms/38/ask-different-chat Intenté ejecutar tu último comando y no cambia nada para mí.
William

En primer lugar, elimine Karabiner-Elements y adapte el código del teclado (1452-591-0) y los códigos de tecla (30064771302, 30064771303) a su sistema.
Virus_7
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.