Como remapear uma chave no macOS Sierra, por exemplo, Alt Alt a Right Control?

45

Eu costumava usar o Karabiner para remapear o Alt Alt para o Right Control (como usuário do Emacs eu uso o Control MUITO mais que o Alt), mas a atualização para o Sierra quebrou isso. O downgrade não é uma opção.

Como remapear manualmente as chaves no Sierra? Eu gostaria especificamente de remapear Alt Alt a Right Control.

Steven C. Howell
fonte

Respostas:

40

A Nota técnica da Apple TN2450 descreve como remapear as chaves. A execução do comando a seguir remapeará Alt Direito para Controle Certo.

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

Observe que o comando acima não está alternando o Alt direito e o controle direito. Ambos serão o Controle Certo. Se você possui um MacBook, não notará isso até conectar um teclado externo. Se você deseja alternar Alt Alt e Right Control, é necessário adicionar um segundo comando de alternância, como o seguinte.

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

A tabela na parte inferior da Nota técnica possui uma lista de valores hexadecimais para cada chave. Para generalizar a resposta acima para alternar qualquer tecla, você deve orusar o valor hexadecimal dessa lista 0x700000000. O código Python a seguir demonstra uma maneira de fazer isso.

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
fonte
Nice - obrigado! Existe alguma maneira de restaurar os mapeamentos para os padrões com este comando?
Aᴄʜᴇʀᴏɴғᴀɪʟ
1
@ Cᴀʟʟᴏᴅᴀᴄɪᴛʏ para redefinir qualquer chave, basta executar o comando novamente com o valor dessa chave em ambos Srce Dst.
9138 Steven C. Howell #
Isso reverte na reinicialização. Eu posso executar novamente este comando em cada inicialização, mas prefiro não fazer isso. Existe uma maneira de tornar isso permanente?
Firebush #
2
@firebush Este post sugere o uso de um gancho de login para fazer comandos como este persistente: stackoverflow.com/a/46460200/629530
firebush
1
@ StevenC.Howell Que tal combinações de modificadores de função? Por exemplo, a barra invertida \ no teclado é Shift+Option+7que eu gostaria de substituir por algo mais simples, como o Option+.que eu quase não uso. Como faço isso? Obrigado pela ajuda.
Nanashi No Gombe
15

Uma abordagem mais geral e fácil de usar é usar o Karabiner-Elements , que é uma versão do Karabiner que funciona no Sierra.

mikaraento
fonte
2
Atualização rápida no Karabiner-Elements . Funciona no macOS High Sierra 10.13.3 (17D102). Troquei com sucesso as teclas Command e Option corretas.
21818 Steve Clement
Aplicativos de terceiros nunca são "mais gerais". Por que alguém iria sobrecarregar seu sistema com aplicativos fazendo coisas que são incorporadas diretamente no sistema operacional?
Bachsau 23/06
1
O @Bachsau é mais geral, pois permite que você faça muitas outras coisas, por exemplo, definir combinações de teclas, macros e perfis ou usar configurações de mapeamento compartilhado e / ou dividido para qualquer teclado interno e externo.
Janosch
@Bachsau Eu mantenho perfis diferentes para cada um dos meus teclados, para que funcionem da mesma forma. Muito bom app
AlexG 25/11
9

Este é um adendo à resposta de Steven C. Howell.

Eu tenho um novo MacBook Pro com um teclado escandinavo. Este novo modelo não tem mais uma tecla Esc, o que é uma desvantagem significativa para mim.

Descobri que o seguinte traduzirá a tecla § (canto superior esquerdo, esquerdo de 1 e acima da tecla tab) - que eu acho que nunca usei para nada antes de hoje - para produzir Esc.

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

Na documentação da Apple (vinculada à resposta de Steven), isso é rotulado como "Teclado fora dos EUA \ e |" (0x64).

Várias das teclas "fora dos EUA" são difíceis de descobrir porque geralmente se referem a teclas com um rótulo diferente no teclado que você está usando. (I também descoberto que "acento e til Grave" refere-se a chave entre desvio para a esquerda e z, que no meu teclado produz <. I não foi capaz de estabelecer que corresponde chave para "não-US #e ~" e não experimentar mais uma vez I encontrado minha chave.) Se você quiser experimentar, tente executar o script no terminal até encontrar a chave que precisa:

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

Isso percorre os códigos de chave e muda um de cada vez, na esperança de que você possa encontrar, por tentativa e erro, uma chave que não é particularmente útil para você. Tente digitar algo quando solicitado - se você receber um em gvez do que esperava, encontrou o código da chave certo. (Mude 0x70000000apara outra coisa se gnão for uma opção conveniente para você. Talvez você queira remapear a gtecla?) Quando terminar de digitar, basta pressionar Enter para prosseguir para a próxima tecla.

Pelo que vale, o último comando dentro do loop é como você zap todas as UserKeyMappingconfigurações:

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

Quando você executa inicialmente hidutil property --get UserKeyMapping, produz

(null)

mas parece que você não pode alimentar esse valor para zap a configuração (ou melhor, ele aceita, mas ignora essa entrada).

(Se você não estiver familiarizado com o Terminal, basta copiar / colar o item foraté o doneseu bash$prompt ou similar.)

De acordo com a pergunta Stack Overflow relacionada, você pode colocar o comando em um arquivo de script no diretório inicial e adicioná-lo à sua launchdconfiguração para tornar essa alteração persistente.

Caso alguns leitores não se sintam à vontade para fazer isso sozinhos, aqui está um script rápido que faz isso por você. Novamente, basta copiar / colar isso no prompt do 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

Obviamente, se você acabou com outra chave que 0x700000064não a alterada no script ou no arquivo, "$HOME"/bin/userkeymappingela será criada se você já executou o procedimento acima.

triplo
fonte
Uma versão anterior desta resposta defendia o uso, LoginHookmas não estava funcionando para mim, e com base no stackoverflow.com/a/22872222/874188 , mudei para uma launchdabordagem.
tripleee 27/02
Como um fervoroso fã do vi / vim, é exatamente isso que eu estava procurando. Obrigado.
Philip Kearns
7

Se tudo o que você deseja fazer é remapear uma única chave

Exemplo: Como mapear novamente a tecla Escape no Mac

  1. Vá para o menu Apple e escolha “Preferências do sistema” e, em seguida, vá para o painel de preferências “Teclado” e escolha a guia “Teclado”.

  2. Clique no botão "Modifier Keys" no canto inferior direito

  3. Escolha a tecla que deseja remapear e modificar para executar a função Escape: Caps Lock (nossa recomendação), Controle, Opção ou Comando
  4. Selecione "Escape" na lista suspensa correspondente à chave que você deseja remapear como uma tecla Escape de hardware e clique em "OK" para definir a alteração

referência

jasonleonhard
fonte
2
Isso apenas lhe dá controle sobre as quatro chaves que são enumeradas nesta resposta.
tripleee
Correto e muito útil. Se alguém quiser remapear chaves adicionais, considere karabiner
jasonleonhard
Parece que também não há como especificar uma chave específica, como "right ⌥". O mais específico que você pode obter é o sinal, como em "qualquer ⌥".
Merchako
Correto, mas a parte boa é que você não precisa instalar nada, apenas funciona.
jasonleonhard
0

Caso você queira restaurar os padrões:

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