赵健的技术笔记

使用 Defaultly 批量设置 Mac 默认打开方式,让 .env、Dockerfile 等无扩展名文件也能用编辑器打开

技术 约 4734 字 · 12 分钟 - 次阅读

在 Mac 上写代码,.env、.gitignore、Dockerfile 这类没有扩展名的文件一直是个麻烦:双击要么用「文本编辑」打开,要么干脆打不开。用访达的「显示简介 › 打开方式 › 全部更改…」改成 VS Code 或 Zed,点了也没用;「始终以此方式打开」又只对选中的那一个文件生效。

原因是 macOS 把大多数无扩展名文件都归为 public.data,并且不允许任何 App 成为这一类型的默认 App,用命令行工具去改也只会报错 -50。

另一个问题是文件关联经常被抢。新装一个 App(典型的是 Xcode),原来设好的文件关联就可能被它抢走,macOS 不会提示,也没有办法一键恢复,只能一个格式一个格式地改回去,而且 macOS 26.4 之后每改一种类型还要确认一次。

所以我写了 Defaultly,一个免费开源的 macOS 默认 App 管理工具,在一个窗口里把文件类型、扩展名和链接的默认打开方式全部管起来。

Defaultly 主窗口截图:文件类型标签页按文本、Markdown、代码、配置与数据、无扩展名文件、PDF、文稿等分组,每组右侧选择默认打开的 App

Defaultly 能做什么

  • 按分组设置默认 App:文件类型按用途分成文本、Markdown、代码、配置与数据、无扩展名文件、PDF、文稿、图片、视频、音频、压缩包,每组一个 App 菜单,一整组一次设好,不用逐个确认,几秒内生效。
  • 无扩展名文件:让 .env、Dockerfile、.gitignore、.npmrc 用你选的编辑器打开,即使这个编辑器没有声明支持它们。
  • 单个格式例外:展开分组,给 .md、.py 这样的单个格式单独指定 App,之后改分组的 App 也不会影响它们。
  • 自定义扩展名:添加列表里没有的扩展名,包括 .go、.rs、.kt、.dart、.lua 这些 macOS 只认作临时类型的。
  • 链接的默认 App:网页(http、https)、邮件(mailto)、日历订阅(webcal)、电话、短信、FaceTime、SSH、FTP、屏幕共享,都可以选默认 App,也可以选「不打开」,比如让网页上的电话号码点了不再发起通话。
  • 诊断:拖入一个文件,看它为什么用某个 App 打开,当场改用别的;拖入一个文件夹,找出单独设置过「打开方式」的文件并清除。
  • 被抢占提醒:Xcode、浏览器等抢走你设置的关联时,Defaultly 会显示横幅,一键恢复。
  • 撤销与恢复:每次更改前保存快照,可以 ⌘Z 撤销,也可以恢复到第一次打开 Defaultly 之前的状态,恢复前会先预览每一项变化。
  • 干净卸载:内置的卸载功能会先把每一项关联恢复到原来的 App,再把自己移到废纸篓。
  • 15 种语言:界面支持简体中文、繁体中文、英语、日语等 15 种语言,可以在 App 内切换。

Defaultly 不在后台运行,没有登录项,不联网,也不收集数据。

安装 Defaultly

需要 macOS 26 Tahoe 或更高版本。

  1. 打开 Releases 页面,在最新版本的 Assets 里下载 Defaultly-<version>.dmg。
  2. 双击打开 DMG,把 Defaultly 拖到同一窗口里的「应用程序」文件夹上。
  3. 推出 DMG,从「应用程序」文件夹打开 Defaultly。

没有安装程序,也不需要管理员密码。更新时下载新的 DMG 再拖一次,覆盖旧版本即可,设置、规则和快照都会保留。

首次打开:允许未公证的 App

Defaultly 还没有经过 Apple 公证,第一次打开时 macOS 会拦下它,允许一次就行:

  1. 双击 Defaultly,macOS 提示无法验证时,点按「完成」。不要点蓝色的「移到废纸篓」。

    macOS 提示无法验证 Defaultly 的对话框,点按完成按钮

  2. 打开「系统设置 › 隐私与安全」,向下滚动到「安全性」,点按 Defaultly 旁边的「仍要打开」。第 1 步之后大约一小时内这个按钮都在。

    系统设置隐私与安全页面,安全性一栏中 Defaultly 被拦截,旁边是仍要打开按钮

  3. 输入登录密码或使用触控 ID,在随后的对话框里再点按一次「仍要打开」。

    确认对话框,点按仍要打开以运行 Defaultly

之后 Defaultly 就能正常打开了,内置的辅助程序也会一并获得允许,打开无扩展名文件时不会再有提示。截图是英文界面,简体中文 macOS 里的按钮名称就是上面写的这些。

使用方法

让 .env、Dockerfile 用编辑器打开

在「文件类型」标签页找到「无扩展名文件」这一组,在右侧菜单里选择你的编辑器(比如 VS Code、Zed、Sublime Text),然后点窗口底部的「应用」。之后双击 .env、Dockerfile 这类文件,就会直接用这个编辑器打开。

批量设置代码文件的默认编辑器

同样的方法,给「代码」「配置与数据」「Markdown」这些分组选好 App,点「应用」。代码分组覆盖了 JavaScript、TypeScript(.tsx)、Python、Java、C、C++、C#、PHP、Ruby、Swift、Go、Rust、Kotlin、Dart、Lua、Shell、PowerShell、SQL 等常用语言,没有 macOS 正式类型的 .go、.rs 也包括在内。

想让某个格式例外,点分组所在的行展开,在那一行的菜单里另选一个 App,这一行会标上「单独设置」;要恢复跟随分组,选「跟随分组」。

搜索和添加扩展名

在右上角搜索框输入扩展名,比如 py 或 env,会直接跳到对应的行。扩展名不在任何分组里时,搜索结果里会出现「添加…」:输入扩展名后,Defaultly 会显示 macOS 把它识别成什么,并建议放进哪个分组,点「添加」就行。

设置默认浏览器和邮件 App

文件类型下方有一张「链接」卡片,可以设置网页浏览器、电子邮件、日历订阅、电话、SSH 等链接用哪个 App 打开。更改浏览器时 macOS 仍会弹出系统对话框让你确认,这是为了防止浏览器被悄悄劫持。

应用、撤销与恢复

所有更改都会先暂存,窗口底部会显示有多少项待应用的更改,点「应用」生效,点「放弃」丢弃。

  • 「编辑 › 撤销」(⌘Z)撤销上一次应用,可以连续撤销。
  • 工具栏里的圆形箭头按钮是「恢复到初始」,把 Defaultly 改过的每种文件类型和链接都指回第一次打开 Defaultly 时的 App,执行前会列出每一项变化。
  • 「设置 › 历史」里保存了最近 20 份快照,任意一份都可以恢复。

诊断某个文件为什么用这个 App 打开

切换到「诊断」标签页,把文件拖进虚线框,会显示由哪个 App 打开它以及原因:是这个文件在访达里单独设置过「打开方式」,还是你为这类文件选了这个 App,或者什么都没设置、由 macOS 自己选的。结果下方可以直接「改用」别的 App。

把文件夹拖进去,Defaultly 会列出里面所有单独设置过「打开方式」的文件,选中后点「移除它们的单独设置」,这些文件就会改为跟随所属类型的设置。

Defaultly 是怎么做到的

Defaultly 的 App 包里带了一个很小的辅助程序 Defaultly Helper。你为无扩展名文件选择编辑器时,Defaultly 把 public.data 指向这个辅助程序。打开这类文件时,辅助程序检查文件内容:文本文件交给你选的编辑器,二进制文件在访达中显示,然后退出。它没有窗口,不常驻后台,空闲不到一秒就会退出。

.md、.py 这类你选的 App 本来就支持的类型,会直接分配给这个 App,不经过辅助程序。

macOS 没有提供为 public.data 设置默认 App 的公开 API,所以 Defaultly 会把所有文件类型的更改一次写入 LaunchServices 偏好设置,再重启一次 lsd 服务让它生效。这个机制没有 Apple 官方文档,系统更新后可能失效;如果某项更改没生效,Defaultly 会改用公开 API(需要你逐个确认),无扩展名文件则可以改用「设置」里的文件夹规则。

常见问题

Mac 上怎么更改无扩展名文件的默认打开方式? 打开 Defaultly,为「无扩展名文件」选择一个 App,点「应用」。之后 .env、Dockerfile 这类文件就会用这个 App 打开。

为什么访达的「全部更改」对 .env 文件不起作用? macOS 把这类文件当作通用数据(public.data),不允许通过公开 API 更改它的默认 App。Defaultly 借助辅助程序绕过了这个限制。

为什么 .ts 文件不在代码分组里? macOS 把 .ts 识别为视频格式(MPEG-2 传输流),改它会影响真正的视频文件,所以代码分组只包含 TypeScript 的 .tsx。

能撤销所有更改吗? 可以。Defaultly 第一次运行时会记录原始关联,并且永远不会覆盖这份记录,「恢复到初始」会把每个改过的类型指回原来的 App。

怎么卸载? 在「设置 › Defaultly 写了什么」底部点「卸载 Defaultly…」,它会先把改过的关联全部恢复,再把自己移到废纸篓。

更详细的说明,包括开发者模式、规则、文件夹规则,可以看项目的中文说明。

GitHub 项目地址: https://github.com/zhaojiannet/defaultly

分享:

评论