1. 为什么 Mac 上 JSON 文件总被“抢走”默认打开方式
如果你在 Mac 上同时装了 Cursor、VS Code、Xcode、Sublime 甚至系统自带的文本编辑,大概率遇到过这种场景:双击一个package.json,结果它被 Xcode 或文本编辑抢走了,你还得右键“打开方式”再选一次。更烦的是,每次从 Finder 里点开配置文件,都要重复这个动作,一天下来光切软件就浪费不少时间。
这个问题的本质是 macOS 的 LaunchServices 数据库在“记仇”。它记录了每个文件扩展名(UTI)和默认应用之间的绑定关系。你第一次双击某个.json时,系统会按自己的优先级挑一个应用,之后就一直沿用这个绑定,除非你手动改。而 Cursor 作为后来安装的编辑器,默认不会自动抢走.json的关联,所以经常被系统自带或更早安装的软件占着。
我试过最直接的办法就是右键“显示简介”,把“打开方式”改成 Cursor,再点“全部更改”。但很多人卡在两步:一是下拉菜单里根本找不到 Cursor,二是点了“全部更改”之后没生效,双击还是老样子。这通常是因为 LaunchServices 缓存没刷新,或者 Cursor 没有被系统正确注册为可处理.json的应用。
所以这篇内容我会把完整路径拆开:从右键“显示简介”开始,到defaults命令和lsregister刷新,再到验证是否真的生效。最后还会补一段用 TaoToken 统一管理 Cursor 的 API Key 与 Base URL 配置,避免你在多个工具之间来回改配置。整套操作不需要装额外软件,全部用系统自带命令完成。
适合谁看:经常在 Mac 上编辑 JSON 配置、用 Cursor 写代码、又不想每次手动选打开方式的开发者。下面按步骤来,你可以直接跟着敲。
2. 用“显示简介”把 JSON 默认交给 Cursor 的完整路径
先做最基础的一步:找一个.json文件,比如你项目里的data.json或settings.json。选中它,按cmd + i,或者右键选择“显示简介”。在弹出的简介窗口里,找到“打开方式”这一栏。正常情况下,这里会显示当前默认打开它的应用,比如“文本编辑”或“Xcode”。
点击“打开方式”的下拉菜单,看列表里有没有 Cursor。如果有,直接选中 Cursor,然后点击下方的“全部更改…”按钮,系统会弹一个确认框,点“继续”。这一步会把所有.json文件的默认打开方式都改成 Cursor。
但很多人遇到的问题是:下拉菜单里根本没有 Cursor。这时候不要慌,点击下拉菜单最下面的“其他…”,会弹出一个应用选择窗口。在这个窗口里,左侧选择“应用程序”,然后在列表里找到 Cursor。如果列表太长,可以用右上角的搜索框输入 Cursor。选中 Cursor 之后,注意窗口底部有一个“始终以此方式打开”的复选框,把它勾上。如果这个复选框是灰色的,先取消勾选上方的“推荐的应用程序”,再勾选“始终以此方式打开”。
选好之后点“打开”,回到简介窗口,这时“打开方式”应该已经变成 Cursor 了。再点“全部更改…”,确认“继续”。到这里,图形界面的操作就完成了。
不过,有时候即使做了这一步,双击.json还是会被其他应用打开。原因通常是 LaunchServices 数据库没有及时更新,或者系统里存在多个 Cursor 副本(比如一个在/Applications,一个在~/Applications)。这时候需要手动刷新 LaunchServices 缓存。你可以打开终端,执行下面这条命令:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user这条命令会重建 LaunchServices 数据库,把当前用户、系统、本地三个域的应用注册信息全部刷新一遍。执行完之后,最好再重启一下 Finder:
killall Finder重启 Finder 不会影响你正在运行的程序,只是让 Finder 重新读取文件关联。做完这两步,再双击.json文件,应该就会用 Cursor 打开了。
如果你不想每次都手动点“全部更改”,也可以用defaults命令直接写默认应用。不过defaults写的是某个应用对某个 UTI 的绑定,需要知道 Cursor 的 Bundle Identifier。Cursor 的 Bundle ID 通常是com.todesktop.230313mzl4w4u92,你可以用下面这条命令确认:
osascript -e 'id of app "Cursor"'拿到 Bundle ID 之后,可以用defaults写入:
defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add '{LSHandlerContentType=public.json;LSHandlerRoleAll=com.todesktop.230313mzl4w4u92;}'注意,这条命令是往数组里追加一条记录,不是覆盖。如果你之前已经加过,可能会重复。更稳妥的做法是先用defaults read看一下当前的 LSHandlers,再决定要不要追加。不过对于大多数只想改.json默认应用的人来说,图形界面加lsregister刷新已经足够。
这里有一个小坑:如果你同时装了 Cursor 和 VS Code,并且 VS Code 也注册了.json,那么lsregister刷新后,系统可能会按注册顺序重新选一个。这时候你需要再执行一次“显示简介”里的“全部更改”,或者用defaults明确指定 Cursor 的优先级。实测下来,先做图形界面“全部更改”,再跑lsregister刷新,最后重启 Finder,成功率最高。
3. 可复制的 defaults 与 lsregister 配置片段
上面提到了defaults和lsregister,这一章我把可直接复制的配置片段整理出来,包括 JSON 格式的 LSHandlers 写法,以及如何确认 Cursor 的 Bundle ID。你不需要全部执行,按需取用即可。
首先,确认 Cursor 的 Bundle ID。打开终端,输入:
osascript -e 'id of app "Cursor"'如果 Cursor 安装在/Applications下,通常会返回com.todesktop.230313mzl4w4u92。如果返回其他值,以实际输出为准。拿到 Bundle ID 后,可以用defaults read查看当前的 LaunchServices 配置:
defaults read com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers这个命令会输出一个数组,里面每一条都是一个字典,包含LSHandlerContentType和LSHandlerRoleAll。如果你想用 JSON 格式更直观地看,可以加上-json参数(macOS 10.15+ 支持):
defaults read com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -json输出大概长这样:
[ { "LSHandlerContentType" : "public.json", "LSHandlerRoleAll" : "com.todesktop.230313mzl4w4u92" }, { "LSHandlerContentType" : "public.plain-text", "LSHandlerRoleAll" : "com.apple.TextEdit" } ]如果你看到public.json对应的不是 Cursor,就可以用defaults write来修正。但直接覆盖整个数组比较危险,建议用-array-add追加一条,让系统优先匹配最后一条。命令如下:
defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add '{LSHandlerContentType=public.json;LSHandlerRoleAll=com.todesktop.230313mzl4w4u92;}'执行完之后,必须刷新 LaunchServices 并重启 Finder:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user killall Finder如果你想把.json和.jsonc都交给 Cursor,可以再加一条:
defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add '{LSHandlerContentType=public.json;LSHandlerRoleAll=com.todesktop.230313mzl4w4u92;}' defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add '{LSHandlerContentType=public.jsonc;LSHandlerRoleAll=com.todesktop.230313mzl4w4u92;}'注意,public.jsonc这个 UTI 并不是所有系统都认,有些 macOS 版本会把.jsonc当作public.json处理。如果加了没效果,可以忽略。
另外,如果你在 Cursor 里配置了 TaoToken 作为 API 提供方,建议把 Base URL 和 API Key 写进 Cursor 的 settings.json,而不是每次手动填。Cursor 的 settings.json 路径通常是:
~/Library/Application Support/Cursor/User/settings.json你可以在这个文件里加入类似下面的配置(具体字段以 Cursor 版本为准):
{ "cursor.ai.baseUrl": "https://taotoken.net/api", "cursor.ai.apiKey": "你的 TaoToken API Key" }这样做的目的是:当你把.json默认打开方式改成 Cursor 之后,双击任何 JSON 配置文件都会直接在 Cursor 里打开,而 Cursor 又已经通过 TaoToken 统一了 API Key 和 Base URL,不需要在多个工具之间反复切换配置。TaoToken 的 API 地址是https://taotoken.net/api,你可以在它的控制台里生成 Key,然后填到上面的配置里。
如果你用的是 Cursor 的图形界面设置,也可以在 Settings 里搜索 “OpenAI API Key” 或 “Base URL”,把 TaoToken 的地址和 Key 填进去。这样无论你是从 Finder 双击 JSON,还是在 Cursor 里直接编辑,用的都是同一套配置。
4. 验证默认应用是否生效的检查动作
改完默认应用之后,怎么确认真的生效了?最直接的方法就是双击一个.json文件,看它是不是用 Cursor 打开的。但有时候 Cursor 已经启动了,你分不清是它自己打开的,还是系统调用的。更可靠的检查方式是看文件的“显示简介”里“打开方式”是否显示 Cursor,以及用mdls命令查看文件的kMDItemContentType和默认应用。
先做最简单的:找一个.json文件,右键“显示简介”,看“打开方式”那一栏。如果显示的是 Cursor,说明 LaunchServices 已经认了。然后双击这个文件,如果 Cursor 被激活并打开了这个文件,就说明生效了。
如果双击后还是被其他应用打开,可以用mdls查一下系统认为这个文件是什么类型:
mdls -name kMDItemContentType -name kMDItemContentTypeTree data.json输出会显示kMDItemContentType和kMDItemContentTypeTree。对于.json文件,通常kMDItemContentType是public.json。然后你可以用lsregister的查询功能看当前哪个应用注册了public.json:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump | grep -A 5 "public.json"这个命令会输出一大堆信息,你可以用grep过滤。如果看到 Cursor 的 Bundle ID 出现在public.json的绑定里,说明注册成功。如果看到的是其他应用,说明默认应用还没改过来。
另一个检查动作是使用open命令带-a参数指定应用打开,看是否正常:
open -a Cursor data.json如果这条命令能正常用 Cursor 打开文件,说明 Cursor 本身没问题,问题出在默认关联上。这时候再回去执行“全部更改”和lsregister刷新。
还有一个容易被忽略的点:如果你在 Finder 里双击.json时,系统弹出一个“选择应用程序”的对话框,而不是直接打开,说明 LaunchServices 没有找到明确的默认应用。这通常是因为LSHandlers里有多条冲突记录,或者 Cursor 的 Bundle ID 写错了。你可以用defaults read检查一下,把错误的记录删掉。删除单条记录比较麻烦,最简单的办法是重置整个 LSHandlers:
defaults delete com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers然后重新用“显示简介”里的“全部更改”设置一遍。注意,这会清掉你之前所有的文件关联设置,所以只建议在确实混乱的时候用。
验证的时候,建议多试几个不同目录下的.json文件,比如项目根目录的package.json、tsconfig.json,以及~/Library/Application Support/Cursor/User/settings.json。如果这些都能用 Cursor 打开,说明默认关联已经全局生效。
5. 本篇常见错误排查:401、local proxy failed、reading choices、OAuth
这一章整理几个在配置 Cursor 默认打开 JSON 以及接入 TaoToken 时容易遇到的报错。虽然默认打开方式本身不涉及网络请求,但一旦你在 Cursor 里配置了 API Key 和 Base URL,就可能遇到下面这些错误。
错误一:401 Unauthorized
这是最常见的 API Key 错误。你在 Cursor 里填了 TaoToken 的 Base URLhttps://taotoken.net/api,但 Key 填错了,或者 Key 已经失效。检查步骤:打开 TaoToken 控制台,确认 API Key 是否还在有效期内,复制的时候有没有多空格。然后在 Cursor 的 settings.json 里检查cursor.ai.apiKey字段,确保没有换行符。如果用的是环境变量,确认变量名和 Cursor 读取的一致。
错误二:local proxy failed
这个报错通常出现在 Cursor 尝试通过本地代理访问 API 时。如果你没有开代理,但 Cursor 配置里写了http://127.0.0.1:7890之类的地址,就会报这个错。检查 Cursor 的 settings.json,看有没有http.proxy或cursor.ai.proxy字段。如果有,把它删掉,或者改成空字符串。TaoToken 的 API 地址是直连的,不需要额外代理。
错误三:reading choices
这个报错一般出现在模型返回格式不符合预期时。比如你用的模型 ID 写错了,或者 Base URL 后面多加了/v1。TaoToken 的 API 地址是https://taotoken.net/api,在 Cursor 里填 Base URL 时,通常不需要再加/v1,因为 Cursor 会自己拼接。如果你填了https://taotoken.net/api/v1,可能会导致路径重复,返回非 JSON 格式,Cursor 解析时就报reading choices错误。检查方法:在终端用curl直接请求一下:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer 你的Key" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]}'如果返回正常的 JSON,说明 Key 和地址没问题。如果返回 404 或 401,再调整。
错误四:OAuth 相关报错
Cursor 某些版本会尝试用 OAuth 登录,如果你在 settings.json 里同时配置了 API Key 和 OAuth,可能会冲突。表现是 Cursor 一直提示登录,或者报OAuth token invalid。解决办法:在 Cursor 设置里退出登录,然后只保留 API Key 配置。如果你用的是 TaoToken 的 Coding Plan,可以在控制台生成一个长期 Key,填到 Cursor 里,不需要走 OAuth。
错误五:双击 JSON 还是被其他应用打开
这个不算 API 错误,但和本篇主题直接相关。排查顺序:先看“显示简介”里“打开方式”是不是 Cursor;如果是,但双击没生效,跑lsregister刷新;如果刷新后还不行,检查是否有多个 Cursor 副本,用mdfind找一下:
mdfind "kMDItemCFBundleIdentifier == 'com.todesktop.230313mzl4w4u92'"如果找到多个路径,删掉不用的那个,再重新注册。另外,如果你装了 Cursor 的 Nightly 版本,Bundle ID 可能不同,需要用osascript重新确认。
错误六:settings.json 修改后 Cursor 不生效
有时候你改了~/Library/Application Support/Cursor/User/settings.json,但 Cursor 没重新加载。可以按cmd + shift + p,输入Reload Window回车,让 Cursor 重新读取配置。如果还不行,退出 Cursor 再打开。注意,修改 settings.json 时不要破坏 JSON 格式,否则 Cursor 会报解析错误。可以用python -m json.tool检查一下:
python3 -m json.tool ~/Library/Application\ Support/Cursor/User/settings.json如果没有报错,说明格式正确。
6. 用 TaoToken 统一管理 Cursor 的 API Key 与 Base URL
把.json默认打开方式改成 Cursor 之后,你双击任何 JSON 文件都会进 Cursor。这时候如果 Cursor 里配置了多个 API 提供方,每次切换模型都要改 Base URL 和 Key,很麻烦。TaoToken 的作用就是把这些配置统一起来:你只需要在 TaoToken 控制台生成一个 Key,然后在 Cursor 里填一次 Base URL 和 Key,之后不管换什么模型,都走同一个入口。
具体操作:打开 TaoToken 官网https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,注册后进入控制台,在 API Keys 页面生成一个 Key。然后打开 Cursor 的 settings.json,加入:
{ "cursor.ai.baseUrl": "https://taotoken.net/api", "cursor.ai.apiKey": "你的 TaoToken API Key", "cursor.ai.model": "gpt-4o-mini" }模型 ID 可以根据你的需求改,TaoToken 支持多种模型。如果你用的是 Cursor 的 Chat 功能,它会在请求时带上这个 Base URL 和 Key。这样你就不需要在每个项目里单独配置,也不用担心 Key 泄露在代码里。
如果你更习惯用图形界面,可以在 Cursor 的 Settings 里搜索 “API Key”,找到 “OpenAI API Key” 这一项,填入 TaoToken 的 Key,然后在 “Base URL” 里填https://taotoken.net/api。保存后重启 Cursor。
对于长期编码和 Agent 场景,TaoToken 还提供了 Coding Plan,你可以在控制台里查看套餐详情。如果你只是偶尔用一下,按量付费的 API Key 就够。不管哪种方式,Key 和 Base URL 都是统一的,不会因为换了模型就要重新配置。
最后提醒一点:TaoToken 的 API 地址是https://taotoken.net/api,不要在后面加/v1,除非文档明确说明。Cursor 会自动拼接路径。如果你在验证时遇到 404,先检查地址是否多写了后缀。配置完成后,双击一个 JSON 文件,Cursor 打开它,你在 Cursor 里发一条测试消息,如果能正常返回,说明默认打开方式和 API 配置都生效了。