Програмно / сценарійно-атично змінюючи налаштування Open-With за замовчуванням


8

Чи є спосіб змінити те, що додаток відкриває тип файлу програмно / зі скриптом?

В основному іноді я працюю на веб-сайті, і я хочу встановити, щоб усі веб-файли відкривалися за допомогою текстового редактора (* .php, * .html, * .htm тощо).

Однак в інший час я хочу просто переглянути файли, тому я хочу, щоб вони відкривалися за допомогою браузера.

Зараз я перетягую елементи на піктограму дока, що працює, але повільно, особливо коли я переглядаю велику кількість файлів лише за допомогою клавіатури.

В основному, я хочу невеликий яблучний сценарій / все, що змінює всі налаштування відкритого типу.
Таким чином, я можу мати один сценарій для кожної програми, що відкривається, і змінювати туди і назад.

Дякую.

Відповіді:


10

Це можливо, але, ймовірно, не так просто, як можна подумати. Вам потрібно буде ознайомитись з Уніфікованими ідентифікаторами типу. Подивіться на сторінку Уніфікованого ідентифікатора типу 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

Чи сценарій написання сценарію 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

1

Це насправді не відповідає на ваше запитання, але може бути рішенням.

Інспектор в Finder являє інформацію для вибраного файлу або файлів:

+ +I

Вікно " Зведена інформація " Finder корисно, якщо вибрано кілька файлів :

^+ +I

Якщо ви вибрали кілька файлів одного типу, то будь-який із способів, наведених вище, дозволить вам легко перемикати властивість Open з: для цих файлів.


0

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

Наприклад, відкрийте всі HTML-файли в поточному каталозі.

> open -a 'Google Chrome' *.html

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

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

Залежно від ваших потреб, ви можете змінити це службою Автоматизатора, якій можна призначити клавішу швидкого доступу, взявши в якості аргументу вибрані шляхи до файлу.

Ось приклад 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

кінцевий пробіг

Очевидно, ви можете змінити назву програми "Піднесене" текстовий редактор, зберегти його як іншу службу та призначити їм обидві клавіші швидкого доступу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.