
显然,我不是唯一一个想知道的人(How can I change modifier keys in "System Preferences > Keyboard > Modifier Keys...")。我尝试过用d桁架观看系统首选项应用程序,但在10.10.3 (这就是我现在正在做的)上,这似乎是不可能的,而且如果系统首选项只是从cfprefsd获得设置,我甚至不确定这是否有用。使用d桁架观看cfprefsd似乎没有捕捉到相关的文件访问。
有人知道一个API来获取这些信息吗?可能是格式塔的东西?
发布于 2016-06-06 01:42:19
好吧-回答我自己的问题。我编写了一个小程序,它使用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键,2和10似乎是左和右CTRL,3和11似乎是左右选项,4和12似乎是左右命令。
因此,从上面可以看到,我的Caps键被映射到左CTRL。
看起来,.GlobalPreferences.<UUID>.plist中的设置是标准用户默认设置的一部分。因此,您可以很容易地获得这些设置,只需
[[NSUserDefaults standardUserDefaults] objectForKey:@"com.apple.keyboard.modifiermapping-1452-610-0"];发布于 2019-11-18 03:21:23
对于其他人来说,当设置新机器时,我正在寻找一种方法将其放入我的.dotfiles中。我只想重新映射盖帽锁才能逃走。
在塞拉10.12,这一职位的解决办法似乎变得无效。我使用10.14.6 Mojave (*附带一个警告)来记录来自苹果的方式。
TL;DR;
自塞拉利昂10.12以来,见:TN2450
# Remap caps-lock to escape
hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x700000029}]}'在塞拉利昂10.12之前
plutil
有趣的是,当用户通过GUI更改修饰符键时,解决方案仍然是正确的,用于更新和保存有关键映射的信息。然而,在这里更新键映射信息似乎不再影响任何事情了。
此示例使用plutil命令,这是更新plist的首选方法,如defaults write 根据手册页被取消推荐。,请参阅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 自塞拉利昂10.12以来
hidutil
新的解决方案不那么冗长,也不依赖filepath,也不为没有很好文档的plutil命令提供参数类型。
您可以看到这个堆栈交换邮政的另一个解释。
这个技术文档TN2450描述了用hidutil或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
}]
}'https://stackoverflow.com/questions/37581090
复制相似问题