Это выполнимо, но, вероятно, не так просто, как вы думаете. Вам нужно будет очень хорошо ознакомиться с унифицированными идентификаторами типов. Посмотрите на страницу Универсального идентификатора типа в Википедии .
OS X хранит информацию о предпочтительных ассоциациях файлов в файле настроек с именем com.apple.LaunchServices.plist
. Прежде чем вы попытаетесь найти и изменить этот файл, я предлагаю вам ознакомиться с иерархией доменов OS X для значений по умолчанию (так называемые «настройки»). Достойную статью об этом можно найти здесь . (Отказ от ответственности: они, кажется, что-то продают на этом сайте. Я не знаю, что это такое, и не имею к ним никакого отношения, объяснение просто хорошее.)
Теперь, когда вы знаете все о значениях по умолчанию и UTI (а не о медицинском виде), теперь мы можем поговорить о настройке ассоциаций файлов из сценария / командной строки.
Во-первых, вам нужно знать, как правильно определить файлы, для которых вы хотите создать ассоциацию.
Помните, как я сказал, что ИМП были важны? Есть несколько способов идентифицировать файл. Это зависит от того, был ли тип официально объявлен в вашей системе или нет. Например, приличные текстовые редакторы, такие как 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
LSHandlerRoleViewer
мне интересно, может ли это относиться к тому, чтобы быть просмотром по умолчанию, а не редактировать ( apple.stackexchange.com/a/49998/206073 получил меня в эти строки). Однако я не знаю, в каком контексте можно определить, открывается ли кто-либо для просмотра или редактирования ... (не по теме,CFBundleTypeRole
похоже, он принимает аналогичные значения)com.apple.LaunchServices/com.apple.launchservices.secure
может быть доменом в более поздних системах MacOS ...Одним из вариантов является редактирование
~/Library/Preferences/.GlobalPreferences.plist
:defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=com.adobe.pdf;LSHandlerRoleAll=net.sourceforge.skim-app.skim;}'
Вы можете использовать PlistBuddy, чтобы проверить, существуют ли уже записи , но я не нашел способа применить изменения без перезапуска или перестройки базы данных Launch Services.
Используя duti , вы можете запустить
duti ~/.duti
после сохранения это как~/.duti
:источник
Это на самом деле не отвечает на ваш вопрос, но может быть решением.
Инспектор в Finder представляет информацию для выбранного файла или файлов:
⌘+ ⌥+I
Окно сводной информации Finder полезно, когда выбрано несколько файлов :
^+ ⌘+I
Если вы выберете несколько файлов одного типа, то любой из приведенных выше методов позволит вам легко переключать свойство Open with: для этих файлов.
источник
Не ответ на ваш точный вопрос, но другое возможное решение. Вы можете открыть документ с определенным приложением из командной строки с аргументом -a для открытия.
Например, откройте все HTML-файлы в текущем каталоге.
Откройте файл index.html и файлы контроллера javascript в текстовом редакторе Atom:
В зависимости от ваших потребностей, вы можете изменить это на службу Automator, которой можно назначить сочетание клавиш, используя выбранные пути к файлам в качестве аргумента.
Вот пример Automator AppleScript, который получает файлы в качестве входных данных и открывает выбранные файлы в Chrome:
конец бега
Очевидно, что вы можете изменить имя приложения «Sublime» в текстовом редакторе, сохранить его как другой сервис и назначить им обе комбинации клавиш.
источник