提到生存在 macOS 菜单栏里面的小工具,我们就不得不提到 iStat Menu 这一应用。强调「系统监控」的 iStat Menu,其华丽的外表之下真正的工作原理是:每隔一段时间,执行一个程序,获取监控对象的各项数据,并将结果展示给我们看。查看本机 CPU、内存等使用率,检测上传、下载速度等就是这一原理,查看天气、日程、月相、待办事项等同样也是这一原理。

拥有丰富监控项目与样式的 macOS 菜单栏小工具界标杆:iStat Menu
拥有丰富监控项目与样式的 macOS 菜单栏小工具界标杆:iStat Menu

既然都是「执行程序、获取数据」,那我们能不能直接不借助于付费的 iStat Menu,用开源的解决方案来实现自己的 macOS 菜单栏小工具呢?当然可以,BitBar 正是为此而生。开源免费的 BitBar,是专门为 macOS 菜单栏准备,能够将任何脚本、程序、代码的运行结果输出到菜单栏上面的应用。几乎不需要任何动手能力,我们就能够用 BitBar 大致复刻 iStat Menu 的功能。虽然可能做不到同样精致的界面,但单就功能上的实现,BitBar 还是值得尝试的。

安装运行

BitBar 开源在 GitHub - matryer/bitbar,我们可以直接到其 Release 页面 下载安装 macOS 版本的 BitBar。使用 Homebrew 的同学当然可以用下面的命令安装 BitBar:

brew cask install bitbar

安装成功之后,我们首次运行 BitBar 时,BitBar 会要求我们指定一个「插件目录」,这里我们需要记住这一目录的位置,之后会频繁用到。在正式开始安装插件、编写脚本之前,我们先来聊聊 BitBar 在华丽的外观背后,是如何具体运作的。

工作原理

纵观 BitBar 的工作原理,我们可以发现:实际上 BitBar 就是一个为监控系统执行的程序提供一个方便的输出环境。前面提到的 BitBar 的「插件」安装目录(文件夹),其实际上就是所有 BitBar 需要执行的程序的本体所在。在实际工作中,BitBar 正是从这一目录下寻找可执行的程序,定时执行相应的程序,并根据程序输出将结果显示在我们 macOS 的菜单栏之中。

BitBar 底层工作原理
BitBar 底层工作原理

我们用一个简单的例子来解释这一相对抽象的过程 —— 显示当前系统日期

日期在 macOS 上可以用简单的命令 date 来获取,打开终端(Terminal.app),输入 date 并回车,即可得到当前的系统时间、星期、日期、时区等等信息。这里,命令 date 就是我们「系统监控」的程序本体,其类似 Mon Feb 3 00:54:14 CST 2020 的输出即为我们 BitBar 接收的脚本输出,最终 BitBar 即会将这一结果显示于 macOS 菜单栏上面,作为查看日期的「小工具」。

使用命令 date 获取当前系统日期
使用命令 date 获取当前系统日期

当然,一个命令远远不够,我们需要将命令放在一个文件中,定义其运行方法,从而告诉 BitBar:每隔一段时间,用「这个方法」执行「这个文件」,就可以得到当前系统日期啦。我们在刚刚给 BitBar 指定的「插件」安装目录下创建一个名称为 date.1s.sh 的文件。这里,识别文件名就是 BitBar 设置程序运行方式的第一步。文件名中:

  • date 即为文件的宽泛名称,程序的标识符
  • 1s 表示每隔 1s 执行一次本程序
  • sh 为文件后缀,这里表示此程序为一个 Shell 脚本程序,可以用 Bash 来运行

各个项目之间用 . 拼接起来,成为一个以 {文件名}.{执行频率}.{扩展名} 为格式的完整文件名。我们打开这一文件,向其中填写如下的内容:

#!/bin/bash
date

之后,如果我们保存文件,并重新加载 BitBar,那么不出意外我们就可以看到 BitBar 的一个菜单栏项目开始生效:日期、星期、时间正确显示并每隔 1s 刷新一次。

BitBar 每秒执行一次命令获取当前时间
BitBar 每秒执行一次命令获取当前时间

我们看一下刚刚输入文件的内容:文件分为两行,第一行 #!/bin/bash 在程序界被称为 Shebang —— 表示程序执行方式,这里即为用 /bin/bash <文件名称> 的命令执行程序;第二行 date 即为执行程序输出结果的「命令」—— 获取当前日期,就在这里我们会获取到当前系统时间的输出,并将结果传递给 BitBar 显示于菜单栏上。我们的第一个最为简单的 BitBar 小插件就算完成啦。✌️

当然,BitBar 可实现的功能比上面这一例子要多得多,我们不仅可以简单绘制用户界面、提供自定义执行脚本、实现网络请求,还可以直接下载安装其他用户编写完好的 BitBar 插件。BitBar 的插件库非常丰富,我们直接访问其 官方网站,在侧边栏即可选择不同的插件分类,我们找到选好的插件,点击 + Add to BitBar 即可直接安装到我们本机的 BitBar,之后经过一些调整(比如安装插件的依赖、填写必要的 API 参数等),我们刷新 BitBar 即可直接使用相应的插件。

在 BitBar 官网下载安装插件
在 BitBar 官网下载安装插件

用插件全面监控系统,还有更多功能

除了实现类似 iStat Menu 的系统监控功能,BitBar 还有像汇率换算、查看任务等许多实用插件。接下来就介绍几款好用的插件给你。

武汉疫情监控

在今年武汉新型肺炎爆发后,有国内开发者通过新浪接口提供的国家卫健委统计的全国数据,开发了 BitBar 的疫情监控插件。插件默认会显示国内患病人数最多五个省份的数据,数据每十秒刷新一次,你也可以根据需求自行修改刷新时间等参数。

你可以在插件的 GitHub 页面 查看更多细节,并下载插件。

检测上传、下载速度

最基本也最简单的系统监控就是对网络速度、带宽的监测。BitBar 插件库中与网络相关的插件有很多,我们可以前往 BitBar Plugins | Network 查看。这里我选择使用 Bandwidth by Ant Cosentino,一个 Shell 脚本实现的网速监控。我们不需要进行特殊的改动,直接安装即可。

监控上传、下载速度
监控上传、下载速度

重新加载脚本之后,我们就可以看到 macOS 菜单栏上显示了我们的上传、下载网速状况,同时,点击菜单项,我们也可以看到本机各个网络端口的具体带宽。

监控 CPU 使用率

监控系统信息怎么可能少了 CPU 使用率的监控,我们可以使用 CPU Usage Graph 来在菜单栏实现一个监视 CPU 使用率,并显示为小图表的工具。这一插件也不需要过多配置,直接安装即可。

使用 CPU Usage Graph 检测当前系统 CPU 使用率
使用 CPU Usage Graph 检测当前系统 CPU 使用率

另外,这一脚本还可以实现监控当前使用 CPU 最多的五个进程,方便我们掌控当前消耗 CPU 最多的软件,好能快速打开 Activity Monitor,及时杀掉资源消耗过高的程序。

监控电池电量、使用循环

我们 macOS 原有的「电池」显示控件只有电量百分比、能耗等的显示,用 BitBar 我们还可以直接将电池的「循环次数」进行显示,并用不同的颜色表示电池的使用状况。

Colorful Battery Indicator:用不同的颜色显示电池信息
Colorful Battery Indicator:用不同的颜色显示电池信息

这里我们选择 Colorful Battery Indicator 这一插件,直接安装即可。运行插件之后,我们可以看到 BitBar 控件成功加载,可以直接显示电池的电量与循环次数等信息,比 macOS 原生电量控件的功能多出不少。

不仅能显示电池电量,还可以估算剩余时间、显示循环次数
不仅能显示电池电量,还可以估算剩余时间、显示循环次数

监测天气信息

最后,我们来实现相对复杂的天气监控。BitBar 插件库的天气分类非常丰富,不仅拥有普通天气、温度的插件,还能直接检测 AQI 等空气指标。我选择使用 Weather by Daniel Seripap,点击安装即可。这一脚本用 Python 编写,请求的是国外知名天气信息 Dark Sky 的 API。另外,脚本也使用了 OpenCage 的全球经纬度 API,辅助我们将地理位置与经度纬度进行转换。为了让脚本更方便运行,我们需要:

  • 去 Dark Sky 申请一个私有 API Key:前往 Dark Sky API,点击 Try for free 注册账号,并按照说明申请 API Key,之后我们复制 Dark Sky 为我们生成的 Secret Key 留作备用。为了方便称呼,我们用 {DARK_SKY_API_KEY} 代指这一 API Key
在 Dark Sky 申请 API Key
在 Dark Sky 申请 API Key
  • 去 OpenCage 申请一个私有 API Key:前往 OpenCage API,按照步骤注册账户并进入 Dashboard,没有问题的话下方 API Key 处即为我们需要的密钥。我们同样复制这一 API Key 留作备用。为了方便称呼,我们用 {GEO_API_KEY} 代指这一 API Key
在 OpenCage 申请一个私有 API Key
在 OpenCage 申请一个私有 API Key

接下来,我们进入 BitBar 插件目录,打开 weather.15m.py,按照下面的步骤依次将相应的内容进行修改,让脚本使用我们自己的 API Key 进行数据请求:

修改脚本的 API Key,替换使用我们自己的秘钥进行请求
修改脚本的 API Key,替换使用我们自己的秘钥进行请求
  • api_key 一行后面单引号里面的内容替换为我们 Dark Sky 的 API Key:{DARK_SKY_API_KEY}
  • geo_api_key 一行后面单引号里的内容替换为我们 OpenCage 的 API Key:{GEO_API_KEY}
  • 将下方 units 后面单引号里添加 si:表示我们使用「公制单位」(也就是摄氏度)

这样设置下来我们就应该可以直接运行脚本了。另外,如果使用之后发现脚本定位速度慢,或者因为是根据 IP 进行地理位置确定导致位置不准确,我们也可以直接手动定义目标城市与其经纬度。脚本文件中定义地理位置的内容位于:

  • manual_city:城市名称
  • manual_latlng:城市所在经纬度

我们可以访问 OpenCage Demo 网站,在下方点击定位获取当前所在位置的经纬度与城市名称,按照上方注释给出的格式依次填写即可。之后,我们重新加载 BitBar,不出意外的话我们就可以正确查看当地天气情况了。

Currency Rates:货币汇率

Currency Rates 采用 Python 编写,它可以实时查询货币汇率,然后通过 BitBar 显示在菜单栏中。

不过需要注意的是,Currency Rates 的汇率规则是 1 美元兑各币种的汇率,而且默认在菜单栏显示的汇率是 1 美元 USD 兑印度卢比 INR。当然修改成人民币也很简单。我们只要使用「文本编辑」打开插件代码,把 if nValue1 == "INR" 修改为 if nValue1 == "CNY" 即可。

如果你觉得 Currency Rates 显示了太多无关紧要的其他币种,可以试试 Currency Tracker,它只显示一种货币的兑换汇率。

Death Timer:距死亡还剩多少天

很多应用都可以帮你预计死亡还剩多少天,Death Timer 把它带到了 Mac 菜单栏上,不过要使用它,还是得先修改下它的代码。

用「文本编辑」打开插件代码,修改 death = datetime(2081, 5,31, 12, 0, 0)和 birth = datetime(1994, 5,31, 12, 0, 0) 中修改你的预测死亡时间和出生时间,之后刷新即可 。如果你不知道预计的死亡时间,开发者建议你去 这个网站 看看。

另一个插件 Life Percentage 和 Death Timer,它显示的是人生百分比。Your time on earth 显示的是你出生多少天了,也比较类似。

Moon Phase:显示月相

显示月相 对于一般人来说可能没有什么用,但是它的月相是用 Emoji 显示的,可以给死板的菜单栏增添一些乐趣。

另一个 Show emoji 插件更粗暴,它会直接在菜单栏随机显示三个 Emoji。

Smile:适用于 Slack 的 Emoji 代码

Smile 不是在菜单栏显示微笑表情,它的作用有点特殊。我们知道在 Slack 或者 Github 上输入 Emoji 只能点选。Smile 的作用是把 Emoji 图标自动转换为代码,并且拷贝到剪贴板,在 Slack 或 GitHub 里粘贴就行了。

Things 3 Today:在菜单栏显示 Things 任务

如果你在用 Things,Things 3 Today 可以在菜单栏显示你今天的任务。它还能直接创建任务、清空废纸篓等等。不过这个插件对中文系统不太支持,你可以把下面代码中的Today 改为 今天

with n from 1 to count of to dos of list "Today"
	set toDo to item n of to dos of list "Today"

和 Things 有关的插件还有 Things Doing Now和 Things - View Inbox

iTunes Now Playing:正在播放

iTunes Now Playing 可以抓取 iTunes 目前正在播放的音乐,在菜单栏显示歌曲名和艺人,点击还能进行切歌和暂停操作,还能显示专辑封面,视觉上比较不错。不过这个插件对中文系统不友好,中文系统用户需要把代码中的 iTunes 改为 音乐 才行。

BitBar 中还有 Spotify Now Playing 用来显示 Spotify 的正在播放歌曲。还有其他的操控 iTunes 和 Spotify 播放控制的插件,不再列举。

Battery Dot:显示 Mac、键盘和触控板的电量

Battery Dot 可以在菜单栏显示 MacBook、Apple 的键盘和触控板的电量。显示 Mac 的电量不足为奇,但是能显示键盘和触控板就很方便了。工作的时候键盘和触控板没电那种抓狂的感觉令人印象深刻,有 Battery Dot 应该会好很多。

Date Picker:提供多种格式的日期样式

办公写文件时,经常需要在落款处留日期,每次手动输入会比较麻烦。Date Picker 在菜单栏显示了多种样式的日期格式,点击就能拷贝到剪贴板,在写作时就能复制了,非常方便。不过它的默认格式是 2020-02-03,没有包含中文「年月日」的样式。 

总结

BitBar 的设计理念实际上非常易懂,这一简单的工作原理为我们提供了一种开源免费的解决方案,让我们能够更有效地利用 macOS 菜单栏来做一些有用、有趣的事情。BitBar 支持运行的程序非常丰富,Bash、Python、Lua、Ruby、JavaScript 等等都有支持。理论上,只要你在 Mac 上面能够运行的脚本,BitBar 就能将其输出显示于 macOS 菜单栏上面。

BitBar 脚本库的生态同样丰富,不仅提供了上面介绍的各项参数的监控功能,还有比如控制音乐播放查看货币价格涨幅订阅 Nasa 每日一图 等等各种有趣的小工具。当然,BitBar 使用时还是出现一些问题,比如我发现各个插件之间的相对位置事实上不太好维持,每次重新加载都会凌乱,只能手动给脚本名称前面添加编号来解决。不过,BitBar 的功能还是相当丰富,可以实现以 iStat Menu 为代表的「系统监控」软件所提供的大部分功能,希望丰富自己 macOS 菜单栏功能的同学一定不要错过。

你可以在 这里 下载 BitBar。

> 下载少数派 客户端、关注 少数派公众号 ,发现更多新酷应用 🆒

> 年度回顾、好物推荐……更多精彩尽在 少数派 2019 年度盘点 🎉