Как установить значок для типа файла на Mac?


42

Как установить значок для некоторых типов файлов, продуманных всей системой?

Например, у меня есть текстовые файлы, которые заканчиваются расширением .scala, и я хочу связать значок для этих файлов по всей системе и для любого вновь созданного файла этого расширения.

Спасибо.


Просто заметил, что вы MAC ... но в любом случае, в Windows вы бы изменили приложение по умолчанию, связанное с этим типом файла. Затем файл приобретает значок этого приложения.
MrWhite

12
@ w3d: он не на MAC, он на Mac.
Вуфферс

Ответы:


41

Значки для типов файлов обрабатываются Launch Services (служба, определяющая, помимо прочего, какое приложение обрабатывает тип файла). Значок файла всегда обеспечивается обработчиком приложения, открывающим файл по умолчанию. Таким образом, например, Предварительный просмотр предоставляет значки PDF по умолчанию и значки PNG, но если вы измените все файлы PNG, чтобы открывать их с помощью Pixelmator, эти файлы впоследствии получат значок в стиле Pixelmator.

Что вам нужно сделать, это добавить определение типа вашего файла в приложение, которое открывает его по умолчанию, или создать свое собственное «фиктивное» приложение для типа файла .


Как пример, моя система еще не знает .scala, и я хочу TextMateсправиться с этим.

Во- первых, я Show Package Contents из TextMate.app, перейдите Contents/и открытые Info.plist, либо с помощью текстового редактора, или Property List Editor, часть инструментов разработчика Apple.

TextMate использует необычный формат Info.plist(обычно это двоичный файл или XML), фрагмент которого выглядит следующим образом:

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

Родительский ключ CFBundleDocumentTypes- это то, что мы хотим. Первый его дочерний элемент, заключенный в фигурные скобки, содержит определение типа файла, полное имя (для столбца типа файла в Finder), расширения файла и имя файла значка ( ADAдля TextMate.app/Contents/Resources/ADA.icns).

Для поддержки .scalaнам нужно добавить элемент одного уровня, аналогичный приведенному выше, под тем же родительским элементом CFBundleDocumentTypes:

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

Для простоты я использую тот же файл значков, но мы можем создать его сами, скопировать TextMate.app/Contents/Resources/SCALA.icnsи ссылаться на него, как SCALAв Info.plist.

Теперь закройте TextMate, если он запущен, переместите приложение TextMate.appв другую папку и снова откройте его. Закройте и переместите обратно, затем откройте еще раз. Это сделано для того, чтобы служба запуска запускала изменения, которые Info.plistмы только что выполнили.

Результат выглядит следующим образом (помните, мы повторно использовали значок Ada TextMate .scala):

альтернативный текст

Если вы не хотите связывать приложение для открытия .scalaфайлов (не представляю, почему, но есть способ сделать это): Измените дополнения к файлу следующим образом:

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

Теперь приложение объявляет тип файла, но сообщает системе, что не знает, как с ним обращаться (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

Это изменит test.pngзначок файла на его изображение. Так как мне нравится рекурсия, давайте попробуем это:

Ранее простой pngзначок предварительного просмотра (предварительный просмотр изображения деактивирован):

альтернативный текст

После этого сам файл изображения является его предварительным просмотром:

альтернативный текст

Теперь мы можем открыть диалоговое окно Get Info для файла , щелкнуть по нужному значку будущего документа в левом верхнем углу, Cmd-Cчтобы скопировать его, открыть диалоговое окно Get Info для файла документа , щелкнуть по нежелательному значку текущего документа в левом верхнем углу и Cmd-Vвставить значок, который мы хотим.


Кроме того, вы можете открыть файл изображения, который вы хотите использовать в качестве значка в окне предварительного просмотра, Cmd-Aчтобы выбрать все, Cmd-Cчтобы скопировать изображение в буфер обмена. Затем откройте диалоговое окно « Get Info» целевого документа , выберите значок для изменения в левом верхнем углу и Cmd-Vвставьте изображение поверх него.


2
Одна вещь для проверки: делает ли это недействительной цифровую подпись приложения? codesign --verify --verbose /Applications/TextMate.appили что-то похожее. Если он признан недействительным, не делайте этого для приложений, которым требуются исключения в брандмауэре или которым нужна цепочка для ключей. Я не уверен, что еще может пойти плохо, испортив подпись. (+1 для деталей!)
Арджан

1
Отредактируйте BAH, я просмотрел первый раз и не увидел ваш альтернативный метод для принудительного обновления LS. meh, FWIW: только одна вещь после изменения Info.plist приложения (или любого пакета / пакета): вам, вероятно, потребуется touchкорневой уровень пакета, чтобы обновить дату его модификации. Затем в Средстве поиска отмените выбор и повторно выберите приложение / пакет / пакет, и когда он заметит, что дата модификации более поздняя, ​​чем дата кэшированной информации в базе данных Launch Services, он перерегистрирует ее, тем самым распознавая любые изменения. ты сделал
NSGod

1
@Arjan У тебя есть смысл. К сожалению, TextMate.app: code object is not signedи я не хочу проходить это снова. Я подозреваю, что это настоящая проблема, я не думал об этом. Изменить : Если подумать, пользовательские сочетания клавиш также хранятся в Info.plist. Так что это не может быть проблемой, если это не так. Единственной проблемой может быть добавление дополнительного файла значков в комплект приложения.
Даниэль Бек

1
Я использовал точно такой же метод (хотя и вносил изменения в xml Info.plist Sublime Text). В результате сопоставление файлов сработало, но это не изменило значок для соответствующего файла. Любая идея, почему это не сработает?
gfrigon

2
Немного опоздал на вечеринку, но я должен согласиться с @Arjan. Если у вас есть приложение с подписью кода, как, скажем, о, я не знаю, ... Xcode ... оно фактически скажет вам, что приложение повреждено, и удалит его, и снова загрузит его из App Store. Что мне действительно не нравится, так это то, что такие приложения, как Enthought Canopy, захватывают все значки расширений для себя. Apple действительно должна иметь это, когда вы устанавливаете редактор по умолчанию для типа файла, в который входит система, и вносит все необходимые изменения в такие вещи, как ассоциация приложений.
AMR

1

Вам необходимо заменить файл ICNS внутри программы, назначенной в качестве программы по умолчанию для определенного типа файлов.

1 - Создайте изображение для нужного значка, затем сохраните как тип файла png (png поддерживает прозрачность).

2. Преобразуйте файл png в тип файла icns (FastIcns довольно хорош и бесплатен).

3 - Нажмите CMD или щелкните правой кнопкой мыши приложение, которое установлено в качестве приложения по умолчанию для определенного типа файла, затем выберите Показать содержимое пакета.

4. Найдите файл icns, который приложение обозначает как значок для определенного типа файла, он, вероятно, будет находиться в папке с именем Resources.

5 - Назовите файл icns, который вы создали, точно такое же имя файла, которое вы хотите заменить.

6 - Скопируйте и вставьте или перетащите созданный вами новый файл icns в папку, в которой находится файл, который вы хотите заменить, и выберите замену, когда появится опция.

7 - Готово! Все значки для этого типа файлов были заменены новыми нужными значками.


К какой версии OSX относится этот ответ ... только к метке времени, когда метод неизбежно изменяется.
JoshP

0

Я всегда делаю так, чтобы найти файл с таким расширением, щелкнуть правой кнопкой мыши по кнопке «Получить информацию» или «Command-i», чтобы открыть информационную панель. Вверху вы видите значок, который в настоящее время используется для изображения. Вы можете перетащить файл изображения в этот файл, чтобы изменить его, или, если вы скопировали изображение, вы можете щелкнуть изображение, которое хотите изменить, и выполнить вставку, чтобы изменить его.


Смотрите также изображение на Как я могу изменить значок приложения в Mac OS X? и обратите внимание, что любое изображение, которое вы можете открыть в Preview, можно использовать в качестве значка, открыв его в Preview, выбрав его и скопировав его с помощью Command-C. Это поместит изображение в буфер обмена, которое включает формат для использования в качестве значка. Затем выберите существующий значок и вставьте буфер обмена с помощью Command-V.
Арджан

3
Это не работает Когда я перетаскиваю файл .PNG к изображению на информационном экране, я получаю значок PNG, а не изображение в PNG. И это изменяет конкретный файл, а не все файлы с одинаковым расширением во всей системе.
Эран Кампф
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.