趙健的技術筆記

用 Defaultly 批次設定 Mac 預設開啟方式,讓 .env、Dockerfile 等無副檔名檔案也能用編輯器打開

技術 約 4831 字 · 13 分鐘 - 次閱讀

在 Mac 上寫程式,.env、.gitignore、Dockerfile 這類沒有副檔名的檔案一直很麻煩:按兩下不是用「文字編輯」打開,就是乾脆打不開。用 Finder 的「取得資訊 › 打開檔案的應用程式 › 全部更改⋯」改成 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. 輸入登入密碼或使用 Touch 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 打開它以及原因:是這個檔案在 Finder 裡單獨設定過「打開檔案的應用程式」,還是你替這類檔案選了這個 App,或者什麼都沒設定、由 macOS 自己選的。結果下方可以直接「改用」別的 App。

把檔案夾拖進去,Defaultly 會列出裡面所有單獨設定過「打開檔案的應用程式」的檔案,選取後按「移除它們的單獨設定」,這些檔案就會改為跟隨所屬類型的設定。

Defaultly 是怎麼做到的

Defaultly 的 App 套件裡帶了一個很小的輔助程式 Defaultly Helper。你替無副檔名檔案選擇編輯器時,Defaultly 會把 public.data 指向這個輔助程式。打開這類檔案時,輔助程式會檢查檔案內容:文字檔交給你選的編輯器,二進位檔在 Finder 中顯示,然後結束。它沒有視窗,不常駐背景,閒置不到一秒就會結束。

.md、.py 這類你選的 App 本來就支援的類型,會直接指定給這個 App,不經過輔助程式。

macOS 沒有提供替 public.data 設定預設 App 的公開 API,所以 Defaultly 會把所有檔案類型的更改一次寫入 LaunchServices 偏好設定,再重新啟動一次 lsd 服務讓它生效。這個機制沒有 Apple 官方文件,系統更新後可能失效;如果某項更改沒有生效,Defaultly 會改用公開 API(需要你逐一確認),無副檔名檔案則可以改用「設定」裡的檔案夾規則。

常見問題

Mac 上怎麼更改無副檔名檔案的預設開啟方式? 打開 Defaultly,替「無副檔名檔案」選擇一個 App,按「套用」。之後 .env、Dockerfile 這類檔案就會用這個 App 打開。

為什麼 Finder 的「全部更改」對 .env 檔案沒有作用? macOS 把這類檔案當作通用資料(public.data),不允許透過公開 API 更改它的預設 App。Defaultly 藉由輔助程式繞過了這個限制。

為什麼 .ts 檔案不在程式碼分組裡? macOS 把 .ts 辨識為影片格式(MPEG-2 傳輸串流),改它會影響真正的影片檔,所以程式碼分組只包含 TypeScript 的 .tsx。

能撤銷所有更改嗎? 可以。Defaultly 第一次執行時會記錄原始關聯,而且永遠不會覆寫這份記錄,「復原到初始」會把每個改過的類型指回原本的 App。

怎麼解除安裝? 在「設定 › Defaultly 寫入了什麼」底部按「解除安裝 Defaultly…」,它會先把改過的關聯全部復原,再把自己丟到垃圾桶。

更詳細的說明,包括開發者模式、規則、檔案夾規則,可以看專案的繁體中文說明。

GitHub 專案網址: https://github.com/zhaojiannet/defaultly

分享:

評論