macOS 上 hidutil 上重映射按键

引言

最近换了一款 Logi K75m 键盘,但在使用过程中遇到一个痛点:Caps Lock(大写锁定键)反应迟钝。为了防止误触,macOS 对该键设计了一个长按保护机制。在 MacBook 自带键盘上表现尚可,但在一些第三方键盘上,即使是正常的快速点按也经常被识别为“无效”或误触发“长按锁定”。

如果你像我一样有“系统洁癖”,不想为了改一个键位就安装 Karabiner-Elements 这种带驱动且有多个后台进程的重型软件,那么使用系统自带的 hidutil 是最优雅的解决方案。

核心思路

将物理 Caps Lock 键在底层映射为一个系统几乎不使用的功能键(如 F18)。

优点:F18 是普通功能键,没有长按延迟,触发极速。

副作用:失去物理大写锁定功能(可用 Shift + 字母 或快捷键代替)。

操作步骤

临时测试映射

打开 终端 (Terminal),输入以下命令立即生效:

1
2
3
4
5
hidutil property --set '{"UserKeyMapping":[
{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x70000006D},
{"HIDKeyboardModifierMappingSrc":0x70000004B,"HIDKeyboardModifierMappingDst":0x70000004A},
{"HIDKeyboardModifierMappingSrc":0x70000004E,"HIDKeyboardModifierMappingDst":0x70000004D}
]}'

注:0x39 代表 Caps Lock,0x6D 代表 F18。

执行后,去 系统设置 -> 键盘 -> 键盘快捷键 -> 输入法 ,将“选择上一个输入源”改为按一下 Caps Lock,此时系统应识别为 F18。

持久化配置(重启不失效)

由于 hidutil 命令在重启后会重置,我们需要创建一个轻量的开机启动项。

在终端执行以下脚本,它会在 ~/Library/LaunchAgents/ 目录下生成一个配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
printf '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.capsfix</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/hidutil</string>
<string>property</string>
<string>--set</string>
<string>{"UserKeyMapping":[
{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x70000006D},
{"HIDKeyboardModifierMappingSrc":0x70000004B,"HIDKeyboardModifierMappingDst":0x70000004A},
{"HIDKeyboardModifierMappingSrc":0x70000004E,"HIDKeyboardModifierMappingDst":0x70000004D}
]}</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>' > ~/Library/LaunchAgents/com.user.capsfix.plist

然后加载该配置:

1
launchctl load ~/Library/LaunchAgents/com.user.capsfix.plist

如何取消映射(恢复原状)
如果你换了键盘,或者想要找回原本的大写锁定功能,按照以下两步即可彻底撤销修改:

第一步:卸载启动自动映射
在终端执行:

1
2
3
4
5
# 停止自动任务
launchctl unload ~/Library/LaunchAgents/com.user.capsfix.plist

# 删除配置文件
rm ~/Library/LaunchAgents/com.user.capsfix.plist

第二步:重置当前映射
直接清空当前的硬件映射表:

1
hidutil property --set '{"UserKeyMapping":[]}'

执行完毕后,Caps Lock 将立即恢复原始的大写锁定功能。

第三步:去系统设置中将 Caps Lock 恢复为原本功能(如果之前修改过快捷键)。

系统设置 -> 键盘 -> 键盘快捷键 -> 输入法 ,点击 恢复默认 即可。

总结

这种方法利用了 macOS 的原生能力,零内存占用、零后台进程,完美解决了 Logi K75m 等第三方键盘在 Mac 上的“水土不服”。对于追求极致系统响应速度和纯净度的用户来说,这是不二之选。

按键编码

  • Caps Lock: 0x700000039
  • F18: 0x70000006D
  • Page Up - 0x70000004B
  • Home: 0x70000004A
  • Page Down: 0x70000004E
  • End: 0x70000004D