Как я могу заставить OS X распознавать новые расширения файлов?

В Finder.app вы можете нажать Enter, чтобы изменить имя выбранного в данный момент файла или папки.

OS X автоматически выберет только часть имени файла, а не расширение:

Это очень удобно, потому что таким образом вы можете просто начать вводить новое имя, не беспокоясь о случайном изменении расширения файла.

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

Я попытался сопоставить приложение, которое может открывать все .barфайлы через + I→ «Изменить все», но все равно получаю поведение, описанное выше.

Где хранится список «известных» типов файлов? Есть ли способ заставить OS X распознавать новые типы файлов?

Ответы (3)

Этот пост SuperUser сработал для меня:

Вам нужно перейти к приложению, которое вы хотите использовать для открытия этих файлов, и отредактировать его пакет. Щелкните правой кнопкой мыши приложение для обработки этих расширений файлов и выберите « Показать содержимое пакета» . Перейдите к Contentsи отредактируйте Info.plist. Вам может понадобиться Редактор списка свойств , который является частью инструментов разработчика Apple. Если вам повезет, то в формате XML. Отредактируйте этот файл CFBundleDocumentTypesи добавьте запись для нужного вам расширения.

Я использовал TextEdit в качестве приложения по умолчанию для открытия .barфайлов. Единственное, что я сделал по-другому, это изменил XML, который был в TextEdit, Info.plistна:

    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>bar</string>
        </array>
        <key>CFBundleTypeIconFile</key>
        <string>BarDocument</string>
        <key>CFBundleTypeName</key>
        <string>Bar Document</string>
        <key>CFBundleTypeRole</key>
        <string>Document</string>
    </dict>

…а затем я использовал LSRefresh.app для обновления TextEdit в базе данных служб запуска. Тогда это сработало, как вы предложили, хотя, вероятно, сломает подпись кода Textedit (и любого другого подписанного приложения) на Lion.

CFBundleTypeExtensionsявляется устаревшим ключом, который устарел в OS X 10.5 . Предпочтительным методом с 2007 года является объявление новых UTI, как упоминалось здесь и описано в моем ответе .
Извините, я должен проголосовать за это, потому что это плохой совет. Мало того, что неразумно вмешиваться в пакет приложений (рискуя причудливых побочных эффектов или хуже), но это также может полностью разрушить копию приложения. Вы замечаете, что этот процесс делает подпись кода недействительной, но не указываете, что в версиях macOS, поддерживающих песочницу (10.7+), изолированное приложение с недопустимой подписью нельзя запускать или использовать каким-либо образом.
@binarybob, чего я не понимаю, так это почему бы вам просто не щелкнуть файл правой кнопкой мыши xxx.barи не выбрать open with?
@Bob, что такое резервное копирование приложений?
@Pacerier Песочница приложений — это функция безопасности macOS, которая полностью изолирует приложения от системы и друг от друга, с очень коротким списком «прав», в котором конкретно указано, что приложениям разрешено делать. Этот список прав встроен в сигнатуру кода и проверяется каждый раз при запуске приложения, гарантируя, что возможности приложения не могут быть изменены ни случайно, ни в результате атаки. См. этот документ для технических пояснений.
Позвольте мне подкрепить комментарий @Bob. По крайней мере, начиная с macOS Catalina и, возможно, ранее, вмешательство в любой файл внутри пакета (= приложение macOS) немедленно и необратимо предотвратит запуск этого приложения. Единственный способ восстановить его — установить с нуля (перезаписав все внесенные вами изменения). Смотрите ответ @TachyonVortex для более запутанной, но более безопасной альтернативы этой проблеме.

UTI и службы запуска

Где хранится список «известных» типов файлов?

Официальный термин для «типов файлов» — унифицированные идентификаторы типов (UTI), а база данных UTI поддерживается Launch Services .

Используя Терминал , вы можете просмотреть содержимое базы данных Launch Services с помощью lsregisterинструмента, который хранится по адресу:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister

Вместо того, чтобы указывать этот длинный путь каждый раз, когда вы хотите запустить lsregister, вы можете временно добавить его каталог в свой PATH:

PATH=/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support:"$PATH"

а затем вы можете запустить lsregister, просто введя:

lsregister

Чтобы просмотреть содержимое базы данных Launch Services:

lsregister -dump

Объявление новых ИМП

Есть ли способ заставить OS X распознавать новые типы файлов?

В этой статье Apple «Объявление новых унифицированных идентификаторов типов» содержится полезная информация о том, как это сделать. Вот полный процесс:

1. Создайте фиктивное приложение

Создайте фиктивное приложение для регистрации в Launch Services:

  • Откройте редактор AppleScript (находится в папке « Утилиты » OS X ).
  • Сохраните новый пустой скрипт где-нибудь (например, на рабочем столе), установив для его формата файла Application .

2. Откройте его файл Info.plist

  • Найдите новое фиктивное приложение в Finder.
  • Щелкните его правой кнопкой мыши и выберите « Показать содержимое пакета» во всплывающем меню.
  • Откройте его папку «Содержание ».
  • Откройте файл Info.plist в текстовом редакторе (например, TextEdit ).

3. Добавьте новую ИМП

На выбор два ключа:

  • UTExportedTypeDeclarations- для ваших собственных пользовательских расширений имен файлов.
  • UTImportedTypeDeclarations– для расширений имен файлов, которые уже существуют, но не распознаются OS X.

Выберите ключ, наиболее подходящий для ваших нужд.

Затем в файле Info.plist перед двумя последними строками ( </dict></plist>) добавьте следующий код:

<key>KEY</key>
<array>
    <dict>
        <key>UTTypeIdentifier</key>
        <string>IDENTIFIER</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>EXTENSION</string>
            </array>
        </dict>
    </dict>
</array>

внесение следующих изменений:

  • Замените KEYвыбранным ключом ( UTExportedTypeDeclarationsили UTImportedTypeDeclarations).
  • Замените IDENTIFIERподходящим идентификатором обратного DNS:
    • Экспортировано - что-то вродеcom.mycompany.mytype
    • Импортировано — для формата Doom WAD от id Software подходящим идентификатором будетcom.idsoftware.wad
  • Замените EXTENSIONрасширением имени файла (без точки в начале), например: wad.

Это минимальный код, необходимый для того, чтобы службы запуска могли принять ваш новый UTI. Вы также можете добавить следующие необязательные свойства:

  • UTTypeConformsTo– См. Приложение ниже.
  • UTTypeDescription– Видимое пользователю описание, которое будет отображаться в Finder.
  • UTTypeIconFile– Если вы добавите файл изображения значка Apple в папку Contents/Resources вашего фиктивного приложения и добавите его имя файла в это свойство, то файлы с вашим новым расширением имени файла будут использовать этот значок.
  • UTTypeReferenceURL– URL-адрес справочного документа, описывающего этот тип.

Вот полный пример, показывающий все необязательные свойства:

<key>UTImportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeIdentifier</key>
        <string>com.idsoftware.wad</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>wad</string>
            </array>
        </dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Doom WAD file</string>
        <key>UTTypeIconFile</key>
        <string>DoomWAD.icns</string>
        <key>UTTypeReferenceURL</key>
        <string>http://en.wikipedia.org/wiki/Doom_WAD</string>
    </dict>
</array>

4. Зарегистрируйте новый UTI в Launch Services.

Запустите эту команду в Терминале:

lsregister <PATH_TO_APP>

заменив <PATH_TO_APP>путь к вашему фиктивному приложению, например:

lsregister ~/Desktop/MyDummyApp.app

Если теперь вы создадите файл с новым расширением имени файла, а затем выберете его в Finder и нажмете Enter, Finder должен автоматически выбрать только часть имени файла, а не расширение.

Если вы просматриваете содержимое базы данных Launch Services:

lsregister -dump

вы должны найти свой новый UTI в списке:

type    id:            50364
        bindableKey:   12608
        generation:    1
        uti:           com.idsoftware.wad
        description:   Doom WAD file
        flags:         imported  active  apple-internal  untrusted
        icon:          DoomWAD.icns
        conforms to:   public.data
        tags:          .wad

Если позже вы захотите отменить регистрацию новой UTI, передайте -uопцию lsregister:

lsregister -u ~/Desktop/MyDummyApp.app

Приложение: Иерархия UTI и соответствие

OS X объявляет иерархию UTI, которые перечислены здесь: System-Declared Uniform Type Identifiers .

Вот несколько UTI в иерархии:

  • public.content
    • public.text
      • public.rtf
      • public.html
      • public.xml
      • public.plain-text
      • public.source-code
        • public.c-source
        • public.c-header
        • com.sun.java-source
    • public.image
      • public.jpeg
      • public.tiff
      • public.png
    • public.audiovisual-content
      • public.movie
      • public.audio

Каждый UTI «соответствует» своему родительскому UTI:

Например, UTI public.html, определяющий текст HTML, соответствует базовому текстовому идентификатору public.text. В этом случае соответствие позволяет приложениям, которые могут открывать обычные текстовые файлы, идентифицировать HTML-файлы как те, которые они также могут открывать. ( ссылка )

При создании нового UTI рекомендуется установить для UTTypeConformsToсвойства один из существующих UTI.

Например, если ваш новый UTI представляет собой тип исходного кода, то вы должны установить для этого UTTypeConformsToсвойства значение public.source-code, чтобы его можно было открыть любыми приложениями, которые могут открывать или public.source-codeфайлы .public.plain-textpublic.text

Есть ли способ указать редактор, связанный с расширением файла?
Для ОП: это следует пометить как принятое предложение. См. комментарий @Bob.
Для @gr4nt3d: см. apple.stackexchange.com/a/323743/27729 ниже, чтобы узнать, что вы хотите сделать.

Следуй этим шагам:

  1. Выберите файл с неизвестным расширением (скажем, .txt).

  2. Щелкните правой кнопкой мыши и выберите Get Infoили используйте сочетание клавиш Commandiдля отображения информационного окна.

  3. Нажмите на индикатор раскрытия, кроме « Открыть с помощью: » , чтобы открыть подробный вид. Выберите нужное приложение из выпадающего списка. Это свяжет документ с выбранным приложением (например, TextEdit).

  4. Нажмите кнопку « Изменить все...» . Сначала он покажет диалоговое окно с просьбой подтвердить ваше намерение и свяжет все .txtдокументы, которые нужно открыть с помощью TextEdit, и оставит расширение невыбранным, когда вы нажмете «Возврат» в имени документа.