Це можливо, але, ймовірно, не так просто, як можна подумати. Вам потрібно буде ознайомитись з Уніфікованими ідентифікаторами типу. Подивіться на сторінку Уніфікованого ідентифікатора типу Wikipedia .
OS X зберігає інформацію про уподобані асоціації файлів у файлі уподобань із назвою com.apple.LaunchServices.plist
. Перш ніж спробувати спробувати знайти та змінити цей файл, я пропоную вам ознайомитись з ієрархією домену OS X щодо значень за замовчуванням (він же "налаштування"). Гідну статтю з цього приводу можна знайти тут . (Відмова: вони, здається, щось продають на цьому сайті. Я не знаю, що це таке, і не маю з ними ніякої асоціації. Пояснення - це просто добре.)
Тепер, коли ви знаєте все про за замовчуванням та ІМТ (ер, не медичний вид), тепер ми можемо поговорити про встановлення асоціацій файлів із сценарію / командного рядка.
По-перше, вам потрібно знати правильний спосіб ідентифікації файлів, з якими ви хочете об'єднатись.
Пам'ятаєте, як я сказав, що ІТС важливі? Існує кілька способів ідентифікації файлу. Це залежить від того, чи був офіційно оголошений тип у вашій системі чи ні. Наприклад, гідні текстові редактори, такі як TextMate або TextWrangler, додадуть у ієрархію типів досить декларацій типів під час використання їх у вашій системі. Якщо ж у вас немає цих додатків, ви можете не задекларувати ці типи.
Гаразд, достатньо розмов. Приклади:
Отримайте UTI для файлу:
$ mdls myFile.xml
...
kMDItemContentType = "public.xml"
kMDItemContentTypeTree = (
"public.xml",
"public.text",
"public.data",
"public.item",
"public.content"
)
...
ОК здорово. Явний тип вмісту, який ми можемо використовувати. Запишіть це десь.
$ mdls myFile.myExtn
...
kMDItemContentType = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree = (
"public.data",
"public.item"
)
...
На жаль OS X не знає про ".myExtn" файли. Отже, він створив динамічний UTI, який ми не можемо використовувати ні для чого. І батьківські типи занадто загальні, щоб бути корисними.
Тепер, коли ми знаємо, що таке наші файли, давайте подивимось на файл LaunchServices.plist і подивимося, що ми можемо зробити:
$defaults read com.apple.LaunchServices
{
...
LSHandlers = (
{
LSHandlerContentType = "public.html";
LSHandlerRoleAll = "com.apple.safari";
LSHandlerRoleViewer = "com.google.chrome";
},
...
{
LSHandlerContentTag = myExtn;
LSHandlerContentTagClass = "public.filename-extension";
LSHandlerRoleAll = "com.macromates.textmate";
},
...
);
...
}
Отже, коли у вас є "хороший" тип вмісту для використання, перша конструкція краще. Інакше інша конструкція. Зауважте, у цьому файлі є й інші конструкції, але вони не стосуються того, що ви запитували. Просто знайте, що вони є там, коли ви дивитесь на вихід.
Як бачите, вам потрібно буде знайти UTI для програми, яку ви хочете використовувати. UTI для Safar та TextMate наведено в моєму прикладі вище, але для загального пошуку UTI для програми:
$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
<key>CFBundleIdentifier</key>
<string>com.apple.Safari</string>
...
ПРИМІТКА. Я поняття не маю, що становить різницю між LSHandlerRoleAll та LSHandlerRoleViewer. Я ніде не можу знайти документацію. Що робити бачимо, що 99% часу LSHandlerRoleAll є тільки один набір (тобто немає LSHandlerRoleViewer взагалі) , і що він встановлений в УИП для додатка , яке ви бажаєте зв'язати тип с.
Довівши вас так далеко, я збираюся залишити ЯК встановлювати потрібні вам значення як вправу для читача. Возитися з цими речами може бути дещо небезпечно. Ви цілком можете скопіювати файл і не мати жодної роботи ваших асоціацій файлів. Тоді вам доведеться викинути файл і почати спочатку.
Деякі підказки:
- Прочитайте
defaults write
і його синтаксис
- Погляньте
PlistBuddy
. man PlistBuddy
і/usr/libexec/PlistBuddy -h
- Пропустіть усі ці дурниці взагалі і використовуйте RCDefaultApp