macOS 工具集合,功能两条主线:
- Finder 右键菜单管理 — 在 Finder 右键菜单中添加自定义动作项,类似「超级右键」
- 菜单栏系统状态 — 在系统菜单栏顶部实时显示网络流量、CPU、内存、GPU、IP 等指标
主应用、Finder Sync Extension、菜单栏 status item 三者各自独立运行,互不依赖。
- 9 种动作类型:
- 用应用打开 - 用指定应用打开选中文件
- 运行命令 - 执行 shell 命令(支持
{FILE_PATH}{DIR_PATH}{FILE_NAME}占位符) - 复制路径 - 复制 POSIX 或 URL 格式路径到剪贴板
- 移动到 / 复制到 - 移动 / 复制文件到指定目录
- 新建文件 - 在当前目录创建文件(支持模板内容)
- 在终端打开 - Terminal / iTerm2 / Warp
- 卸载应用 - 拖动 .app 时显示,深度扫描容器并清理
- 解压文件 - 内置 7zz,支持 rar/zip/7z/tar.gz 等
- 支持显示条件过滤(文件扩展名、目录/文件、选中数量)
- 支持菜单分组(子菜单)
- 自定义图标:SF Symbol、Emoji 或本地 PNG
- 配置变更实时同步到 Extension(DistributedNotificationCenter)
- Extension 独立运行,关闭主应用后右键功能依然有效
- 实时显示指标(1Hz 刷新):
- 网络流量 - 上传 / 下载双向速率(双行 ▲/▼)
- 本机 IP - 内网 + 公网 IPv4(公网每 10 分钟刷新)
- CPU / 内存 / GPU 占用率
- 每个指标渲染为独立"双行 block":上 = 数值,下 = 标签
- SF Mono 等宽字体,固定宽度,数字跳动不抖
- 点击图标弹出菜单,菜单项 1Hz 实时刷新
- 配置界面 WYSIWYG 拖拽编辑器:
- 上方区域模拟实际菜单栏外观
- 下方区域模拟弹出菜单
- 跨区域拖动 chip 调整指标归属
- 同区域内拖到目标项之前调整顺序
- 开机自启(SMAppService),启动后只显示菜单栏,不弹主窗口
应用注册了 hellrcmenu:// URL scheme,Finder 菜单的卸载 / 解压动作通过它唤起后台任务:
hellrcmenu://uninstall?path=...&path=...卸载多个 .apphellrcmenu://extract?path=...&path=...串行解压多个压缩包hellrcmenu://show二进程实例触发主窗口显示
URL-only 触发的进程会在任务结束后自动退出,不残留菜单栏图标。
- 纯 Swift / SwiftUI - 不依赖 Xcode 项目,直接 swiftc 编译
- Finder Sync Extension - 基于
FIFinderSync实现右键菜单 - Makefile 构建系统
- AppKit / NSStatusItem - 菜单栏状态项 + 自定义双行 block 视图
- getifaddrs / host_statistics / IOAccelerator - 网络流量、CPU/内存、GPU 利用率采样
- SMAppService - 开机自启注册(macOS 13+)
- App Sandbox - 仅 Extension 沙盒(macOS 强制要求);主应用不沙盒以便 IOKit / sysctl 调用
hell-rcmenu/
├── Makefile # 构建脚本
├── Sources/ # 主应用源码(SwiftUI + AppKit)
│ ├── AppDelegate.swift # 应用入口、URL 分发、激活策略
│ ├── MainView.swift # 主窗口
│ ├── MenuListView.swift # 右键菜单列表
│ ├── MenuItemFormView.swift # 单个菜单项编辑表单
│ ├── ActionEditorView.swift # 9 种动作类型编辑器
│ ├── ConditionEditorView.swift # 显示条件编辑
│ ├── SettingsView.swift # 全局设置(扩展状态、开机自启、菜单栏布局)
│ ├── IconPickerView.swift # SF Symbol / Emoji / PNG 图标选择
│ ├── AboutView.swift
│ ├── ExtractController.swift # 解压(调用内置 7zz)
│ ├── UninstallController.swift # 卸载 .app + 容器清理
│ ├── LoginItemController.swift # SMAppService 开机自启封装
│ ├── StatusBarController.swift # 菜单栏 NSStatusItem + 弹出 NSMenu 总控
│ ├── StatusBarLayoutEditor.swift # 配置界面 WYSIWYG 拖拽编辑
│ ├── NetworkTrafficMonitor.swift # 网络速率 + 内网/公网 IP
│ └── SystemStatsMonitor.swift # CPU / 内存 / GPU 利用率
├── Shared/ # 主应用 + Extension 共享代码
│ ├── Constants.swift
│ ├── MenuModel.swift # 右键菜单数据模型
│ ├── StatusBarLayout.swift # 菜单栏指标布局数据模型
│ ├── ConfigManager.swift # 配置管理(主应用,依赖 Combine)
│ ├── ConfigReader.swift # 配置读取(Extension 用)
│ └── IconRenderer.swift # 图标渲染
├── Extension/ # Finder Sync Extension 源码
│ ├── FinderSync.swift # FIFinderSync 子类
│ ├── Info.plist
│ └── Entitlements.plist # 沙盒授权
├── Vendor/
│ └── 7zz # 内置 7-Zip 二进制(自动从 GitHub 拉取)
├── Resources/
│ ├── Info.plist # 主应用 plist
│ ├── AppIcon.icns
│ └── logo.png
└── build/ # 构建产物
- macOS 13.0+(Ventura 或更新版本,SMAppService、IOKit 等需要)
- Apple Silicon(arm64)
- Xcode Command Line Tools(
xcode-select --install)
由于 macOS 强制要求 FinderSync 扩展必须由可信证书签名(ad-hoc 签名不被 pluginkit 接受),需要创建一个自签名的本地代码签名证书。
-
打开「钥匙串访问」(Keychain Access)
open -a "Keychain Access" -
菜单栏:钥匙串访问 > 证书助理 > 创建证书...
-
填写证书信息:
- 名称:
Hell Dev(必须与 Makefile 中的签名身份一致) - 身份类型: 自签名根证书
- 证书类型: 代码签名
- 勾选 「让我覆盖默认值」
- 名称:
-
后续步骤全部点「继续」使用默认值,最后点「完成」
-
信任证书:
- 在钥匙串中找到
Hell Dev证书(通常在「登录」钥匙串) - 双击打开证书
- 展开 「信任」 部分
- 将 「代码签名」 改为 「始终信任」
- 关闭窗口(系统会要求输入密码确认)
- 在钥匙串中找到
-
验证证书已可用:
security find-identity -v -p codesigning
应该能看到:
1 valid identities found,列出"Hell Dev"。
make build构建产物:build/Hell RCMenu.app
make install安装到 /Applications/Hell/Hell RCMenu.app,自动重启 Finder 加载新版扩展。
-
打开应用:
open "/Applications/Hell/Hell RCMenu.app" -
打开「系统设置」 > 「常规」 > 「登录项与扩展」 > 找到 「访达扩展」(或在「隐私与安全性 > 扩展 > 已添加的扩展」中找到 Hell RCMenu)
-
启用 HellRCMenu 扩展开关
-
在 Finder 中右键任意文件或文件夹,应该能看到自定义菜单项
提示:如果在系统设置中找不到扩展,可以用命令行启用:
pluginkit -e use -i com.hell.tools.rcmenu.finder-extension
| 目标 | 说明 |
|---|---|
make / make build |
编译主应用 + Extension + 签名 |
make install |
编译 + 签名 + 安装到 /Applications/Hell/ |
make dev |
编译并启动应用 |
make clean |
清除构建产物 |
make uninstall |
卸载应用 |
make vendor-7zz |
重新下载内置 7-Zip 二进制 |
make help |
显示帮助 |
- 主应用配置:
~/Library/Application Support/com.hell.tools.rcmenu/config.json - Extension 沙盒副本(由主应用自动同步):
~/Library/Containers/com.hell.tools.rcmenu.finder-extension/Data/Library/Application Support/com.hell.tools.rcmenu/config.json
主应用保存配置时会同时写入两个位置,并通过 DistributedNotificationCenter 通知 Extension 重载。
config.json 中:
items— 右键菜单项树statusBarLayout— 菜单栏 / 弹出菜单的指标排列enabled/showIcons— 全局开关
SwiftUI 主应用 Finder Sync Extension (.appex)
│ ▲
│ 1. 写 config.json │ 4. 读 config.json
▼ │
~/Library/Application Support/ ──→ ~/Library/Containers/.../Data/...
│ ▲
│ 2. 发送 DistributedNotification │ 3. 收到通知后重载
└──────────────────────────────────────────┘
菜单栏 NSStatusItem URL handler
│ │
getifaddrs / host_statistics hellrcmenu://uninstall
IOAccelerator / SCNetwork hellrcmenu://extract
│ │
每秒采样并渲染 后台静默处理后退出
- 主应用与 Extension 分别独立运行
- Extension 由 Finder 加载,关闭主应用不影响右键功能
- Extension 必须沙盒化(macOS 强制要求),所以配置文件需复制到 Extension 容器目录
- 菜单栏状态项随主应用进程存在;关闭主窗口后切回
.accessory但进程不退出,菜单栏图标常驻
- 无开发者账号限制:自签名证书只能在创建该证书的机器上使用,无法分发给其他用户
- GPU 利用率读自 IOAccelerator 私有键(
Device Utilization %),该字段未公开 API,后续 macOS 版本可能改变 - 公网 IP 通过 ipify 获取:依赖外网访问,断网时显示占位
…
make uninstall或手动删除:
rm -rf "/Applications/Hell/Hell RCMenu.app"
rm -rf ~/Library/Application\ Support/com.hell.tools.rcmenu
rm -rf ~/Library/Containers/com.hell.tools.rcmenu.finder-extension如果启用了开机自启,先在主应用「设置 → 通用」里关闭后再卸载;否则需要在系统设置「通用 → 登录项与扩展」中手动移除残留登录项。
个人使用项目,无授权限制。