Comment remapper une clé dans macOS Sierra, par exemple, Alt droite à droite Control?

46

J'avais l'habitude d'utiliser Karabiner pour remapper Right Alt vers Right Control (en tant qu'utilisateur Emacs j'utilise Control BEAUCOUP plus qu'Alt) mais la mise à jour vers Sierra a cassé cela. La rétrogradation n'est pas une option.

Comment remapper manuellement des clés dans Sierra? Je voudrais spécifiquement remapper Right Alt à Right Control.

Steven C. Howell
la source

Réponses:

40

La note technique TN2450 d'Apple décrit comment remapper des clés. L'exécution de la commande suivante remappera Right Alt pour devenir Right Control.

hidutil property --set '{"UserKeyMapping":
    [{"HIDKeyboardModifierMappingSrc":0x7000000e6,
      "HIDKeyboardModifierMappingDst":0x7000000e4}]
}'

Notez que la commande ci-dessus ne fait pas basculer les commandes Alt droite et Droite. Ils seront tous les deux le bon contrôle. Si vous avez un MacBook, vous ne le remarquerez pas avant de brancher un clavier externe. Si vous souhaitez commuter Alt droite et Contrôle droit, vous devez ajouter une deuxième commande de commutateur, comme la suivante.

hidutil property --set '{"UserKeyMapping":
    [{"HIDKeyboardModifierMappingSrc":0x7000000e4,
      "HIDKeyboardModifierMappingDst":0x7000000e6},
     {"HIDKeyboardModifierMappingSrc":0x7000000e6,
      "HIDKeyboardModifierMappingDst":0x7000000e4}]
}'

Le tableau au bas de la note technique contient une liste de valeurs hexadécimales pour chaque clé. Pour généraliser la réponse ci-dessus pour changer de clé, vous devez orutiliser la valeur hexadécimale de cette liste avec 0x700000000. Le code Python suivant illustre une façon de procéder.

In [1]: def convert(val):
   ...:     int_val = int(val, 16)
   ...:     int_ref = 0x700000000
   ...:
   ...:     return hex(int_ref | int_val)
   ...:

In [2]: r_alt = '0xE6'

In [3]: print(convert(r_alt))
0x7000000e6
Steven C. Howell
la source
Bien - merci! Existe-t-il un moyen de restaurer les mappages à leurs valeurs par défaut avec cette commande?
Aᴄʜᴇʀᴏɴғᴀɪʟ
1
@ Cᴀʟʟᴏᴅᴀᴄɪᴛʏ pour réinitialiser une clé, il vous suffit d'exécuter à nouveau la commande avec la valeur de cette clé dans Srcet Dst.
Steven C.Howell
Cela revient au redémarrage. Je peux réexécuter cette commande à chaque démarrage, mais je préfère ne pas le faire. Y a-t-il un moyen de rendre cela permanent?
Firebush
2
@firebush Cet article suggère d'utiliser un hook de connexion pour rendre les commandes comme celle-ci persistantes: stackoverflow.com/a/46460200/629530
firebush
1
@ StevenC.Howell Et les combinaisons de modificateurs de fonction? Par exemple, la barre oblique vers l'arrière \ de mon clavier est celle Shift+Option+7que je voudrais remplacer par quelque chose de plus simple comme celui Option+.que j'utilise à peine. Comment je fais ça? Merci de votre aide.
Nanashi No Gombe
15

Une approche plus générale et conviviale consiste à utiliser Karabiner-Elements , qui est une version de Karabiner qui fonctionne sur Sierra.

mikaraento
la source
2
Mise à jour rapide sur Karabiner-Elements . Cela fonctionne sur macOS High Sierra 10.13.3 (17D102). J'ai réussi à échanger mes touches de commande et d'option de droite.
Steve Clement
Les applications tierces ne sont jamais "plus générales". Pourquoi quelqu'un encombrerait-il son système avec des applications faisant des choses qui sont intégrées directement dans le système d'exploitation?
Bachsau
1
@Bachsau est plus général car il vous permet de faire beaucoup d'autres choses, par exemple, configurer des combinaisons de touches, des macros et des profils, ou utiliser des configurations de mappage partagées et / ou fractionnées pour tous les claviers internes et externes.
Janosch
@Bachsau Je garde des profils différents pour chacun de mes claviers, donc ils fonctionnent de la même manière. Très belle application
AlexG
10

Ceci est un addendum à la réponse de Steven C. Howell.

J'ai un nouveau MacBook Pro avec un clavier scandinave. Ce nouveau modèle n'a plus de touche Esc, ce qui est un handicap important pour moi.

J'ai découvert que ce qui suit traduira la touche § (en haut à gauche, à gauche de 1 et au-dessus de la touche de tabulation) - que je ne pense pas avoir utilisé pour quoi que ce soit avant aujourd'hui - pour produire Esc.

hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000029}]}'

Dans la documentation d'Apple (liée à la réponse de Steven), cela est étiqueté comme "Clavier non américain \ et |" (0x64).

Plusieurs des touches «non américaines» sont difficiles à découvrir car elles se réfèrent généralement à des touches qui ont une étiquette différente sur le clavier que vous utilisez. (J'ai également découvert que "Accent grave et tilde" se réfère à la touche entre le décalage gauche et z, qui sur mon clavier produit <. Je n'ai pas pu déterminer quelle touche correspond à "Non US #et ~" et je n'ai pas expérimenté davantage une fois que j'ai trouvé ma clé.) Si vous voulez expérimenter, essayez d'exécuter le script dans le terminal jusqu'à ce que vous trouviez la clé dont vous avez besoin:

for ((i=1;i<=128;++i)); do
    printf '0x7000000%0x\n' "$i"
    printf '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x7000000%0x,"HIDKeyboardModifierMappingDst":0x70000000a}]}' "$i" |
    xargs -0 hidutil property --set >/dev/null
    read -p "Type some stuff: "
    hidutil property --set '{"UserKeyMapping":[{}]}' >/dev/null
done

Cela boucle sur les codes clés et change un à la fois, dans l'espoir que vous puissiez trouver par essais et erreurs une clé qui ne vous est pas particulièrement utile. Essayez de taper quelque chose quand il vous le demande - si vous obtenez un gau lieu de ce que vous attendiez, vous avez trouvé le bon code clé. (Passez 0x70000000aà autre chose si ce gn'est pas un choix pratique pour vous. Peut-être que vous voulez remapper la gclé?) Lorsque vous avez terminé de taper, appuyez simplement sur Entrée pour passer à la touche suivante.

Pour ce que ça vaut, la dernière commande dans la boucle est la façon dont vous zappez tous les UserKeyMappingparamètres:

hidutil property --set '{"UserKeyMapping":[{}]}'

Lorsque vous exécutez initialement, hidutil property --get UserKeyMappingil produit

(null)

mais il semble que vous ne puissiez pas réinjecter cette valeur pour zapper le paramètre (ou plutôt, il accepte mais ignore cette entrée).

(Si vous n'êtes pas familier avec le terminal, il suffit de copier / coller la chose à partir forjusqu'à ce que donevotre bash$message ou similaire.)

Conformément à cette question relative au débordement de pile, vous pouvez placer la commande dans un fichier de script dans votre répertoire personnel et l'ajouter à votre launchdconfiguration pour rendre cette modification persistante.

Si certains lecteurs ne sont pas à l'aise de le faire par eux-mêmes, voici un script rapide qui le fait pour vous. Encore une fois, copiez / collez simplement cela à l'invite du terminal.

mkdir -p "$HOME"/bin
printf '%s\n' '#!/bin/sh' \
    'hidutil property --set '"'"'{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000029}]}'"'" \
    >"$HOME"/bin/userkeymapping
chmod 755 "$HOME"/bin/userkeymapping
cat<<: >"$HOME"/Library/LaunchAgents/userkeymapping.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>Label</key>
    <string>userkeymapping</string>
    <key>ProgramArguments</key>
    <array>
        <string>$HOME/bin/userkeymapping</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
:
launchctl load "$HOME"/Library/LaunchAgents/userkeymapping.plist

Évidemment, si vous vous retrouvez avec une autre clé que 0x700000064vous devez changer cela dans le script ou dans le fichier "$HOME"/bin/userkeymappingqu'il finit par créer si vous avez déjà exécuté ce qui précède.

tripleee
la source
1
Une version antérieure de cette réponse préconisait l'utilisation, LoginHookmais cela ne fonctionnait pas pour moi, et basé sur stackoverflow.com/a/22872222/874188, je suis passé à une launchdapproche à la place.
tripleee
1
En tant que passionné de vi / vim, c'est précisément ce que je cherchais. Merci.
Philip Kearns
7

Si tout ce que vous voulez faire est de remapper une seule clé

Exemple: comment remapper la touche d'échappement sur Mac

  1. Allez dans le menu  Apple et choisissez "Préférences Système" puis allez dans le panneau de préférences "Clavier" et choisissez l'onglet "Clavier"

  2. Cliquez sur le bouton «Touches de modification» dans le coin inférieur droit

  3. Choisissez la touche que vous souhaitez remapper et modifier pour exécuter la fonction d'échappement: Verrouillage des majuscules (notre recommandation), Contrôle, Option ou Commande
  4. Sélectionnez «Escape» dans la liste déroulante correspondant à la clé que vous souhaitez remapper en tant que clé d'échappement matérielle, puis cliquez sur «OK» pour définir la modification

référence

jasonleonhard
la source
2
Cela vous donne uniquement le contrôle sur les quatre clés qui sont énumérées dans cette réponse.
tripleee
Correct et très utile. Si quelqu'un veut remapper des clés supplémentaires, pensez au mousqueton
jasonleonhard
Il semble qu'il n'y ait aucun moyen de spécifier une clé spécifique, comme "right ⌥", non plus. Le plus spécifique que vous pouvez obtenir est le signal, comme dans "tout any".
Merchako
Correct, mais la bonne partie est que vous n'avez rien à installer, cela fonctionne.
jasonleonhard
0

Dans le cas où vous pourriez vouloir restaurer les valeurs par défaut:

# setting it to 'null' does not work on my MBP High Sierra
hidutil property --set '{"UserKeyMapping":[]}'
clarkttfu
la source