Atualizando mapeamentos de chave modificadora por meio da ferramenta de comando de padrões

16

Estou tentando automatizar a instalação inicial do meu macbook, que inclui a instalação de software e a alteração da configuração do OS X de acordo com minhas necessidades.

Eu tentei atualizar as teclas modificadoras com os padrões, o código é o seguinte:

# The apple keyboard id (1452-567-0) should probably be modified in case you use other different model 
COMPUTER_UUID=`ioreg -rd1 -c IOPlatformExpertDevice | grep -E '(UUID)' | awk '{print $3}' | tr -d \"`
defaults write ~/Library/Preferences/ByHost/.GlobalPreferences.$COMPUTER_UUID com.apple.keyboard.modifiermapping.1452-567-0 '( { HIDKeyboardModifierMappingDst = 2;   HIDKeyboardModifierMappingSrc = 0; } )'

O problema parece que, mesmo que o padrão seja alterado, as Preferências do Sistema não capturam a atualização, nem mesmo reiniciam o computador.

Existe alguma maneira de executar esta operação no Snow Leopard?

Obrigado.

O robô
fonte
use em defaults -currentHost write -g key 'value'vez disso. Ainda não funciona.
Daniel Beck
1
Esse cara tenta algo semelhante e também falhou. O script AppleScript GUI seria uma opção viável para você?
Daniel Beck

Respostas:

12

É importante que o defaultscomando use o "ID do teclado" correto na tecla, parece ser:com.apple.keyboard.modifiermapping.$VendorID-$ProductID-0

Por exemplo, o teclado interno do meu MacBook Air usa:, com.apple.keyboard.modifiermapping.1452-579-0enquanto o teclado externo do meu iMac usacom.apple.keyboard.modifiermapping.1118-219-0

Como obter o "ID do teclado" correto? Na linha de comando, você pode usar:

ioreg -p IOUSB -c IOUSBDevice | grep -e class -e idVendor -e idProduct

para obter uma lista dos seus dispositivos USB com os parâmetros relevantes:

  [...]
  +-o Natural® Ergonomic Keyboard 4000@fa140000  <class IOUSBDevice, id 0x100000452, registered, matched, active, busy 0 (115 ms), retain 12>
        "idProduct" = 219
        "idVendor" = 1118

Meu palpite é que o terceiro parâmetro (a parte "-0") é um "contador", caso você tenha mais de um teclado do mesmo tipo.

Portanto, para desativar a tecla CapsLock no meu teclado externo, agora posso usar:

defaults -currentHost write -g com.apple.keyboard.modifiermapping.1118-219-0 -array-add '<dict><key>HIDKeyboardModifierMappingDst</key><integer>-1</integer><key>HIDKeyboardModifierMappingSrc</key><integer>0</integer></dict>'

E, por uma questão de integridade, aqui está uma lista de possíveis códigos-chave a serem usados ​​( das dicas do Mac OS X ):

  • Nenhum - -1
  • Caps Lock - 0
  • Shift (Esquerda) - 1
  • Controle (Esquerda) - 2
  • Opção (esquerda) - 3
  • Comando (Esquerda) - 4
  • Teclado 0 - 5
  • Ajuda - 6
  • Shift (Direita) - 9
  • Controle (Direito) - 10
  • Opção (Direita) - 11
  • Comando (Direito) - 12

Atualização: graças a Lauri Ranta, aqui está um comando que funciona com teclados Bluetooth e USB:

ioreg -n IOHIDKeyboard -r | grep -e 'class IOHIDKeyboard' -e VendorID\" -e Product

o que fornece uma saída ligeiramente diferente:

+-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x100000489, registered, matched, active, busy 0 (0 ms), retain 8>
  |   "Product" = "Apple Wireless Keyboard"
  |   "VendorID" = 1452
  |   "ProductID" = 570
Orangenhain
fonte
fazer não usar a versão mais curta do valor padrão '{ HIDKeyboardModifierMappingDst = -1; HIDKeyboardModifierMappingSrc = 0; }'que você pode encontrar em alguns sites, pelo menos para mim o "-1" e "0" nos valores do dict são então interpretadas como cordas, e não inteiros. Isso leva a um estado estranho, em que Preferências mostra as teclas modificadoras alteradas, mas o teclado não se comporta dessa maneira.
Orangenhain
1
ioreg -n IOHIDKeyboard -r incluiria também teclados Bluetooth.
Lri
Eu fiz isso, mas parece não ter nenhum efeito. Preciso reiniciar algo para que funcione?
precisa saber é o seguinte
1
@ SimonW Eu experimentei o mesmo. Descobri que simplesmente fazer o logout e o logon novamente faz com que a configuração entre em vigor.
Ryan Longo
Isso não é divertido :(
SimonW 25/11
1

Eu, também, ter sido incapaz de obter defaults write(ou atualizar arquivos .plist) para afetar meus HIDKeyboardModifierMappingSrc e HIDKeyboardModifierMappingDst configurações em Snow Leopard .

Estou tentando "preencher previamente" minha conta de convidado para suportar meu teclado PS2 para USB (que aparentemente possui Option e Command trocados). As sugestões de outras páginas para "sair e entrar novamente" não ajudam; "sair da conta de convidado" exclui todas as minhas alterações.

(Eu tenho atualizado com sucesso meu "com.apple.dock" e arquivos plist "com.apple.menuextra.clock" para personalizar a doca e o relógio de 24 horas, respectivamente, o que torna ainda mais frustrante que os modificadores de teclado ganhou' t funciona ...)

Eu tentei usar "dtruss -asf" para comparar o que "System Preferences.app" está fazendo (o que aparentemente funciona) com o que "padrões" está fazendo. O mais próximo que consigo imaginar, vejo mensagens ao longo das linhas de:

   Foundation`+[__NSOperationInternal _observeValueForKeyPath:ofObject:changeKind:oldValue:newValue:indexes:context:]+0x151
   Foundation`NSKeyValueNotifyObserver+0x81
   Foundation`NSKeyValueDidChange+0x1ca
   Foundation`-[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:usingBlock:]+0x176

Se alguém descobriu uma solução que funciona com o Snow Leopard, ficaria feliz em ouvi-la ...

Dabe
fonte
1

O problema que estou tendo é que toda vez que conecto meu teclado, ele obtém um ID diferente na ioreg. Tudo o que preciso fazer é trocar o comando e as teclas da apple.

Decidi resolver isso no meu caso da "maneira errada" usando AppleScript e a GUI de Preferências do Sistema. É um truque feio, mas funciona! Sua milhagem pode variar.

--The beginning of the name of the target keyboard (to type into the drop-down selection list)
set keyboardName to "natural"

--reboot system preferences to make GUI state more predictable
tell application "System Preferences"
    quit
    delay 1
    activate
    delay 1
    activate
end tell

tell application "System Events"

    --Bring up keyboard prefs
    key code 53 --escape
    keystroke "f" using command down
    delay 0.5
    key code 53 --escape
    keystroke "keyboard"
    delay 0.5
    key code 36 --return
    delay 1

    --Open modifier keys submenu
    repeat 4 times
        keystroke tab using shift down
        --delay 0.1
    end repeat
    --delay 0.1
    keystroke space
    delay 0.1

    --Select keyboard
    keystroke space
    keystroke keyboardName
    keystroke return
    delay 0.1

    --Select "option key" drop-down
    repeat 3 times
        keystroke tab
    end repeat

    delay 0.5

    --Open drop-down and go to top
    keystroke space
    delay 0.1
    repeat 4 times
        key code 126 --up arrow
    end repeat

    --Select "command" option
    repeat 3 times
        key code 125 --down arrow
    end repeat
    delay 0.1

    keystroke return

    -- Select "command key" drop-down
    keystroke tab
    delay 0.1

    --Open drop-down and go to top
    keystroke space
    delay 0.1
    repeat 4 times
        key code 126 --up arrow
    end repeat

    --Select "command" option
    repeat 2 times
        key code 125 --down arrow
    end repeat
    delay 0.1

    keystroke return
    delay 0.1

    --Commit changes! phew.
    keystroke return
end tell
Eliot
fonte
0
  • Você correu diff para verificar se está criando esse arquivo exatamente como a interface do usuário faria?
  • Execute fs_usageou lsofdescubra o que mais está sendo feito quando você usa a interface do usuário.

fonte
fs_usagenão mostra nada AFAICT interessante e verifiquei (com meu comando modificado no comentário à pergunta) que o resultado aparece como seria de esperar.
Daniel Beck