通过默认值命令工具更新修饰键映射


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脚本对您来说是可行的选择吗?
丹尼尔·贝克

Answers:


13

对于defaults命令,在密钥中使用正确的“键盘ID”很重要,这似乎是:com.apple.keyboard.modifiermapping.$VendorID-$ProductID-0

例如,MacBook Air的内部键盘使用:com.apple.keyboard.modifiermapping.1452-579-0,而iMac上的外部键盘使用com.apple.keyboard.modifiermapping.1118-219-0

如何获得正确的“键盘ID”?在命令行上,您可以使用:

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提示):

  • 无-–1
  • 大写锁定— 0
  • Shift(左)— 1
  • 控制(左)— 2
  • 选项(左)— 3
  • 指挥官(左)— 4
  • 键盘0 — 5
  • 帮助— 6
  • Shift(右)— 9
  • 控制(右)— 10
  • 选项(右)— 11
  • 命令(右)— 12

更新:感谢Lauri Ranta,这是一个适用于蓝牙和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

千万不能使用较短的版本默认值'{ HIDKeyboardModifierMappingDst = -1; HIDKeyboardModifierMappingSrc = 0; }',你可以找到在一些网站上,至少对我来说是“-1”,并在字典的值“0”,然后解释为字符串,而不是整数。这就导致了一个奇怪的状态,即“首选项”显示了已更改的修饰键,但是键盘实际上并没有这种行为。
Orangenhain

1
ioreg -n IOHIDKeyboard -r还将包括蓝牙键盘。
Lri

我这样做了,但是似乎没有任何效果。我需要重启某些东西才能正常工作吗?
SimonW 2014年

1
@SimonW我也有同样的经历。我发现只需注销然后再次登录即可使设置生效。
瑞安·隆

那不好玩:(
SimonW

2

我遇到的问题是,每次插入键盘时,ioreg都会获得一个不同的ID。我需要做的就是交换命令和Apple键。

我决定使用AppleScript和系统偏好设置GUI以“错误的方式”解决此问题。这是一个丑陋的骇客,但行得通!你的旅费可能会改变。

--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文件)以影响Snow Leopard下的HIDKeyboardModifierMappingSrcHIDKeyboardModifierMappingDst设置。

我试图“预填充”我的Guest帐户以支持我的PS2-to-USB键盘(显然已经交换了Option和Command)。其他页面“注销并重新登录”的建议无济于事;登出来宾帐户会删除我的所有更改。

(我已经成功更新了“ com.apple.dock”和“ com.apple.menuextra.clock” plist文件,分别自定义了底座和24小时制,这使键盘修改器更令人沮丧。工作...)

我尝试使用“ dtruss -asf”将“ System Preferences.app”正在做什么(显然可行)与“ defaults”正在做什么进行比较。据我所知,我看到的消息大致如下:

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

如果有人想出了可以在Snow Leopard下使用的解决方案,我很高兴听到它...


0
  • 您是否已经运行diff过验证以完全按照用户界面创建此文件?
  • 使用时,运行fs_usagelsof找出正在执行的其他操作。

fs_usage没有显示任何有趣的AFAICT,我验证了问题的注释中的修改后的命令(使用修改后的命令)。
丹尼尔·贝克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.