原文发表自个人博客css
在 mac 中打开一个文件会有一个默认的应用. 可是这个应用每每不是咱们但愿的那个. 好比我想打开一个 .c
, Mac 会启动 XCode来打开这个文件, 这每每不是我但愿的.
再好比我想打开一个 .md
文件, 这货竟然没有默认打开方式, 这个时候咱们可能会右击而后找到那个打开方式, 设置成为 sublime 或者 mou.html
可是碰到一个 .markdown
的文件, 系统又蒙圈了, 仍是不知道用什么打开, 固然咱们也能够按照刚才说的去修改.git
那么有没有一个快捷的方式, 能够批量的修改系统中全部文件的默认打开方式呢? 有! 就是咱们今天要介绍的 duti
github
duti是 Mac 下的一个命令行工具, 主要做用为不一样文件类型设置默认的应用. duti 的意思其实就是 default for UTIshell
在介绍如何使用以前咱们须要明确几个概念:sublime-text
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 (应用标识符)) 是 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
那么知道了文件的类型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.
好了, 介绍了这么多概念, 终于到了修改文件默认打开方式的时候了!
duti [ -hVv ] [ settings_path ]
若是上述语句没有给settings_path
, duti 将会从标准输入读取配置. 若是setting_path
是个文件夹的话, 那么 duti 将会从文件夹内的全部文件中读取配置.
那么这个 setting_path 文件的每一行其实须要三个字段:
应用的标识符 Bundle ID (好比: com.apple.Safari)
文件类型的 UTI (好比: public.html), 扩展名或者 MIME 类型
应用对于 UTI 的角色是什么 (好比, editor 编辑器)
-s: 选项会让 duti 从命令行读参数.
-x ext: 选项会让 duti 输出参数中扩展名对应的默认应用
-d uti: 打印 UTI 的默认应用.
-l uti: 打印 UTI 的全部可用应用.
-V: 打印版本.
-v: 详细输出.
-h: 帮助.
使用 -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打开啦~