之前有一篇关于自动切换 Karabiner profile 的,因为 Karabiner 已经更新为 Karabiner Element,所以中间有一个小部分代码已失效。

这里给出经测试后可用的新代码,直接添加到 Hammerspoon 的 init.lua 文件。此文件一般位于:

~/.hammerspoon/init.lua

更改部分主要是 Karabiner-Element 的命令行位置发生了变化,截止到版本号 12.8,其命令行可执行文件位于:

‘/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli’

具体可参考 https://pqrs.org/osx/karabiner/document.html#command-line-interface

需要注意的是,这里 cli 接受参数是按照 profile 名字来切换的,比如我们预设 Defualt 默认,和 PC 外置键盘两套 profiles,需要在参数后面指定想切换的 profile 名称:

–select-profile PC

详细代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
local usbWatcher = nil
function usbDeviceCallback(data)

-- 在这里测试显示设备ID和拔插状态
-- hs.alert.show(data.productID)
-- hs.alert.show(data["eventType"])

-- 此处请调用之前所检测到的设备data.productID
if (data["productID"] == 4621) then
if (data["eventType"] == "added") then
hs.alert.show("Keyboard detected.")
hs.execute("'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --select-profile PC")
elseif (data["eventType"] == "removed") then
hs.alert.show("Keyboard removed.")
hs.execute("'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --select-profile Default")
end
end
end
usbWatcher = hs.usb.watcher.new(usbDeviceCallback)
usbWatcher:start()

保存 init.lua 并且重载 Hammerspoon 的 config 配置文件。