Mac电脑键盘几经更新,第一行现在都是系统功能键。其中例如音量、屏幕亮度等使用频率挺高的,但我也会不时有个想法,如果个别按键能自己定义就更好了,比如F5的听写、F6的勿扰模式,对我的作用不大,甚至还会误触造成干扰。
几种思路
这几天研究了一下,大致有以下几种思路可以解决问题:
- 安装Karabiner Elements,这是个非常强大的键盘映射软件,有多平台版本,而且是共享软件,迭代好多版本了,稳定靠谱
- 在系统设置里将媒体键改回成F1~F12,然后通过Keyboard Maestro或者Better Touch Tools将F1~F12中需要的部分,重新赋予媒体功能。例如,可以用KM重新将F1映射成调低屏幕亮度的功能,过程中就可以对F5~6按需映射成其他功能。KM的功能还挺全的,这里有个可以直接用的案例。这方法算是另辟蹊径吧。好处是,这样映射出来的功能可以比较丰富,比如可以调用脚本、打开某个程序之类的,而且KM或BTT安装面本来就很广。
- 直接研究键盘映射,这也是本文主要介绍的方法。适合映射很少的一些键位,不想太多第三方软件常驻后台。
最轻量级的就是方法3了,也是无意中在这里的讨论中发现,然后花了点时间研究尝试。
具体方法
直接以将F6改造成锁屏并启动屏保来讲解方法:
直接映射方法的本质是,macOS里有个hidutil
指令,通过设置UserKeyMapping
就可以实现基于HID键码的映射。也就是,当系统底层接收到键码A,我们通过这个指令让操作系统当键码B来处理。
第一步,通过USB键盘的HID键码规范来查你需要的两个键码。在USB Implementers Forum的网站上有键码表,2023年初发布了当前的最新版HID Usage Tables 1.4。这规范看起来是个天书,但是我们重点需要看的是这么三张表格:Consumer Page(P125开始的表格)、Keyboard Page(P89开始的表格)、Generic Desktop Page(P32开始的表格)。
现有的F6实际功能是Do Not Disturb,查P33倒数第二行可以看到“System Do Not Disturb”,对应的第一列代码9B
,这个表格的开头章节是0x01
,所以
请记住0x10000009B
这个代码。类似的,我想把它替代成锁屏或关闭屏幕,这个类型的操作在Consumer Page里,P130中间“AL Terminal Lock/Screensaver”,对应代码是19E
,这一章开头的大类代码是0x0C
,组合得到0x0C0000019E
。所以,我们要做的就是将0x10000009B
映射成0x0C0000019E
。
这里的三张表是各有侧重的,总体来说,媒体键的主要功能是在Consumer Page里,音量、屏幕亮度、键盘亮度、启动特定软件之类都在这里。而Keyboard Page是普通键盘,比如原生的F6(也就是macOS里按Fn+F6),就在这里可以找到。Generic Desktop Page用得不多,现有的F1~12里,就只有F6(DND)是在这个表里。表格最后一列的链接,点击过去是对相应功能的展开说明,如果不确定简略说明是不是你想的那个功能,可以参考。
我也整理了一个附表,是主要功能键和一些常见功能的HID键码。
找到键码以后就可以进入代码环节了:
<?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.local.KeyRemapping</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/hidutil</string>
<string>property</string>
<string>--set</string>
<string>{"UserKeyMapping":[
{
"HIDKeyboardModifierMappingSrc": 0x10000009B,
"HIDKeyboardModifierMappingDst": 0x0C0000019E
},
{
"HIDKeyboardModifierMappingSrc": 键A,
"HIDKeyboardModifierMappingDst": 键B
}
]}</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
可以看到,上面代码中,HIDKeyboardModifierMappingSrc
就是原键码,HIDKeyboardModifierMappingDst
是目标键码。注意代码是示例,需要自己修改以后才能使用。
将这个文件保存成~/Library/LaunchAgents/com.local.KeyRemapping.plist
,即个人资源库的LaunchAgents
路径下。
最后启用这个配置,可以选择直接重启,也可以用下面指令来立即启用:
launchctl load -Fw ~/Library/LaunchAgents/com.local.KeyRemapping.plist
如果想反复测试或者修改了plist后还需要重载,那么用下面的指令可以取消加载:
launchctl unload ~/Library/LaunchAgents/com.local.KeyRemapping.plist
附表:常见功能的HID键值
键 | 媒体功能 | HID键码 |
---|---|---|
F1 | 减低屏幕亮度 | 0x0C00000070 |
F2 | 增加屏幕亮度 | 0x0C0000006F |
F3 | Expose | 0xFF0100000010 |
F4 | Spotlight(AC Search) | 0xC00000221 |
F5 | Dictation | 0xC000000CF |
F6 | 勿扰模式(Do Not Disturb) | 0x10000009B |
F7 | 重播 | 0x0C000000B4 |
F8 | 播放/暂停 | 0x0C000000CD |
F9 | 快进 | 0x0C000000B3 |
F10 | 静音 | |
F11 | 减小音量 | 0x0C000000EA |
F12 | 增加音量 | 0x0C000000E9 |
减少键盘背光 | 0xFF00000009 | |
增强键盘背光 | 0xFF00000008 | |
锁屏/屏保 | 0x0C0000019E | |
Launchpad | 0x0C000002A2 | |
Dashboard | 0xFF0100000002 |
其他参考资料
在Apple开发文档里也有HID Usage Tables,不过个人觉得还不如上面规范的PDF容易用,优势是,规范是面向多平台和设备的,这个开发文档可以让你知道哪些在Apple的系统和设备上有实现。
最后,有国外网友把常用的映射做成了一个方便的网页工具,还是开源的,懒得自己研究的可以尝试。