以编程方式/以脚本方式更改默认的“打开方式”设置


8

是否可以通过编程/使用脚本来更改哪个应用程序打开文件类型?

基本上,有时候我在一个网站上工作,我想设置所有的网络文件以使用文本编辑器(* .php,*。html,*。htm等)打开。

但是,其他时候,我只想查看文件,所以我想用浏览器打开它们。

现在,我将项目拖到停靠图标上,虽然可以,但是速度很慢,尤其是当我仅使用键盘浏览大量文件时。

基本上,我想要的是一个小的applescript /随便更改所有打开方式设置的内容。
这样,我可以为每个打开程序使用一个脚本,然后来回更改。

谢谢。

Answers:


10

这是可行的,但可能并不像您想象的那么简单。您需要非常熟悉统一类型标识符。查看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及其语法
  • 看一看PlistBuddyman PlistBuddy/usr/libexec/PlistBuddy -h
  • 完全跳过所有这些废话,并使用RCDefaultApp

RCDefault是否可编写脚本?我查看了他们的网站,但看起来并不像。
假名称

没关系,我有所有我感兴趣的文件类型的类型声明。
假名字

伟大的写作。至于LSHandlerRoleViewer,我想知道它是否可能与默认查看而不是编辑有关(apple.stackexchange.com/a/49998/206073使我处于这些立场)。我不知道在什么情况下可以确定是否要打开进行查看或编辑,但是……(主题不正确,CFBundleTypeRole看起来它接受相似的值)
Brett Zamir

此外,似乎com.apple.LaunchServices/com.apple.launchservices.secure可能是后来的MacOS系统中的领域...
Brett Zamir

2

一种选择是编辑~/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

1

它并不能真正回答您的问题,但可能是一个解决方案。

Finder中的检查器显示当前选定文件的信息:

+ +I

当选择多个文件时,Finder的“ 摘要信息”窗口非常有用:

^+ +I

如果选择相同类型的多个文件,则上述两种方法都将允许您轻松切换这些文件的“ 打开方式:”属性。


0

不是您确切问题的答案,而是另一种可能的解决方案。您可以从命令行使用-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”文本编辑器,将其另存为另一项服务,并为其分配两个快捷键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.