Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RightOpen

给 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 就行。


加你自己的 App

菜单项由 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)。


常见问题

右键菜单没出现?

  1. 确认扩展已启用(带 + 号):

    pluginkit -m -p com.apple.FinderSync
  2. 系统设置 → 隐私与安全性 → 扩展 → 添加的扩展(或「访达扩展」)里勾选 RightOpen

  3. 重启访达:killall Finder

提示「XX 没有权限打开 XX 文件夹」?

说明沙盒授权没生效,检查 codesign -d --entitlements - /Applications/RightOpen.app/Contents/PlugIns/FinderExt.appex 里有没有 temporary-exception.files.absolute-path.read-write。正常情况下 build.sh 已经处理好了,重新跑一次即可。

会不会有「App 已损坏 / 无法验证开发者」的拦截?

不会。你是在自己机器上本地编译 + 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 扩展,这几个坑值得先看一眼。

1. 不用 Xcode,纯 Command Line Tools 也能编译 App 扩展

FinderSync.frameworkswiftccodesignpluginkit 全部包含在 Command Line Tools 里。 App 扩展的入口不是 main,而是通过链接参数指向 NSExtensionMain

swiftc FinderExt.swift \
    -parse-as-library \
    -framework Cocoa -framework FinderSync \
    -Xlinker -e -Xlinker _NSExtensionMain

2. ⚠️ App 扩展必须沙盒化,否则 pkd 会静默拒绝注册

这是最大的坑:扩展能编译、能被 LaunchServices 识别,但右键菜单死活不出现,且没有任何报错。 原因是 pkd(PlugInKit 守护进程)对未沙盒化的扩展直接丢弃:

pkd: ignoring mis-configured plug-in ...: plug-ins must be sandboxed

所以 FinderExt.entitlements 必须包含:

<key>com.apple.security.app-sandbox</key>
<true/>

3. 沙盒下如何访问「空白处的当前文件夹」并把权限传给目标 App

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 分发,上架商店不允许。

4. 终端不能直接「打开文件」

open -a Terminal 某个文件 会把这个文件当命令执行。 所以终端项走 folderOnly 策略:选中的是文件时,改用它所在的文件夹。 VSCode 则不需要,直接打开文件符合预期。

5. 菜单图标不打包资源,运行时取

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

License

MIT,见 LICENSE。欢迎 issue 和 PR。

About

给 macOS 访达右键加「用 VSCode 打开」「在终端中打开」,可自定义任意 App —— 免费、无需付费开发者账号、无需完整 Xcode。Add "Open in VSCode / Terminal" (or any app) to the macOS Finder context menu.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages