Программно / Сценарий - изменение настройки Open-With по умолчанию

8

Есть ли способ изменить, какое приложение открывает тип файла программно / с помощью скрипта?

Обычно я работаю над веб-сайтом и хочу, чтобы все веб-файлы открывались в текстовом редакторе (* .php, * .html, * .htm и т. Д.).

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

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

По сути, я хочу небольшой яблочный скрипт / что угодно, что меняет все настройки open-with.
Таким образом, у меня может быть один скрипт для каждой открытой программы, и я могу менять туда и обратно.

Спасибо.

Поддельное имя
источник

Ответы:

10

Это выполнимо, но, вероятно, не так просто, как вы думаете. Вам нужно будет очень хорошо ознакомиться с унифицированными идентификаторами типов. Посмотрите на страницу Универсального идентификатора типа в Википедии .

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
dbingham
источник
Является ли RCDefault скриптовым? Я просмотрел их сайт, и это не похоже на это.
Фальшивое имя
Неважно, у меня есть объявления типов для всех типов файлов, которые меня интересуют.
Поддельное имя
Отличная рецензия. Насколько LSHandlerRoleViewerмне интересно, может ли это относиться к тому, чтобы быть просмотром по умолчанию, а не редактировать ( apple.stackexchange.com/a/49998/206073 получил меня в эти строки). Однако я не знаю, в каком контексте можно определить, открывается ли кто-либо для просмотра или редактирования ... (не по теме, CFBundleTypeRoleпохоже, он принимает аналогичные значения)
Бретт Замир,
Кроме того, кажется, что это com.apple.LaunchServices/com.apple.launchservices.secureможет быть доменом в более поздних системах MacOS ...
Бретт Замир
2

Одним из вариантов является редактирование ~/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:

net.sourceforge.skim-app.skim .pdf all
LRI
источник
1

Это на самом деле не отвечает на ваш вопрос, но может быть решением.

Инспектор в Finder представляет информацию для выбранного файла или файлов:

+ +I

Окно сводной информации Finder полезно, когда выбрано несколько файлов :

^+ +I

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

Лоик Вольф
источник
0

Не ответ на ваш точный вопрос, но другое возможное решение. Вы можете открыть документ с определенным приложением из командной строки с аргументом -a для открытия.

Например, откройте все HTML-файлы в текущем каталоге.

> open -a 'Google Chrome' *.html

Откройте файл index.html и файлы контроллера javascript в текстовом редакторе Atom:

> open -a 'atom' index.html js/controllers/*.js

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

Вот пример Automator AppleScript, который получает файлы в качестве входных данных и открывает выбранные файлы в Chrome:

on run {input, parameters}
set openFiles to "open -a 'Google Chrome' " --note the trailing space
set filePaths to {}

--covert the filePaths to posix style
repeat with i from 1 to count of input
    set aFile to input's item i as alias
    set aFile to quoted form of POSIX path of aFile
    set filePaths's end to aFile
end repeat

--convert filePaths list to a string delimited by spaces
set tid to text item delimiters
set text item delimiters to " "
set filePaths to filePaths as text
set text item delimiters to tid

--Open files via commandline
do shell script openFiles & filePaths
return input

конец бега

Очевидно, что вы можете изменить имя приложения «Sublime» в текстовом редакторе, сохранить его как другой сервис и назначить им обе комбинации клавиш.

Hurston
источник