Alterando teclas modificadoras na linha de comando


13

Como um usuário pesado do Emacs, gosto de remapear minha tecla Caps Lock para funcionar como a tecla Ctrl. Há uma caixa de diálogo conveniente no Painel de preferências do teclado para fazer isso. Mas o problema é que essa configuração se perde depois que alguém faz login em outra conta que não tem essa preferência definida.

Portanto, existe alguma maneira de fazer o mesmo que a caixa de diálogo do painel de preferências na linha de comando?


2
Possível duplicata de Atualizando mapeamentos de chave do modificador por meio da ferramenta de comando padrão . Embora a outra pergunta seja historicamente mais nova, ela tem uma resposta melhor (realmente funcionando).
techraf

Respostas:


7

Alterando preferências e executando, defaults -currentHost read -gmostra quais alterações estão sendo gravadas. Eu ia escrever um pequeno script bash para automatizá-lo, mas parece que fui derrotado:

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

O script usa um argumento, se o argumento é emacs, troca de comando e controle; se o argumento for qualquer outra coisa, restaura os padrões.

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


Não parece funcionar de mim aqui com o Snow Leopard, mas é claramente um passo na direção certa.
pantulis

@ pith ... o que a -gbandeira faz? Eu não vi isso na página de manual para defaults. Além disso, parece que ele está trocando dois conjuntos de valores: 4 com 2 e 10 com 12, mas existem apenas dois modificadores que são alterados. Você pode elaborar ou simplesmente olhou a saída, mas não sabe o que elas realmente representam? (No começo, eu suspeitava de quatro códigos de tecla - dois à esquerda, dois à direita - mas eles não parecem ser códigos de tecla, pelo menos não como relatado pelo driver do teclado.)
Mark A. Donohoe

Eu faço os mapeamentos como você sugere, mas parece não ter efeito, embora na interface do usuário pareça mapeado. Apenas fazê-lo via interface do usuário parece funcionar ... Alguma idéia?
precisa saber é o seguinte


2

Em "Atualizando mapeamentos de teclas modificadoras por meio da ferramenta de comando padrão" :

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>

Altere 1133e 50475para os IDs do fornecedor e do produto mostrados por ioreg -n IOHIDKeyboard -r. src 0e dst -1desativaria caps lock.

defaults -currentHost write -g modifica:

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

Você precisa sair e fazer login novamente para aplicar as alterações. Se os valores forem cadeias de caracteres (como na resposta por @pithyless), as alterações serão mostradas nas Preferências do Sistema, mas não terão efeito.

Valores das chaves :

-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 algumas respostas, criei esse script que parece funcionar ( mapeando Caps-lock para 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;
})'

Único problema que parece não ter nenhum efeito ... :(

Vou atualizar se conseguir que funcione.


0

Eu queria trocar apenas o comando certo com as teclas de opção certa .

Quando eu configuro a troca global de Comando e Opção em Preferências do Sistema ...> Teclado> Teclas Modificadoras ..., há a seguinte configuração no sistema (que funciona conforme o esperado):

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

Mas quando eu modificá-lo, para trocar apenas o lado direito como abaixo - ele não funciona:

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

É porque os valores são escritos como cadeias de caracteres e não inteiros. Você pode ver isso 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>

Portanto, a maneira correta de atualizar a configuração é usando o 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>'

No final, você precisa fazer logoff e logon novamente.


Você conseguiu que isso funcionasse, eu não posso dizer? Talvez seja necessário reiniciar?
William

Ah sim. Você precisa fazer logoff e logon novamente.
Virus_7 19/04/19

Estou tentando responder a esta pergunta apple.stackexchange.com/questions/280855/… Talvez você possa conversar? chat.stackexchange.com/rooms/38/ask-different-chat Tentei executar seu último comando e isso não muda nada para mim.
William

Antes de tudo, remova o Karabiner-Elements e adapte o código do teclado (1452-591-0) e os códigos de chave (30064771302, 30064771303) ao seu sistema.
Virus_7 20/04/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.