前言
如果你也像我一样使用 Mac 连接蓝牙耳机,下班后总是忘记关耳机,第二天耳机没电的话,那么这篇文章也许有用。
当我尝试解决上面这个问题时,写了一个 Python 脚本,但是这并不优雅,直到我找到了Hammerspoon,从此打开了新世界大门。
首先 Hammerspoon 是什么?
Hammerspoon 是 MacOS 平台上的自动化工具,它不仅仅是应用窗口管理工具,配置~/.hammerspoon/init.lua
脚本可以与系统进行交互,这就让这把小锤子的可玩性极高。
在init.lua
中,注册一系列的回调函数,当监测到事件发生,就能触发对应的回调,例如
- 按下快捷键事件,快速切换应用;
- Wi-Fi 连接事件,判断是否到家了;
- USB 设备连接事件,对插上的设备进行扫描;
- 电脑休眠和解锁事件;
- ...
如果使用小锤子,检测到锁屏事件,那么在脚本里就可以自动地对蓝牙进行开关。
在 Mac 上用脚本控制蓝牙开关?
在 OSX 上,使用blueutil可以对蓝牙进行操作
- 安装方式:
brew install blueutil
- 开启蓝牙:
blueutil --power 1
- 关闭蓝牙:
blueutil --power 0
Put Them Together!
- 蓝牙切换函数,这里使用 Hammerspoon 运行 Applescript 脚本,然后再在 Applescript 里运行 shell 指令
function bluetoothSwitch(state)
-- state: 0(off), 1(on)
cmd = "/usr/local/bin/blueutil --power "..(state)
result = hs.osascript.applescript(string.format('do shell script "%s"', cmd))
end
- 回调函数
function caffeinateCallback(eventType)
if (eventType == hs.caffeinate.watcher.screensDidSleep) then
print("screensDidSleep")
elseif (eventType == hs.caffeinate.watcher.screensDidWake) then
print("screensDidWake")
elseif (eventType == hs.caffeinate.watcher.screensDidLock) then
print("screensDidLock")
bluetoothSwitch(0)
elseif (eventType == hs.caffeinate.watcher.screensDidUnlock) then
print("screensDidUnlock")
bluetoothSwitch(1)
end
end
- 监测 Mac 系统
睡眠
、锁屏
等事件
caffeinateWatcher = hs.caffeinate.watcher.new(caffeinateCallback)
caffeinateWatcher:start()
安装 Hammerspoon 配置
- 首先需要安装Hammerspoon
brew install blueutil
git clone https://github.com/wangshub/hammerspoon-config.git ~/.hammerspoon
完整参考配置链接在Github wangshub/hammerspoon-config
参考链接
- Hammerspoon 文档
- What is AppleScript?
- Lua: Getting started