如何在 Mac 上为文件类型设置图标?

Chi*_*ron 46 mac osx-snow-leopard macos

如何为整个系统的某些文件类型设置图标?

例如,我有以 .scala 扩展名结尾的文本文件,我想在整个系统中为该文件关联一个图标,并为该扩展名的任何新创建的文件关联一个图标。

谢谢。

Dan*_*eck 43

文件类型的图标由启动服务处理(该服务确定哪个应用程序处理文件类型等)。默认情况下,文件图标始终由处理打开文件的应用程序提供。这样,例如预览默认提供 PDF 图标和 PNG 图标,但是如果您将所有 PNG 文件更改为使用 Pixelmator 打开,这些文件之后会获得一个 Pixelmator 样式的图标。

您需要做的是将您的文件类型定义添加到默认打开它的应用程序中,或者为该文件类型创建您自己的“虚拟”应用程序


例如,我的系统还不知道.scala,我想TextMate处理它。

首先,我显示包内容TextMate.app,导航到Contents/开放的Info.plist,无论是用文本编辑器,或者Property List Editor,苹果的开发者工具的一部分。

TextMate 使用一种不寻常的格式Info.plist(通常是二进制或 XML),其摘录如下所示:

CFBundleDocumentTypes = (
    {   CFBundleTypeName = "ADA source";
        CFBundleTypeExtensions = (adb, ads); 
        CFBundleTypeIconFile = ADA; 
    },
Run Code Online (Sandbox Code Playgroud)

父键CFBundleDocumentTypes就是我们想要的。它的第一个子元素用大括号括起来,包含一个文件类型定义,包括名称(对于 Finder 中的文件类型列)、文件扩展名和图标文件的名称(ADAfor TextMate.app/Contents/Resources/ADA.icns)。

为了支持.scala,我们需要在同一个父元素下添加一个类似于上面的兄弟元素CFBundleDocumentTypes

CFBundleDocumentTypes = (
    {   CFBundleTypeName = "ADA source";
        CFBundleTypeExtensions = (adb, ads); 
        CFBundleTypeIconFile = ADA; 
    },
    {   CFBundleTypeName = "Scala source";
        CFBundleTypeExtensions = (scala); 
        CFBundleTypeIconFile = ADA; 
    },
Run Code Online (Sandbox Code Playgroud)

为了简便起见,我使用的是相同的图标文件,但我们可以创建一个自己,把它复制到TextMate.app/Contents/Resources/SCALA.icns并把它称为SCALAInfo.plist

现在,如果 TextMate 正在运行,请关闭它,将应用程序移动TextMate.app到不同的文件夹,然后再次打开它。关闭它,然后将其移回,然后再次打开它。这样做是为了让 Launch Services 接收Info.plist我们刚刚执行的更改。

结果如下所示(请记住,我们为 重用了 TextMate Ada 图标.scala):

替代文字

如果您不想将应用程序关联到打开的.scala文件(无法想象为什么,但有一种方法可以做到这一点):将文件的添加项更改为以下内容:

    {   CFBundleTypeName = "Scala source";
        CFBundleTypeExtensions = (scala); 
        CFBundleTypeIconFile = ADA; 
        CFBundleTypeRole = "None";
    },
Run Code Online (Sandbox Code Playgroud)

现在,应用程序声明了文件类型,但告诉系统它不知道如何处理它(Apple 给出了 Finder 声明字体类型的示例,尽管它本身无法打开它们)。

*请注意,对文件类型的任何永久应用程序分配都会覆盖图标,可能会覆盖“未知文档”类型。


如果您已经有一个与 关联的应用程序.scala,并且只想更改文件图标而不更改关联的应用程序:

打开应用程序的Info.plist,在 中查找文件类型条目CFBundleDocumentTypes,然后获取CFBundleTypeIconFile. 修改这个文件,.../Contents/Resources/它应该会在不久之后反映在 Finder 中。


奖金信息:

如何将单个文档或文件夹的图标更改为图像文件

假设您有一张~/Desktop/test.png要使用图标的图像(这是上面用于说明.scala/TextMate/Ada 图标更改的屏幕截图。

打开/Applications/Utilities/Terminal.app并输入:

sips -i ~/Desktop/test.png
Run Code Online (Sandbox Code Playgroud)

这会将test.png文件图标更改为其图像。由于我喜欢递归,让我们试试这个:

之前,纯预览png图标(禁用图像预览):

替代文字

之后,图像文件本身就是它的预览:

替代文字

现在我们可以打开文件的获取信息对话框,单击左上角所需的未来文档图标,Cmd-C复制它,打开文档文件的获取信息对话框,单击左上角不需要的当前文档图标,然后Cmd-V粘贴我们想要的图标。


或者,您可以在预览中打开要用作图标的图像文件,Cmd-A选择全部,Cmd-C将图像复制到剪贴板。然后打开目标文档的“获取信息”对话框,选择左上角要更改的图标,然后Cmd-V将图像粘贴到其上。

  • 要验证的一件事:这是否会使应用程序的数字签名无效?`codesign --verify --verbose /Applications/TextMate.app` 或类似的东西。如果无效,则不要对需要防火墙例外或需要钥匙串的应用程序执行此操作。我不确定弄乱签名还会导致什么问题。(详细信息+1!) (3认同)
  • 聚会有点晚,但我必须同意@Arjan。如果你有一个代码签名的应用程序,比如说,哦,我不知道,...... Xcode......它实际上会告诉你该应用程序已损坏并删除它并从 App Store 重新下载它。我真正不喜欢的是像 Enthought Canopy 这样的应用程序如何为自己劫持所有的扩展图标。Apple 真的应该这样做,当您为系统进入的文件类型设置默认编辑器时,并对应用程序关联等内容进行所有必要的更改。 (2认同)
  • FWIW,在 El Capitan (OS X 10.11.1) 上,即使将例如 Sublime Text 设置为默认应用程序以打开例如“.cpp”文件,Xcode 图标也优先。这要么是一些奇怪的本地系统问题,要么是 OS X 中的一个非常蹩脚的错误...... (2认同)