設置 Mac 下文件的默認打開程序 — duti 詳解

原文發表自個人博客css

在 mac 中打開一個文件會有一個默認的應用. 可是這個應用每每不是咱們但願的那個. 好比我想打開一個 .c, Mac 會啓動 XCode來打開這個文件, 這每每不是我但願的.
再好比我想打開一個 .md 文件, 這貨竟然沒有默認打開方式, 這個時候咱們可能會右擊而後找到那個打開方式, 設置成爲 sublime 或者 mou.html

圖片描述

可是碰到一個 .markdown的文件, 系統又蒙圈了, 仍是不知道用什麼打開, 固然咱們也能夠按照剛纔說的去修改.git

那麼有沒有一個快捷的方式, 能夠批量的修改系統中全部文件的默認打開方式呢? 有! 就是咱們今天要介紹的 dutigithub

Concepts

duti是 Mac 下的一個命令行工具, 主要做用爲不一樣文件類型設置默認的應用. duti 的意思其實就是 default for UTIshell

在介紹如何使用以前咱們須要明確幾個概念:sublime-text

UTI

Mac 下的文件類型被定義爲 Uniform Type Identifiers (UTI). 例如, HTML 文件的 UTI 是 public.html; Word 文檔的 UTI 是 com.microsoft.word.doc.
那麼改變文件類型的默認打開方式的第一步就是確認文件類型啦.markdown

第一個方式是去看蘋果列出來的 UTI Uniform Type Identifiers Referenceapp

第二個方式是使用 mdls 命令, 這哥們的做用就是: lists the metadata attributes for the specified file
那麼如何使用呢, 很簡單隻要把你想要得到 UTI 的文件做爲參數就行了編輯器

$ mdls test.txt

kMDItemContentType             = "public.plain-text"
kMDItemContentTypeTree         = (
    "public.plain-text",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)

咱們能夠看到其中就有這樣的輸出(截取). 能夠看到一個 .txt 文件的 UTI 就是 public.plain-text, 那麼下面這一坨是幹什麼的呢?
由於文件類型也有一個具體和寬泛的劃分嘛, 越往下約 general.
再來看一個ide

$ mdls test.css

kMDItemContentType             = "public.css"
kMDItemContentTypeTree         = (
    "public.css",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)

public.css 就是 .css 的 UTI.

Bundle ID

Bundle ID (應用標識符)) 是 iOS 或者 Mac 應用的惟一標識. 也就是咱們但願用什麼軟件打開咱們的文件的那個軟件的 ID 啦.

能夠用如下命令得到 Bundle ID:

$ osascript -e 'id of app "Finder"'
com.apple.finder

$ osascript -e 'id of app "Atom"'
com.github.atom

$ osascript -e 'id of app "Sublime Text 2"'
com.sublimetext.2

Bundle Id & UTI

那麼知道了文件的類型UTI, 知道了軟件的 Bundle ID, 距離設定文件的默認程序其實就差一步了.
還有一個概念, 就是這個軟件對於這個文件是個什麼角色. 其實咱們這裏大部分狀況只須要關心 editor 這個角色. 就是編輯角色. 其餘的沒啥用.

  • all: application handles all roles for the given UTI.

  • viewer: application handles reading and displaying documents with the given UTI.

  • editor: application can manipulate and save the item. Implies viewer.

  • shell: application can execute the item.

  • none: application cannot open the item, but provides an icon for the given UTI.

Usage

好了, 介紹了這麼多概念, 終於到了修改文件默認打開方式的時候了!

duti [ -hVv ] [ settings_path ]

若是上述語句沒有給settings_path, duti 將會從標準輸入讀取配置. 若是setting_path是個文件夾的話, 那麼 duti 將會從文件夾內的全部文件中讀取配置.

那麼這個 setting_path 文件的每一行其實須要三個字段:

  • 應用的標識符 Bundle ID (好比: com.apple.Safari)

  • 文件類型的 UTI (好比: public.html), 擴展名或者 MIME 類型

  • 應用對於 UTI 的角色是什麼 (好比, editor 編輯器)

options

  • -s: 選項會讓 duti 從命令行讀參數.

  • -x ext: 選項會讓 duti 輸出參數中擴展名對應的默認應用

  • -d uti: 打印 UTI 的默認應用.

  • -l uti: 打印 UTI 的全部可用應用.

  • -V: 打印版本.

  • -v: 詳細輸出.

  • -h: 幫助.

examples

使用 -s 選項, 從命令行讀取參數:

duti -s com.apple.Safari public.html all
duti -s com.apple.Finder ftp

可是我比較喜歡把這個設定放到一個文件裏, 好比 duti-sublime,
我但願用 Sublime 打開 .md, .css, .js, 以及富文本文件, 純文本文件, 以及一些 shell 腳本.
那麼個人文件內容以下:

com.sublimetext.2    net.daringfireball.markdown  editor
com.sublimetext.2    public.css    editor
com.sublimetext.2    public.script    editor
com.sublimetext.2    public.source-code  editor
com.sublimetext.2    public.rtf  editor
com.sublimetext.2    public.plain-text   editor
com.sublimetext.2    public.unix-executable   editor

運行命令:

duti duti-sublime

而後咱們在使用 -x 選項, 打印 UTI 的默認應用

$ duti -x css
Sublime Text 2.app
/opt/homebrew-cask/Caskroom/sublime-text/2.0.2/Sublime Text 2.app
com.sublimetext.2

雙擊test.css就是Sublime打開啦~

Reference

相關文章
相關標籤/搜索