「更改所有」没反应是因launch services缓存损坏,需执行lsregister -kill命令重建数据库并重启finder;再通过「显示简介」正确绑定扩展名到已安装应用,或用defaults写入bundle id后强制注册。

为什么「更改所有」没反应?先重建 Launch Services 数据库
Mac 的文件打开方式由 Launch Services 管理,它的缓存损坏是「右键→显示简介→更改所有」失效的最常见原因。不是你操作错了,而是后台数据库已经错乱或过期。
执行以下命令可强制重建:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user killall Finder
注意:killall Finder 会重启访达(约 10–20 秒),之后再试「更改所有」才真正生效。不要跳过这步直接重设——否则只是在坏数据上叠新规则。
如何用「显示简介」永久绑定扩展名到指定应用
这是最稳妥、无需命令行的图形化方法,但有几个关键细节决定它是否真能“永久”:
- 必须右键点击一个真实存在的该格式文件(如
config.yml),不能是空文件或后缀被改过的伪文件 - 「打开方式」下拉菜单里选的应用,必须已安装且能正常启动;如果 VS Code 没出现在列表里,先手动打开一次它,再回来操作
- 点击「更改所有…」后,弹窗确认的是「将所有
.yml文件用 XXX 打开」,不是「用 XXX 打开这个文件」——看清楚提示文字再点「继续」
完成之后,双击任意同后缀文件就会走新规则,无需重启或注销。
defaults 命令绑定不显示的应用(如 CLI 版 VS Code)
有些应用(比如通过 brew install --cask visualstudiocode 安装的 VS Code)没有图形入口,不会出现在「打开方式」列表里。这时得用 defaults 直接写入系统配置:
先查 Bundle ID:
osascript -e 'id of app "Code"'
返回类似 com.microsoft.VSCode;再绑定 .log 到它:
defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add '{LSHandlerContentType=public.plain-text;LSHandlerRoleAll=com.microsoft.VSCode;}'
最后必须执行:
lsregister -kill -r -domain user
或者 killall Finder。只改 defaults 不重建注册表,系统根本不会读取新规则。
遇到「.xxx 已被其他应用劫持」怎么办
某些第三方工具(如 Dropbox、Notion、Typora)会在安装时偷偷覆盖系统对特定后缀的绑定,而且不提供反向解除入口。此时单纯「更改所有」可能被它们后台静默覆盖。
验证方式:右键文件→显示简介→看「打开方式」下拉菜单顶部是否出现灰色提示「由 [某应用] 控制」;如果是,说明它用了私有注册机制。
解决办法只有两个:
- 卸载该应用,再按前文方法重建数据库 + 重新绑定
- 保留它,但用
defaults+lsregister强制覆盖(需知道其实际处理的 UTI 类型,例如public.json而非仅.json)
UTI 类型比扩展名更底层,也更难排查——这也是为什么有时候绑了 .md 却对 GitHub README 失效:它实际声明的是 net.daringfireball.markdown。











