Programowo / skryptowo zmieniając domyślne ustawienie Open-With

8

Czy można zmienić programowo program, który otwiera typ pliku / za pomocą skryptu?

Zasadniczo czasami pracuję na stronie internetowej i chcę ustawić wszystkie pliki internetowe, aby otwierały się w edytorze tekstów (* .php, * .html, * .htm itp.).

Jednak innym razem chcę po prostu wyświetlić pliki, więc chcę, aby otworzyły się w przeglądarce.

W tej chwili przeciągam elementy na ikony doków, co działa, ale działa wolno, szczególnie gdy przeglądam dużą liczbę plików tylko za pomocą klawiatury.

Zasadniczo to, czego chcę, to mały skrypt jabłkowy / cokolwiek, co zmienia wszystkie otwarte ustawienia.
W ten sposób mogę mieć jeden skrypt dla każdego otwartego programu i zmieniać go tam iz powrotem.

Dzięki.

Zmyślone imię
źródło

Odpowiedzi:

10

Jest to wykonalne, ale prawdopodobnie nie jest tak proste, jak mogłoby się wydawać. Musisz bardzo dobrze zapoznać się z identyfikatorami typu jednolitego. Zajrzyj na stronę Uniform Type Identifier w Wikipedii .

System OS X przechowuje informacje o preferowanych powiązaniach plików w pliku preferencji o nazwie com.apple.LaunchServices.plist. Zanim zaczniesz szukać i modyfikować ten plik, sugeruję zapoznanie się z hierarchią domen OS X w zakresie ustawień domyślnych (inaczej „ustawienia”). Przyzwoity artykuł na ten temat można znaleźć tutaj . (Uwaga: wydaje się, że coś sprzedają na tej stronie. Nie wiem, co to jest i nie mam z nimi żadnego związku, wyjaśnienie jest po prostu dobre.)

Teraz, gdy wiesz wszystko o ustawieniach domyślnych i interfejsach użytkownika (er, nie o charakterze medycznym), teraz możemy mówić o ustawianiu skojarzeń plików ze skryptu / wiersza poleceń.

Najpierw musisz znać właściwy sposób identyfikowania plików, dla których chcesz utworzyć powiązanie.

Pamiętasz, jak powiedziałem, że ZUM są ważne? Istnieje wiele sposobów identyfikacji pliku. Zależy to od tego, czy typ został formalnie zadeklarowany w systemie, czy nie. Na przykład przyzwoite edytory tekstu, takie jak TextMate lub TextWrangler, dodadzą całkiem sporo deklaracji typów do hierarchii typów, gdy używasz ich w systemie. Jeśli jednak nie masz tych aplikacji, możesz nie zadeklarować tych typów.

OK, wystarczy gadać. Przykłady:

Uzyskaj identyfikator UTI dla pliku:

$ mdls myFile.xml
...
kMDItemContentType             = "public.xml"
kMDItemContentTypeTree         = (
    "public.xml",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)
...

Ok fajnie. Wyraźny typ treści, którego możemy użyć. Zapisz to gdzieś.

$ mdls myFile.myExtn
...
kMDItemContentType             = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree         = (
    "public.data",
    "public.item"
)
...

Ups OS X nie wie o plikach „.myExtn”. Stworzyło to dynamiczny interfejs użytkownika, którego nie możemy wykorzystać do niczego. A typy nadrzędne są zbyt ogólne, aby były przydatne.

Teraz, gdy wiemy, jakie są nasze pliki, spójrzmy na plik LaunchServices.plist i zobaczmy, co możemy zrobić:

$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";
        },
    ...
    );
    ...
}

Tak więc, gdy masz „dobry” typ zawartości do użycia, pierwsza konstrukcja jest lepsza. W przeciwnym razie inny konstrukt. Zauważ, że w tym pliku znajdują się inne konstrukcje, ale nie mają one związku z tym, o co prosiłeś. Tylko wiedz, że są one dostępne, gdy przeglądasz dane wyjściowe.

Jak widać, musisz znaleźć interfejs użytkownika dla aplikacji, której chcesz użyć. Interfejsy użytkownika dla Safar i TextMate znajdują się w moim przykładzie powyżej, ale ogólnie znajdują interfejs użytkownika dla aplikacji:

$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
        <key>CFBundleIdentifier</key>
        <string>com.apple.Safari</string>
...

UWAGA: Nie mam żadnego pojęcia, co stanowi różnicę pomiędzy LSHandlerRoleAll i LSHandlerRoleViewer. Nigdzie nie mogę znaleźć dokumentacji na ten temat. Co mam zrobić, widzę to, że 99% czasu LSHandlerRoleAll jest tylko jeden zestaw (czyli nie ma LSHandlerRoleViewer w ogóle) i że jest ona ustawiona na ZUM do wniosku, że pragnienie skojarzyć typ z.

Zaprowadząc cię tak daleko, opuszczę HOW, aby ustawić wartości, które chcesz, jako ćwiczenie dla czytelnika. Bałagan z tymi rzeczami może być nieco niebezpieczny. Całkowicie możliwe jest zepsucie pliku i brak działania ŻADNEGO powiązania plików. Następnie musisz wyrzucić plik i zacząć od nowa.

Kilka wskazówek:

  • Czytaj dalej defaults writei jego składnia
  • Spójrz na PlistBuddy. man PlistBuddyi/usr/libexec/PlistBuddy -h
  • Pomiń wszystkie te bzdury i użyj RCDefaultApp
dbingham
źródło
Czy skrypt RCDefault jest skryptowalny? Spojrzałem na ich stronę i to nie wygląda tak.
Fałszywe imię
Nieważne, mam deklaracje typów dla wszystkich typów plików, którymi jestem zainteresowany.
Fałszywa nazwa
Świetny opis. Jeśli chodzi o to LSHandlerRoleViewer, zastanawiam się, czy to może być związane z domyślnym przeglądaniem, a nie edytowaniem ( apple.stackexchange.com/a/49998/206073 mnie do tych linii). Nie wiem jednak, w jakich kontekstach można ustalić, czy można otworzyć, czy obejrzeć, czy edytować, jednak ... (nie na temat, CFBundleTypeRolewygląda na to, że akceptuje podobne wartości)
Brett Zamir
Wygląda com.apple.LaunchServices/com.apple.launchservices.secureteż na domenę w późniejszych systemach MacOS ...
Brett Zamir
2

Jedną z opcji jest edycja ~/Library/Preferences/.GlobalPreferences.plist:

defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=com.adobe.pdf;LSHandlerRoleAll=net.sourceforge.skim-app.skim;}'

Możesz użyć PlistBuddy, aby sprawdzić, czy wpisy już istnieją , ale nie znalazłem żadnego sposobu na zastosowanie zmian bez ponownego uruchamiania lub przebudowywania bazy danych Launch Services.

Używając duti , możesz uruchomić duti ~/.dutipo zapisaniu tego jako ~/.duti:

net.sourceforge.skim-app.skim .pdf all
Lri
źródło
1

Naprawdę nie odpowiada na twoje pytanie, ale może być rozwiązaniem.

Inspektor w Finderze prezentuje informacje dla aktualnie wybranego pliku lub plików:

+ +I

Okno Informacje podsumowujące Findera jest przydatne, gdy wybranych jest wiele plików :

^+ +I

Jeśli wybierzesz wiele plików tego samego typu, wówczas dowolna z powyższych metod umożliwi łatwe przełączanie właściwości Otwórz za pomocą: dla tych plików.

Loïc Wolff
źródło
0

Nie odpowiedź na dokładne pytanie, ale inne możliwe rozwiązanie. Możesz otworzyć dokument z określoną aplikacją z wiersza poleceń za pomocą argumentu -a, aby otworzyć.

Na przykład otwórz wszystkie pliki HTML w bieżącym katalogu.

> open -a 'Google Chrome' *.html

Otwórz plik index.html i pliki kontrolera javascript w edytorze tekstu Atom:

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

W zależności od potrzeb możesz zmodyfikować tę funkcję, aby była usługą Automator, której można by przypisać klawisz skrótu, przyjmując jako argument wybrane ścieżki plików.

Oto przykład Automatora AppleScript, który odbiera pliki jako dane wejściowe i otwiera wybrane pliki w 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

koniec biegu

Oczywiście możesz zmienić nazwę aplikacji „Podniosły” edytor tekstu, zapisać ją jako inną usługę i przypisać im oba klawisze skrótów.

Hurston
źródło