macOS Mojave 引入的全局深色模式带来了更好的用户体验。紧接着,各路开发者和极客用户就围绕这一功能实现了各种各样的扩展与自动化,将用户体验向前推进一步,主要包括:

  • 根据时间切换外观模式,如 NightOwl
  • 随日出 / 日落切换外观模式,同上
  • 将夜览(夜间模式)与外观模式结合,如 Fluxthompsonate/Shifty
  • 指定各个 App 是否使用深色模式,如 Gray

(以上软件在文末附上的少数派网站文章中均有介绍)

但是随着使用,我觉得这些应用提供的功能并不够完善。无论是按照时间,还是按照日出 / 日落切换,都无法与使用者所处环境中的光线变化步调一致。毕竟多数情况下,我们处于室内,而且会通过开关灯调节环境亮度。

所以,我更希望实现的自动化切换是,配合 MacBook 搭载的环境光传感器,在外界光线变化时自动调节屏幕亮度并切换浅色 / 深色模式,我认为这样才是更加完善和符合使用逻辑的方式。此外,对于没有环境光传感器的 iMac 和 Mac mini 用户,在使用快捷键等方式调节屏幕亮度时,自动切换外观模式也是不错的。

首先,我们需要启用环境光传感器:打开「系统偏好设定 → 显示器」,勾选 自动调节亮度。如果找不到这个选项,那就说明你的设备不支持这个功能。

自动调节屏幕亮度
自动调节屏幕亮度

本文将介绍三种开启「在外界光线变化时自动调节屏幕亮度并切换浅色 / 深色模式」功能的途径:一个 App,以及 Keyboard Maestro 和 Hammerspoon 各一个脚本。

Dynamic Dark Mode

这是由 ApolloZhu 开发的开源免费 App,点击打开他的 Github 项目页面。我们可以到 GitHub 项目页面中 手动下载,也可以使用 Homebrew 安装:

brew cask install dynamic-dark-mode

如果你对 Homebrew 不了解,可以浏览少数派网站的专题:Homebrew,Mac 应用管家

第一次启动 App,会出现一个配置引导界面,点击「开始配置 >>」后,依次授予自动化和地理位置权限。其中自动化权限是为了控制外观模式,地理位置则是为了计算日出/日落时间,当然,你也可以拒绝地理位置权限的授予。

引导界面及授权窗口
引导界面及授权窗口

结束配置后,偏好设置窗口会自动打开。我们可以看到,这里有切换快捷键、根据屏幕亮度或时间切换、菜单栏图标功能等选项,根据自己的需要进行勾选。此外,我们还可以在菜单栏图标的下拉菜单中进行手动切换。

偏好设置
偏好设置

所以,借助这个 App,就可以有三种切换方式:手动,根据屏幕亮度,以及根据时间(日出 / 日落,自定义时间)。其中,手动与根据屏幕亮度的切换会打断当前的定时切换,直到设定的下一次自动切换时间。这样说可能有些不够明白,举个例子:我们设定 23 点至次日 8 点期间使用深色模式,那么在夜间手动切换为浅色模式后,次日 23 点钟才会再次自动启用深色模式。

Dynamic Dark Mode 的优点在于整合了多种切换方式,并且作者花了一番心思,协调它们之间的冲突干扰。不过,我们也可以看看后面基于 Keyboard Maestro 或 Hammerspoon 的脚本实现方法。

脚本实现

如果你不愿意额外安装一个软件,或者已经在用 Keyboard Maestro、 Hammerspoon 等软件,那么可以试试用它们来实现自动化切换功能。或者也可以基于这个脚本实现自己的特别需求。

核心原理其实很简单:每隔几秒检测一次当前亮度,如果亮度大于设定的阈值则将系统外观设为浅色模式,否则设为深色模式。

Keyboard Maestro 实现

如果让我列出一份 macOS 必备软件,那么 Keyboard Maestro 肯定排在列表前面。这款软件能够方便快捷地实现各种自动化功能,少数派网站中有丰富的应用文章,可以搜索查看。

首先,为了能方便地获取屏幕亮度信息,需要使用 Homebrew 安装一个程序:在终端中运行 brew install brightness

然后,点击下载 Keyboard Maestro 配置好的 Macro 文件,解压后双击安装,可以看到打开的 Keyboard Maestro 编辑界面。

Keyboard Maestro 编辑界面
Keyboard Maestro 编辑界面

这里,可以看到我专门添加了一个动作来设置切换的屏幕亮度阈值(默认 30%),低于阈值时启用深色模式,你可以根据自己的需要修改它。

最后,点击右上角的 标志启用这个 Macro,然后关闭这个界面就可以了。

Hammerspoon 实现

Hammerspoon 是一款通过 Lua 编程语言脚本实现各种自动化功能的软件。它功能强大,但是不适合普通用户,这里只是为了给使用 Hammerspoon 的极客用户一个参考,所以不做过多介绍。

这个脚本在屏幕亮度低于 30% 时,除了启用深色模式外,还会在桌面壁纸上添加一层黑色透明图层,从而降低壁纸的亮度。

sizeRect = hs.geometry.rect(0, 0, hs.screen.mainScreen():fullFrame().w, hs.screen.mainScreen():fullFrame().h)
drawObj = hs.drawing.rectangle(sizeRect)
drawObj:setFillColor(hs.drawing.color.asRGB({red=0.1, green=0.1, blue= 0.1, alpha=0.5}))
drawObj:setLevel(hs.drawing.windowLevels.desktopIcon)

brightTimer = hs.timer.new(5, function ()
    if hs.brightness.get() < 30 then
        hs.osascript.applescript('tell application "System Events" to tell appearance preferences to set dark mode to true')
        drawObj:show()
    else
        hs.osascript.applescript('tell application "System Events" to tell appearance preferences to set dark mode to false')
        drawObj:hide()
    end
end, true)
brightTimer:start()

小结

本文介绍了三种根据屏幕亮度切换外观模式的方法。对于普通用户,推荐使用软件 Dynamic Dark Mode。喜欢自己折腾的用户,可以选择使用 Keyboard Maestro 或者 Hammerspoon 脚本来实现同样的功能。作者还写了一篇开发历程文章,感兴趣可以看看:自动深色模式 | Dynamic Dark Mode - 哔哩哔哩

少数派网站还有几篇深色模式的相关文章,点击浏览:

> 下载少数派 客户端、关注 少数派公众号 ,找到数字时代更好的生活方式 🎉

>特惠、好用的硬件产品,尽在少数派sspai官方店铺 🛒