Mac电脑键盘映射最轻量方法

6 min

Mac电脑键盘几经更新,第一行现在都是系统功能键。其中例如音量、屏幕亮度等使用频率挺高的,但我也会不时有个想法,如果个别按键能自己定义就更好了,比如F5的听写、F6的勿扰模式,对我的作用不大,甚至还会误触造成干扰。

几种思路

这几天研究了一下,大致有以下几种思路可以解决问题:

  1. 安装Karabiner Elements,这是个非常强大的键盘映射软件,有多平台版本,而且是共享软件,迭代好多版本了,稳定靠谱
  2. 在系统设置里将媒体键改回成F1F12,然后通过Keyboard Maestro或者Better Touch Tools将F1F12中需要的部分,重新赋予媒体功能。例如,可以用KM重新将F1映射成调低屏幕亮度的功能,过程中就可以对F5~6按需映射成其他功能。KM的功能还挺全的,这里有个可以直接用的案例。这方法算是另辟蹊径吧。好处是,这样映射出来的功能可以比较丰富,比如可以调用脚本、打开某个程序之类的,而且KM或BTT安装面本来就很广。
  3. 直接研究键盘映射,这也是本文主要介绍的方法。适合映射很少的一些键位,不想太多第三方软件常驻后台。

最轻量级的就是方法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
F3Expose0xFF0100000010
F4Spotlight(AC Search)0xC00000221
F5Dictation0xC000000CF
F6勿扰模式(Do Not Disturb)0x10000009B
F7重播0x0C000000B4
F8播放/暂停0x0C000000CD
F9快进0x0C000000B3
F10静音
F11减小音量0x0C000000EA
F12增加音量0x0C000000E9
减少键盘背光0xFF00000009
增强键盘背光0xFF00000008
锁屏/屏保0x0C0000019E
Launchpad0x0C000002A2
Dashboard0xFF0100000002

其他参考资料

在Apple开发文档里也有HID Usage Tables,不过个人觉得还不如上面规范的PDF容易用,优势是,规范是面向多平台和设备的,这个开发文档可以让你知道哪些在Apple的系统和设备上有实现。

最后,有国外网友把常用的映射做成了一个方便的网页工具,还是开源的,懒得自己研究的可以尝试。