Modification des touches de modification à partir de la ligne de commande

13

En tant qu'utilisateur lourd d'Emacs, j'aime remapper ma touche de verrouillage des majuscules pour qu'elle fonctionne comme la touche Ctrl. Il y a une boîte de dialogue pratique dans le volet des préférences du clavier pour le faire. Mais le problème est que ce paramètre est perdu après que quelqu'un se connecte à un autre compte qui n'a pas cet ensemble de préférences.

Existe-t-il un moyen de faire la même chose que la boîte de dialogue du volet des préférences à partir de la ligne de commande?

pantulis
la source
2
Copie possible de la mise à jour des mappages de touches de modification via l'outil de commande par défaut . Bien que l'autre question soit historiquement plus récente, elle a une meilleure réponse (qui fonctionne réellement).
techraf

Réponses:

7

Modification des préférences et exécution, defaults -currentHost read -gvous montre quelles modifications sont en cours d'écriture. J'allais écrire un court script bash pour l'automatiser, mais on dirait que j'ai été battu au poinçon:

#!/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

Le script prend un argument, si l'argument est emacs, puis il échange la commande et le contrôle, si l'argument est autre chose, il restaure les valeurs par défaut.

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

sans moelle
la source
Cela ne semble pas fonctionner de ma part ici avec Snow Leopard, mais c'est clairement un pas dans la bonne direction.
pantulis
@pith ... que fait le -gdrapeau? Je ne l'ai pas vu dans la page de manuel de defaults. En outre, cela ressemble à l'échange de deux ensembles de valeurs: 4 avec 2 et 10 avec 12, mais il n'y a que deux modificateurs qui changent. Pouvez-vous élaborer, ou avez-vous simplement regardé les résultats mais ne savez pas ce qu'ils représentent réellement? (Au début, je soupçonnais quatre codes clés - deux à gauche, deux à droite - mais ils ne semblent pas être des codes clés, du moins pas tels que rapportés par le conducteur du clavier.)
Mark A. Donohoe
Je fais les mappages comme vous le suggérez, mais cela ne semble pas prendre effet bien que dans l'interface utilisateur, il semble mappé. Le faire uniquement via l'interface utilisateur semble fonctionner ... Des idées?
SimonW
3

Vous pouvez utiliser KeyRemap4MacBook avec PCKeyBoardHack . Il vous permet également d'utiliser les clés Emacs dans n'importe quelle application Mac, y compris celles qui n'utilisent pas Cocoa telles que les applications MS.

Matti Pastell
la source
2

Dans "Mise à jour des mappages de touches de modification via l'outil de commande par défaut" :

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>

Modifiez 1133et 50475les ID fournisseur et produit indiqués par ioreg -n IOHIDKeyboard -r. src 0et dst -1désactiverait caps lock.

defaults -currentHost write -g modifie:

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

Vous devez vous déconnecter et vous reconnecter pour appliquer les modifications. Si les valeurs sont des chaînes (comme dans la réponse de @pithyless), les modifications sont affichées dans les Préférences Système mais elles n'ont aucun effet.

Valeurs des clés :

-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
Lri
la source
0

En combinant quelques réponses ensemble, j'ai trouvé ce script qui semble fonctionner ( mappage du verrouillage des majuscules au contrôle ).

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

Seul problème qui ne semble pas avoir d'effet ... :(

Je mettrai à jour si je le fais fonctionner.

SimonW
la source
0

Je voulais échanger la commande droite avec les touches d' option droite uniquement.

Lorsque je configure l' échange global de commandes et d' options dans Préférences Système ...> Clavier> Touches de modification ..., il y a la configuration suivante dans le système (qui fonctionne comme prévu):

$ 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;
    }
)

Mais quand je le modifie, pour échanger uniquement le côté droit comme ci-dessous - cela ne fonctionne pas:

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

C'est parce que les valeurs sont écrites sous forme de chaînes et non d'entiers. Vous pouvez le voir en utilisant:

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

Donc, la bonne façon de mettre à jour le paramètre utilise le format 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>'

À la fin, vous devez vous déconnecter et vous reconnecter.

Virus_7
la source
L'avez-vous fait fonctionner, je ne peux pas le dire? Un redémarrage est-il nécessaire peut-être?
William
Ah oui. Vous devez vous déconnecter et vous reconnecter.
Virus_7
J'essaie de répondre à cette question apple.stackexchange.com/questions/280855/… Pouvez-vous discuter peut-être? chat.stackexchange.com/rooms/38/ask-different-chat J'ai essayé d'exécuter votre dernière commande et cela ne change rien pour moi.
William
Tout d'abord, supprimez Karabiner-Elements et adaptez le code du clavier (1452-591-0) et les codes des touches (30064771302, 30064771303) à votre système.
Virus_7