Обновление сопоставлений клавиш модификатора с помощью командного инструмента по умолчанию

16

Я пытаюсь автоматизировать первоначальную настройку моего macbook, которая включает в себя установку программного обеспечения и изменение конфигурации OS X в соответствии с моими потребностями.

Я попытался обновить ключи-модификаторы по умолчанию, код выглядит следующим образом:

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

Кажется, проблема в том, что даже если шаблон был изменен, Системные настройки не ловят обновление, даже не перезагружая компьютер.

Есть ли способ выполнить эту операцию в Snow Leopard?

Благодарю.

Робот
источник
используйте defaults -currentHost write -g key 'value'вместо этого. Все еще не работает, хотя
Даниэль Бек,
1
Этот парень пытается что-то подобное и тоже не удалось. Будет ли сценарий AppleScript GUI для вас приемлемым вариантом?
Даниэль Бек

Ответы:

13

Для команды важно defaultsиспользовать правильный «идентификатор клавиатуры» в ключе, это выглядит так:com.apple.keyboard.modifiermapping.$VendorID-$ProductID-0

Например, внутренняя клавиатура для моего MacBook Air использует:, com.apple.keyboard.modifiermapping.1452-579-0а внешняя клавиатура на моем iMac использует:com.apple.keyboard.modifiermapping.1118-219-0

Как получить правильный «идентификатор клавиатуры»? В командной строке вы можете использовать:

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

чтобы получить список ваших USB-устройств с соответствующими параметрами:

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

Я предполагаю, что третий параметр (часть "-0") является "счетчиком", если у вас более одной клавиатуры одного типа.

Итак, чтобы отключить клавишу CapsLock на моей внешней клавиатуре, я теперь могу использовать:

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

И, ради полноты, вот список возможных кодов клавиш для использования ( из Mac OS X Hints ):

  • Нет - –1
  • Caps Lock - 0
  • Сдвиг (влево) - 1
  • Управление (слева) - 2
  • Вариант (слева) - 3
  • Команда (слева) - 4
  • Клавиатура 0 - 5
  • Помощь - 6
  • Сдвиг (вправо) - 9
  • Контроль (справа) - 10
  • Вариант (справа) - 11
  • Команда (справа) - 12

Обновление: благодаря Lauri Ranta вот команда, которая работает для клавиатур Bluetooth и USB:

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

что дает вам немного другой результат:

+-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x100000489, registered, matched, active, busy 0 (0 ms), retain 8>
  |   "Product" = "Apple Wireless Keyboard"
  |   "VendorID" = 1452
  |   "ProductID" = 570
Orangenhain
источник
Вы не использовать более короткую версию значения по умолчанию , '{ HIDKeyboardModifierMappingDst = -1; HIDKeyboardModifierMappingSrc = 0; }'которые вы можете найти на некоторых веб - сайтах, по крайней мере для меня «-1» и «0» в ценностях Dict в затем интерпретируются как строки, а не целых чисел. Это приводит к странному состоянию, когда Preferences отображает измененные клавиши-модификаторы, но на самом деле клавиатура ведет себя не так.
Orangenhain
1
ioreg -n IOHIDKeyboard -rбудет также включать Bluetooth-клавиатуры.
Lri
Я сделал это, но это, похоже, не дает никакого эффекта. Нужно ли перезапустить что-то, чтобы это работало?
SimonW
1
@SimonW Я испытал то же самое. Я обнаружил, что простой выход из системы и повторный вход в нее вступают в силу.
Райан Лонг
Это не весело :(
SimonW
2

У меня проблема в том, что каждый раз, когда я подключаю свою клавиатуру, в ioreg она получает другой идентификатор. Все, что мне нужно сделать, это поменять местами команду и ключи от яблока.

Я решил решить эту проблему в моем случае «неправильным путем», используя AppleScript и графический интерфейс системных настроек. Это безобразный хак, но это работает! Ваш пробег может варьироваться.

--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
Элиот
источник
1

Мне также не удалось заставить defaults write(или обновить файлы .plist) повлиять на мои настройки HIDKeyboardModifierMappingSrc и HIDKeyboardModifierMappingDst в Snow Leopard .

Я пытаюсь «предварительно заполнить» мою учетную запись «Гость» для поддержки клавиатуры PS2-USB (на которой, по-видимому, поменялись местами «Option» и «Command»). Другие предложения страниц «выйти из системы и снова войти в нее» не помогают; «Выход» из учетной записи гостя удаляет все мои изменения.

уже успешно обновил свой «com.apple.dock» и файлы Plist «com.apple.menuextra.clock» , чтобы настроить док - станцию и 24-часовой, соответственно, что делает его еще более расстраивает , что клавиатура Модификаторы выиграл» т работа ...)

Я попытался использовать «dtruss -asf», чтобы сравнить, что делает «System Preferences.app» (что, по-видимому, работает) с тем, что делает «по умолчанию». Ближайшее, что я могу понять, я вижу сообщения следующего содержания:

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

Если бы кто-нибудь нашел решение, которое работает под Snow Leopard, я был бы рад услышать это ...

Dabe
источник
0
  • Вы запускаете, diffчтобы убедиться, что вы создаете этот файл именно так, как это сделал бы пользовательский интерфейс?
  • Запустите fs_usageили, lsofчтобы узнать, что еще делается при использовании пользовательского интерфейса.

источник
fs_usageничего интересного AFAICT не показывает, и я проверил (с моей измененной командой в комментарии к вопросу), что результат отображается так, как и следовало ожидать.
Даниэль Бек,