给 macOS 访达(Finder)右键菜单加上**「用 VSCode 打开」「在终端中打开」**,以及任何你想加的 App。
免费、不需要 Apple 付费开发者账号($99)、不需要安装完整 Xcode(只要 Command Line Tools)。
Add "Open in VSCode" / "Open in Terminal" (or any app) to the macOS Finder context menu. Free, no paid Apple Developer account, no full Xcode required — just Command Line Tools.
和系统自带的「服务 / 快速操作」方案不同,RightOpen 基于 Finder Sync 扩展实现,因此覆盖以下全部场景:
- ✅ 右键文件 / 文件夹 → 用目标 App 打开它
- ✅ 右键访达窗口空白处 → 打开当前所在文件夹(这是 Automator 快速操作做不到的)
- ✅ 菜单项在右键菜单顶层,不用钻进「快速操作」二级菜单
- ✅ 菜单项自带目标 App 的真实图标
- ✅ 目标 App 没安装时,对应菜单项自动隐藏
- macOS 11 或更高版本(Apple Silicon 与 Intel 均可,
build.sh自动适配架构) - Command Line Tools:
xcode-select --install(不需要完整 Xcode,几百 MB 就够)
git clone https://github.com/gslvly/RightOpen.git
cd RightOpen
./build.sh脚本会自动完成:编译 → ad-hoc 自签名(带沙盒授权)→ lsregister 注册 → pluginkit 启用 → 重启 Finder。
看到 扩展已启用 (+) 就成功了。到访达里右键任意文件夹或窗口空白处即可看到菜单项。
源码只在编译时需要,装完可以删掉 clone 目录;产物是
/Applications/RightOpen.app。 之后想改菜单,重新 clone 一次再跑build.sh就行。
菜单项由 src/FinderExt.swift 顶部的 apps 数组驱动,加一个编辑器 / 终端只要加一行,然后重新跑 ./build.sh:
private let apps: [TargetApp] = [
TargetApp(title: "用 VSCode 打开",
appPath: "/Applications/Visual Studio Code.app",
folderOnly: false),
TargetApp(title: "在终端中打开",
appPath: "/System/Applications/Utilities/Terminal.app",
folderOnly: true),
// 👇 加你自己的
TargetApp(title: "用 Cursor 打开",
appPath: "/Applications/Cursor.app",
folderOnly: false),
TargetApp(title: "用 iTerm 打开",
appPath: "/Applications/iTerm.app",
folderOnly: true),
]| 字段 | 含义 |
|---|---|
title |
菜单显示的文字 |
appPath |
目标 App 路径;路径不存在时该菜单项自动隐藏,所以可以放心把没装的 App 也列上 |
folderOnly |
选中的是文件时,是否改用它所在的文件夹。终端类填 true(否则会把文件当命令执行),编辑器填 false |
不确定某个 App 的路径?在访达里选中它按 ⌥⌘C 拷贝路径,或者:
mdfind "kMDItemKind == 'Application'" | grep -i cursor改 Bundle ID 的话,全局替换 com.gs.RightOpen(两个 plist + build.sh)。
-
确认扩展已启用(带
+号):pluginkit -m -p com.apple.FinderSync
-
到 系统设置 → 隐私与安全性 → 扩展 → 添加的扩展(或「访达扩展」)里勾选 RightOpen。
-
重启访达:
killall Finder。
说明沙盒授权没生效,检查 codesign -d --entitlements - /Applications/RightOpen.app/Contents/PlugIns/FinderExt.appex 里有没有 temporary-exception.files.absolute-path.read-write。正常情况下 build.sh 已经处理好了,重新跑一次即可。
不会。你是在自己机器上本地编译 + ad-hoc 自签名的,不经过网络分发,不触发 Gatekeeper 隔离属性。这也是本项目不提供预编译 .app 下载的原因——那种反而会被拦。
pluginkit -e use -i com.gs.RightOpen.FinderExt # 启用
pluginkit -e ignore -i com.gs.RightOpen.FinderExt # 停用pluginkit -e ignore -i com.gs.RightOpen.FinderExt
rm -rf /Applications/RightOpen.app
rm -rf ~/Library/Containers/com.gs.RightOpen*
rm -rf ~/Library/Application\ Scripts/com.gs.RightOpen*
killall Finder如果你想自己写一个 Finder 扩展,这几个坑值得先看一眼。
FinderSync.framework、swiftc、codesign、pluginkit 全部包含在 Command Line Tools 里。
App 扩展的入口不是 main,而是通过链接参数指向 NSExtensionMain:
swiftc FinderExt.swift \
-parse-as-library \
-framework Cocoa -framework FinderSync \
-Xlinker -e -Xlinker _NSExtensionMain这是最大的坑:扩展能编译、能被 LaunchServices 识别,但右键菜单死活不出现,且没有任何报错。
原因是 pkd(PlugInKit 守护进程)对未沙盒化的扩展直接丢弃:
pkd: ignoring mis-configured plug-in ...: plug-ins must be sandboxed
所以 FinderExt.entitlements 必须包含:
<key>com.apple.security.app-sandbox</key>
<true/>com.apple.security.files.user-selected.read-write 只覆盖「用户主动选中」的项。
空白处右键拿到的当前文件夹不算「选中」,会报「XX 没有权限打开 XX 文件夹」。
非商店分发可用临时例外开放全盘读写来解决:
<key>com.apple.security.temporary-exception.files.absolute-path.read-write</key>
<array><string>/</string></array>注意:临时例外仅适用于自用 / 非 Mac App Store 分发,上架商店不允许。
open -a Terminal 某个文件 会把这个文件当命令执行。
所以终端项走 folderOnly 策略:选中的是文件时,改用它所在的文件夹。
VSCode 则不需要,直接打开文件符合预期。
NSWorkspace.shared.icon(forFile: "/Applications/Visual Studio Code.app")省掉了往 bundle 里塞 @1x/@2x PNG,换目标 App 时图标自动跟着换。
RightOpen/
├── build.sh # 一键编译 + 签名 + 注册 + 启用
└── src/
├── HostMain.swift # 宿主 App(无界面,只负责承载扩展)
├── FinderExt.swift # Finder 扩展主类(菜单 + 打开逻辑)
├── Host-Info.plist # 宿主 App 的 Info.plist
├── Ext-Info.plist # 扩展的 Info.plist(含 NSExtension 配置)
└── FinderExt.entitlements # 沙盒 + 文件访问授权(关键)
最终产物是一个标准的 App 扩展 bundle:
RightOpen.app/
└── Contents/
├── MacOS/RightOpen # 宿主二进制
└── PlugIns/FinderExt.appex/ # 扩展
└── Contents/MacOS/FinderExt
MIT,见 LICENSE。欢迎 issue 和 PR。