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

16

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

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

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

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

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

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

Матиас Биненс
источник

Ответы:

7

Этот пост 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.

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

ИМП и стартовые услуги

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

Официальный термин для «типов файлов» - это Унифицированные идентификаторы типов (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 ).
  • Сохраните новый пустой скрипт где-нибудь (например: на рабочем столе), установив для его формата файла значение « Приложение» .

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

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

3. Добавьте свой новый UTI

На выбор есть два ключа:

  • 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
    • Импортные - Для ID Software «s Дум WAD формат, подходящий идентификатор будетcom.idsoftware.wad
  • Заменить EXTENSIONс расширением имени файла (без точки), например: wad.

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

  • UTTypeConformsTo - См. Приложение ниже.
  • UTTypeDescription - Пользовательское описание, которое будет отображаться в Finder.
  • UTTypeIconFile- Если вы добавите файл изображения значка Apple в папку « Содержание» / «Ресурсы » в приложении-заглушке и добавите его имя файла в это свойство, то файлы с новым расширением имени файла будут использовать этот значок.
  • 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, которые перечислены здесь: объявленные системой унифицированные идентификаторы типа .

Вот несколько ИМП в иерархии:

  • 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.

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

TachyonVortex
источник
0

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

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

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

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

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

user3127882
источник