Answers:
这是可行的,但可能并不像您想象的那么简单。您需要非常熟悉统一类型标识符。查看Wikipedia的“ 统一类型标识符”页面。
OS X在名称为的首选项文件中存储有关首选文件关联的信息com.apple.LaunchServices.plist
。在尝试查找和修改该文件之前,建议您熟悉OS X的默认值(也称为“设置”)的域层次结构。关于这方面的一篇体面文章可以在这里找到。(免责声明:他们似乎在那个网站上卖东西。我不知道那是什么,与他们没有任何联系,解释只是一个很好的解释。)
既然您了解所有默认值和UTI(不是医疗类型),现在我们可以从脚本/命令行讨论设置文件关联。
首先,您需要了解正确的方法来标识要与其建立关联的文件。
还记得我说过的UTI很重要吗?识别文件有多种方法。这取决于您的系统上是否已正式声明类型。例如,当您在系统上使用诸如TextMate或TextWrangler之类的体面的文本编辑器时,它们会在类型层次结构中添加很多类型声明。但是,如果没有这些应用程序,则可能没有声明的类型。
好,足够多的谈话。例子:
获取文件的UTI:
$ mdls myFile.xml
...
kMDItemContentType = "public.xml"
kMDItemContentTypeTree = (
"public.xml",
"public.text",
"public.data",
"public.item",
"public.content"
)
...
嗯不错。我们可以使用的显式内容类型。写下来。
$ mdls myFile.myExtn
...
kMDItemContentType = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree = (
"public.data",
"public.item"
)
...
哎呀。OS X不知道“ .myExtn”文件。因此,它创建了一个动态的UTI,我们无法将其用于任何用途。父类型太通用而无法使用。
现在我们知道文件是什么了,让我们看一下LaunchServices.plist文件,看看我们可以做什么:
$defaults read com.apple.LaunchServices
{
...
LSHandlers = (
{
LSHandlerContentType = "public.html";
LSHandlerRoleAll = "com.apple.safari";
LSHandlerRoleViewer = "com.google.chrome";
},
...
{
LSHandlerContentTag = myExtn;
LSHandlerContentTagClass = "public.filename-extension";
LSHandlerRoleAll = "com.macromates.textmate";
},
...
);
...
}
因此,当您要使用“良好”的内容类型时,第一种构造会更好。否则,其他构造。请注意,该文件中还有其他构造,但它们与您的要求无关。当您查看输出时,只知道它们在那里。
如您所见,您将需要为要使用的应用程序找到UTI。Safar和TextMate的UTI在上面的示例中,但是通常可以找到应用程序的UTI:
$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
<key>CFBundleIdentifier</key>
<string>com.apple.Safari</string>
...
注意:我不知道LSHandlerRoleAll和LSHandlerRoleViewer之间的区别是什么。我找不到任何地方的文档。我做看到的是,时间LSHandlerRoleAll为99%的只有一组(即不存在LSHandlerRoleViewer在所有),它被设置为UTI的,你的愿望与类型相关联的应用程序。
到目前为止,我将离开HOW来设置所需的值,作为读者的练习。弄乱这些东西可能有些危险。您完全有可能破坏文件,并且不进行任何文件关联。然后,您必须丢弃文件并重新开始。
一些提示:
defaults write
及其语法PlistBuddy
。 man PlistBuddy
和/usr/libexec/PlistBuddy -h
LSHandlerRoleViewer
,我想知道它是否可能与默认查看而不是编辑有关(apple.stackexchange.com/a/49998/206073使我处于这些立场)。我不知道在什么情况下可以确定是否要打开进行查看或编辑,但是……(主题不正确,CFBundleTypeRole
看起来它接受相似的值)
com.apple.LaunchServices/com.apple.launchservices.secure
可能是后来的MacOS系统中的领域...
一种选择是编辑~/Library/Preferences/.GlobalPreferences.plist
:
defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=com.adobe.pdf;LSHandlerRoleAll=net.sourceforge.skim-app.skim;}'
您可以使用PlistBuddy来检查条目是否已经存在,但是我没有找到任何方法来应用更改而不重新启动或重建Launch Services数据库。
使用duti,可以将其duti ~/.duti
另存为~/.duti
:
net.sourceforge.skim-app.skim .pdf all
它并不能真正回答您的问题,但可能是一个解决方案。
Finder中的检查器显示当前选定文件的信息:
⌘+ ⌥+I
当选择多个文件时,Finder的“ 摘要信息”窗口非常有用:
^+ ⌘+I
如果选择相同类型的多个文件,则上述两种方法都将允许您轻松切换这些文件的“ 打开方式:”属性。
不是您确切问题的答案,而是另一种可能的解决方案。您可以从命令行使用-a参数打开带有特定应用程序的文档。
例如,打开当前目录中的所有html文件。
> open -a 'Google Chrome' *.html
在Atom文本编辑器中打开index.html和javascript控制器文件:
> open -a 'atom' index.html js/controllers/*.js
根据您的需要,您可以将其修改为Automator服务,可以为其分配快捷键,并以选定的文件路径作为参数。
这是一个示例Automator AppleScript,它接收文件作为输入并在Chrome中打开所选文件:
on run {input, parameters}
set openFiles to "open -a 'Google Chrome' " --note the trailing space
set filePaths to {}
--covert the filePaths to posix style
repeat with i from 1 to count of input
set aFile to input's item i as alias
set aFile to quoted form of POSIX path of aFile
set filePaths's end to aFile
end repeat
--convert filePaths list to a string delimited by spaces
set tid to text item delimiters
set text item delimiters to " "
set filePaths to filePaths as text
set text item delimiters to tid
--Open files via commandline
do shell script openFiles & filePaths
return input
结束运行
显然,您可以更改应用程序名称“ Sublime”文本编辑器,将其另存为另一项服务,并为其分配两个快捷键。