我显然不是唯一一个想知道的人(如何在“系统偏好设置>键盘>修饰键...”中更改修饰键)。我试过用 dtruss 观看系统偏好设置应用程序,但这在 10.10.3 上似乎是不可能的(这就是我现在正在做的),我什至不确定那会不会如果系统偏好设置只是从 cfprefsd 获取设置,则很有用。用 dtruss 观看 cfprefsd 似乎并没有捕捉到相关的文件访问。
有谁知道获取此信息的 API?也许是完形的东西?
我显然不是唯一一个想知道的人(如何在“系统偏好设置>键盘>修饰键...”中更改修饰键)。我试过用 dtruss 观看系统偏好设置应用程序,但这在 10.10.3 上似乎是不可能的(这就是我现在正在做的),我什至不确定那会不会如果系统偏好设置只是从 cfprefsd 获取设置,则很有用。用 dtruss 观看 cfprefsd 似乎并没有捕捉到相关的文件访问。
有谁知道获取此信息的 API?也许是完形的东西?
好的 - 回答我自己的问题。我拼凑了一个小程序,它使用 kqueues 来观察文件系统的变化。当我更改系统偏好设置中的设置时,我观察了我的文件系统是否有修改,我看到:
'/Users/ted/Library/Preferences/ByHost/.GlobalPreferences.3F1C...9C34.plist.V1Ut9hp' kevent: ident=44, filter=KQ_FILTER_VNODE, flags=KQ_EV_ADD|KQ_EV_CLEAR, fflags=KQ_NOTE_WRITE|KQ_NOTE_CHILD|KQ_NOTE_PDATAMASK
所以设置在~/Library/Preferences/ByHost/.GlobalPreferences.<UUID>.plist
. 我不确定 UUID 是什么 - 与 OpenDirectory 有什么关系?(更新:显然这个 UUID 是您机器的标识符)。
无论如何,在 中.GlobalPreferences.<UUID>.plist
,我们看到如下条目:
<key>com.apple.keyboard.modifiermapping.1452-610-0</key>
<array>
<dict>
<key>HIDKeyboardModifierMappingDst</key>
<integer>2</integer>
<key>HIDKeyboardModifierMappingSrc</key>
<integer>0</integer>
</dict>
</array>
1452:610 是我的 2012 Macbook Pro 中 USB 键盘/触控板组合的十进制 VID:PID,任何其他已插入我的计算机并重新映射修改器设置的键盘都将具有类似的条目。0
好像是Caps Lock键,2
又10
好像是左右CTRL,3
又11
好像是左右Option,4
又12
好像是左右Command。
所以从上面,你可以看到我的 Caps Lock 键映射到左 CTRL。
看起来其中的设置.GlobalPreferences.<UUID>.plist
是您的标准用户默认设置的一部分。因此,您只需执行以下操作即可轻松获得这些设置
[[NSUserDefaults standardUserDefaults] objectForKey:@"com.apple.keyboard.modifiermapping-1452-610-0"];
对于其他偶然发现此问题的人,我正在寻找一种在设置新机器时将其放入我的 .dotfiles 的方法。我想要的只是重新映射大写锁定以逃脱。
在 Sierra 10.12 中,这篇文章的解决方案似乎无效。使用 10.14.6 Mojave(*带有警告)的 Apple 记录的方式对我有用
自 Sierra 10.12 起,请参阅: TN2450
# Remap caps-lock to escape
hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x700000029}]}'
plutil
有趣的是,当用户通过 GUI 更改修饰键时,此文件更新和保存有关键映射的信息的解决方案仍然是正确的。但是,在此处更新键映射信息似乎不再影响任何事情。
此示例使用plutil
命令,该命令是更新 plist 的首选方式,defaults write
根据手册页 See filepath已弃用。
此外,请参阅这两个命令与库 PlistBuddy 之间的比较。
#!/usr/bin/env bash
# Quit System Preferences so it doesn't muck with your settings
osascript -e 'tell application "System Preferences" to quit'
# Get your machine's UUID
__UUID__=$(
ioreg -ad2 -c IOPlatformExpertDevice | xmllint --xpath \
'//key[.="IOPlatformUUID"]/following-sibling::*[1]/text()' -
)
# Replace all contents of the array for the caps lock key/value pair.
plutil -replace "com\.apple\.keyboard\.modifiermapping\.1452-636-0" \
-json '[{
"HIDKeyboardModifierMappingDst": 30064771113,
"HIDKeyboardModifierMappingSrc": 30064771129
}]' \
~/Library/Preferences/ByHost/.GlobalPreferences.${__UUID__}.plist
# Pretty print file
plutil -p ~/Library/Preferences/ByHost/.GlobalPreferences.${__UUID__}.plist
hidutil
新的解决方案不那么冗长并且不依赖文件路径参数或为没有很好记录的plutil
命令提供参数类型。
您可以查看此 Stack Exchange 帖子以获得另一种解释。
此技术文档TN2450hidutil
描述了使用Xcode 或 Xcode处理此问题的策略。
#!/usr/bin/env bash
# Quit System Preferences so it doesn't muck with your settings
osascript -e 'tell application "System Preferences" to quit'
# Remap caps-lock to escape
hidutil property --set '{
"UserKeyMapping":[{
"HIDKeyboardModifierMappingSrc":0x700000039,
"HIDKeyboardModifierMappingDst":0x700000029
}]
}'
所有用户首选项都存储在~/Library/Preferences/com.apple.???