Skip to content

Instantly share code, notes, and snippets.

@philipptempel
Last active January 5, 2023 17:44
Show Gist options
  • Save philipptempel/6110875 to your computer and use it in GitHub Desktop.
Save philipptempel/6110875 to your computer and use it in GitHub Desktop.
How to set an icon for a file type on Mac?

Q: How to set an icon for some file types throughout the whole system?

For example, I have text files that ends with .scala extension and I want to associate an icon for that files through the whole system and for any newly created file of this extension.

Gisted from http://superuser.com/questions/178316/how-to-set-an-icon-for-a-file-type-on-mac

All credits go to the author of the accepted and top-voted answer by Daniel Beck

A: How to set an icon for a file type on Mac!

Icons for file types are handled by Launch Services (the service determining, among other things, which application handles a file type). The file icon is always provided by the application handling opening a file by default. This way, e.g. Preview provides PDF icons by default, and PNG icons, but if you change all PNG files to open using Pixelmator instead, these files get a Pixelmator-style icon afterwards.

What you need to do is add your file type definition to the application that opens it by default, or create your own "dummy" application for the file type.


As an example, my system does not yet know about .scala, and I want TextMate to handle it.

First, I Show Package Contents of TextMate.app, navigate to Contents/ and open Info.plist, either with a text editor, or Property List Editor, part of Apple's developer tools XCode.

TextMate uses an unusual format for Info.plist (it's usually binary or XML), an excerpt of which looks like this:

CFBundleDocumentTypes = (
    {   CFBundleTypeName = "ADA source";
        CFBundleTypeExtensions = (adb, ads); 
        CFBundleTypeIconFile = ADA; 
    },

The parent key CFBundleDocumentTypes is what we want. The first child element of it, enclosed in curly braces, contains a file type definition, complete with name (for file type column in Finder), file extensions, and the name of the icon file (ADA for TextMate.app/Contents/Resources/ADA.icns).

To support .scala, we need to add a sibling element similar to the one above, under the same parent element CFBundleDocumentTypes:

CFBundleDocumentTypes = (
    {   CFBundleTypeName = "ADA source";
        CFBundleTypeExtensions = (adb, ads); 
        CFBundleTypeIconFile = ADA; 
    },
    {   CFBundleTypeName = "Scala source";
        CFBundleTypeExtensions = (scala); 
        CFBundleTypeIconFile = ADA; 
    },

For simplicity's sake, I'm using the same icon file, but we can create one ourselves, copy it to TextMate.app/Contents/Resources/SCALA.icns and refer to it as SCALA in Info.plist.

Now, close TextMate if it's running, move the application TextMate.app to a different folder, and open it again. Close it, and move it back, then open it yet again. This is done so Launch Services picks up the changes to Info.plist we just performed.

The result looks like this (remember, we reused the TextMate Ada icon for .scala):

alt text

If you don't want to associate an application to open .scala files (can't imagine why, but there's a way to do this): Change the additions to the file to the following:

    {   CFBundleTypeName = "Scala source";
        CFBundleTypeExtensions = (scala); 
        CFBundleTypeIconFile = ADA; 
        CFBundleTypeRole = "None";
    },

Now, the application declares the file type, but tells the system that it does not know how to handle it (Apple gives the example of Finder declaring font types, although it cannot open them itself).

Note that any permanent application assignment to the file type overrides the icon, probably to the "unknown document" kind.

If you already have an application associated with .scala, and just want to change the file icon without changing the associated application:

Open of the application's Info.plist, look for the file type entry in CFBundleDocumentTypes, and get the CFBundleTypeIconFile. Modify this file in .../Contents/Resources/ and it should be reflected in Finder shortly afterwards.

Bonus information:

How to change a single document's or folder's icon to an image file

Suppose you have an image ~/Desktop/test.png which you want to use an an icon (it's the screenshot used above to illustrate the .scala/TextMate/Ada icon change.

Open /Applications/Utilities/Terminal.app and enter:

$ sips -i ~/Desktop/test.png

This will change the test.png file icon to its image. Since I enjoy recursion, lets try this:

Before, the plain Preview png icon (image preview is deactivated):

alt text

After, the image file itself is its preview:

alt text

Now we can open the file's Get Info dialog, click the desired, future document icon on the top left, Cmd-C to copy it, open the document file's Get Info dialog, click the undesired, current document icon on the top left, and Cmd-V to paste the icon we want.


Alternatively, you can open the image file you want to use as icon in Preview, Cmd-A to select all, Cmd-C to copy the image to clipboard. Then open the target document's Get Info dialog, select the icon to change in the top left, and Cmd-V to paste the image over it.

@speelbarrow
Copy link

Thank you so much. All tutorials for programming should be written like this (explain ALL the possibilities of situations as opposed to just assuming everyone is doing the exact same thing as you).

@aikinai
Copy link

aikinai commented Jan 27, 2021

Yes, this tutorial is awesome.
Thanks for the help! ٩(◕‿◕。)۶

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment