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

Does anyone know where OSX stores the settings in System Preferences > Keyboard > Modifier Keys?

显然我不是唯一想知道的人 (How can I change modifier keys in "System Preferences > Keyboard > Modifier Keys...")。我试过用 dtruss 观看系统偏好设置应用程序,但这在 10.10.3 上似乎不可能(我现在正在使用),我什至不确定那是否会如果系统偏好设置只是从 cfprefsd 获取设置,则很有用。用 dtruss 看 cfprefsd 似乎没有捕捉到相关的文件访问。

有谁知道 API 可以获取此信息吗?也许是格式塔的东西?

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

好的 - 回答我自己的问题。我拼凑了一个使用 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 keyboard/trackpad 组合的小数 VID:PID,任何其他插入我的计算机并重新映射修改器设置的键盘都将具有一个类似的条目。 0好像是Caps Lock键,210好像是左右CTRL,311好像是左右Option ,而412好像是左右命令.

所以从上面,你可以看到我的 Caps Lock 键映射到左 CTRL。

.GlobalPreferences.<UUID>.plist 中的设置似乎是标准用户默认设置的一部分。所以你可以很容易地通过做这些设置

[[NSUserDefaults standardUserDefaults] objectForKey:@"com.apple.keyboard.modifiermapping-1452-610-0"];

对于遇到此问题的任何其他人,我正在寻找一种在设置新机器时将其放入我的 .dotfiles 的方法。我只想重新映射大写锁定以转义。

在 Sierra 10.12 中,这个 post 的解决方案似乎无效。 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 命令,这是将 plist 更新为 defaults write is deprecated according to the man page 请参阅文件路径 的首选方式。

此外,请参阅 comparisons 两个命令和库 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 

从 Sierra 10.12 开始

hidutil

新的解决方案不那么冗长并且不依赖于文件路径参数或为记录不完整的 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 的显示。尽管如此,它仍然像功能一样有用。