有谁知道OSX在“系统偏好设置”中存储设置的位置>键盘>修改键?

时间:2016-06-02 01:02:38

标签: macos keyboard preferences capslock system-preferences

Where are these stored?!?

我显然不是唯一想知道的人(How can I change modifier keys in "System Preferences > Keyboard > Modifier Keys...")。我尝试用dtruss观看系统偏好设置应用程序,但这似乎不可能在10.10.3上(这就是我现在所做的),我不是如果系统偏好设置只是从cfprefsd获取设置,那么甚至可以确保这一点非常有用。用dtruss观看cfprefsd似乎没有抓住相关的文件访问权。

有没有人知道获取此信息的API?也许在格式塔中有什么东西?

3 个答案:

答案 0 :(得分:4)

好的 - 回答我自己的问题。我把一个使用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似乎是大写锁定键,210似乎是左右CTRL,311似乎是左右选项,412似乎是左右命令。

从上面可以看出,我将Caps Lock键映射到左CTRL。

.GlobalPreferences.<UUID>.plist中的设置似乎是标准用户默认设置的一部分。因此,只需执行

即可轻松完成这些设置
[[NSUserDefaults standardUserDefaults] objectForKey:@"com.apple.keyboard.modifiermapping-1452-610-0"];

答案 1 :(得分:0)

所有用户首选项都存储在~/Library/Preferences/com.apple.???

答案 2 :(得分:0)

对于任何遇到此问题的人,我正在寻找一种在设置新计算机时将其放入.dotfiles的方法。我只想重新映射大写字母以逃脱。

在Sierra 10.12中,此帖子上的解决方案似乎无效。 Apple记录的方式适用于我使用10.14.6 Mojave(*有警告)的

TL; DR;

从Sierra 10.12开始,请参阅: TN2450

# Remap caps-lock to escape
hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x700000029}]}'

在Sierra 10.12之前

plutil

有趣的是,当用户通过GUI更改修改键时,有关此文件更新和保存有关映射的信息的解决方案仍然正确。但是,在这里更新键盘映射信息似乎不再有任何影响。

此示例使用plutil命令,这是将plists更新为defaults write is deprecated according to the man page的首选方法。请参见文件路径

此外,请参见两个命令和库PlistBuddy之间的comparisons

#!/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 

自Sierra 10.12起

hidutil

新解决方案的详细程度要低得多,并且它不依赖文件路径args或没有很好地记录的plutil命令的参数类型。

您可以查看this Stack Exchange post以获得其他说明。

此技术文档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
  }]
}'
  • 注意事项,当您访问“系统偏好设置”>“键盘”中的修改键时,这似乎并没有改变GUI的显示。尽管如此,它仍然像功能的魅力一样。