Programmgesteuert / Skriptgesteuertes Ändern der Standardeinstellung "Öffnen mit"


8

Gibt es eine Möglichkeit zu ändern, welche App einen Dateityp programmgesteuert / mit einem Skript öffnet?

Grundsätzlich arbeite ich manchmal an einer Website und möchte festlegen, dass alle Webdateien mit einem Texteditor (* .php, * .html, * .htm usw.) geöffnet werden.

In anderen Fällen möchte ich jedoch nur die Dateien anzeigen, sodass sie mit einem Browser geöffnet werden sollen.

Im Moment ziehe ich Elemente auf Dock-Symbole, was funktioniert, aber langsam ist, insbesondere wenn ich eine große Anzahl von Dateien nur mit der Tastatur durchsuche.

Grundsätzlich möchte ich ein kleines Applescript / was auch immer, das alle Open-With-Einstellungen ändert.
Auf diese Weise kann ich ein Skript für jedes Open-With-Programm haben und hin und her wechseln.

Vielen Dank.

Antworten:


10

Dies ist machbar, aber wahrscheinlich nicht so einfach, wie Sie vielleicht denken. Sie müssen sich mit Uniform Type Identifiers vertraut machen. Schauen Sie sich die Wikipedia Uniform Type Identifier- Seite an.

OS X speichert Informationen zu bevorzugten Dateizuordnungen in einer Voreinstellungsdatei mit dem Namen com.apple.LaunchServices.plist. Bevor Sie versuchen, diese Datei zu finden und zu ändern, sollten Sie sich mit der Domänenhierarchie von OS X für Standardeinstellungen (auch als "Einstellungen" bezeichnet) vertraut machen. Einen anständigen Artikel dazu finden Sie hier . (Haftungsausschluss: Sie scheinen etwas auf dieser Website zu verkaufen. Ich weiß nicht, was es ist und habe keine Verbindung zu ihnen, die Erklärung ist nur eine gute.)

Jetzt, da Sie alles über Standardeinstellungen und UTIs wissen (ähm, nicht die medizinische Art), können wir jetzt über das Festlegen von Dateizuordnungen über eine Skript- / Befehlszeile sprechen.

Zunächst müssen Sie wissen, wie Sie die Dateien identifizieren können, für die Sie eine Zuordnung vornehmen möchten.

Erinnern Sie sich, wie ich sagte, dass Harnwegsinfekte wichtig waren? Es gibt mehrere Möglichkeiten, eine Datei zu identifizieren. Dies hängt davon ab, ob der Typ auf Ihrem System offiziell deklariert wurde oder nicht. Beispielsweise fügen anständige Texteditoren wie TextMate oder TextWrangler der Typhierarchie einige Typdeklarationen hinzu, wenn Sie sie auf Ihrem System verwenden. Wenn Sie diese Anwendungen jedoch nicht haben, sind diese Typen möglicherweise nicht deklariert.

OK, genug geredet. Beispiele:

Holen Sie sich die UTI für eine Datei:

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

OK Cool. Ein expliziter Inhaltstyp, den wir verwenden können. Schreiben Sie das irgendwo auf.

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

Hoppla. OS X kennt ".myExtn" -Dateien nicht. Es wurde also eine dynamische UTI erstellt, die wir für nichts verwenden können. Und die übergeordneten Typen sind zu allgemein, um nützlich zu sein.

Nachdem wir nun wissen, was unsere Dateien sind, schauen wir uns die Datei LaunchServices.plist an und sehen, was wir tun können:

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

Wenn Sie also einen "guten" Inhaltstyp verwenden möchten, ist das erste Konstrukt besser. Ansonsten das andere Konstrukt. Beachten Sie, dass diese Datei andere Konstrukte enthält, die jedoch für Ihre Fragen nicht relevant sind. Sie müssen nur wissen, dass sie vorhanden sind, wenn Sie die Ausgabe durchsehen.

Wie Sie sehen, müssen Sie die UTI für die Anwendung finden, die Sie verwenden möchten. Die UTIs für Safar und TextMate befinden sich in meinem obigen Beispiel, aber um die UTI für eine Anwendung generisch zu finden:

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

HINWEIS: Ich habe keine Ahnung, was den Unterschied zwischen LSHandlerRoleAll und LSHandlerRoleViewer ausmacht. Ich kann nirgendwo eine Dokumentation dazu finden. Was ich tun sehe ist , dass 99% der Zeit LSHandlerRoleAll ist der einzige Satz (dh es gibt keine LSHandlerRoleViewer überhaupt) , und dass es für die Anwendung der UTI festgelegt , dass Sie den Typ mit verbinden wollen.

Nachdem ich Sie so weit gebracht habe, werde ich WIE verlassen, um die gewünschten Werte als Übung für den Leser festzulegen. Das Herumspielen mit diesen Dingen kann etwas gefährlich sein. Es ist durchaus möglich, dass Sie eine Datei vermasseln und keine Ihrer Dateizuordnungen funktionieren. Dann müssen Sie die Datei wegwerfen und von vorne beginnen.

Einige Hinweise:

  • Lesen Sie weiter defaults writeund seine Syntax
  • Schau es dir an PlistBuddy. man PlistBuddyund/usr/libexec/PlistBuddy -h
  • Überspringen Sie diesen ganzen Unsinn und verwenden Sie RCDefaultApp

Ist RCDefault skriptfähig? Ich habe mir ihre Seite angesehen und es sieht nicht so aus.
Gefälschter Name

Trotzdem habe ich Typdeklarationen für alle Dateitypen, die mich interessieren.
Gefälschter Name

Tolles Schreiben. Soweit LSHandlerRoleViewerich mich frage, ob es sich möglicherweise um die Standardeinstellung für die Anzeige im Gegensatz zur Bearbeitung handelt ( apple.stackexchange.com/a/49998/206073 hat mich in diese Zeilen gebracht). Ich weiß jedoch nicht, in welchen Kontexten man bestimmen kann, ob man zum Anzeigen oder Bearbeiten öffnet ... (Off-Topic, CFBundleTypeRolesieht so aus, als würde es ähnliche Werte akzeptieren)
Brett Zamir

Es scheint com.apple.LaunchServices/com.apple.launchservices.secureauch die Domäne in späteren MacOS-Systemen zu sein ...
Brett Zamir

2

Eine Option ist zu bearbeiten ~/Library/Preferences/.GlobalPreferences.plist:

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

Sie können PlistBuddy verwenden, um zu überprüfen, ob bereits Einträge vorhanden sind. Ich habe jedoch keine Möglichkeit gefunden, Änderungen zu übernehmen, ohne die Launch Services-Datenbank neu zu starten oder neu zu erstellen .

Mit duti können Sie duti ~/.dutinach dem Speichern Folgendes ausführen ~/.duti:

net.sourceforge.skim-app.skim .pdf all

1

Es beantwortet Ihre Frage nicht wirklich, könnte aber eine Lösung sein.

Der Inspektor im Finder zeigt Informationen für die aktuell ausgewählte Datei oder Dateien an:

+ +I

Das Fenster " Zusammenfassungsinformationen" des Finders ist nützlich, wenn mehrere Dateien ausgewählt sind:

^+ +I

Wenn Sie mehrere Dateien desselben Typs auswählen, können Sie mit beiden oben genannten Methoden die Eigenschaft Öffnen mit: für diese Dateien problemlos ändern .


0

Keine Antwort auf Ihre genaue Frage, sondern eine andere mögliche Lösung. Sie können ein Dokument mit einer bestimmten Anwendung über die Befehlszeile mit dem zu öffnenden Argument -a öffnen.

Öffnen Sie beispielsweise alle HTML-Dateien im aktuellen Verzeichnis.

> open -a 'Google Chrome' *.html

Öffnen Sie index.html und die Javascript-Controller-Dateien im Atom-Texteditor:

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

Abhängig von Ihren Anforderungen können Sie dies als Automator-Dienst ändern, dem eine Tastenkombination zugewiesen werden kann, wobei die ausgewählten Dateipfade als Argument verwendet werden.

Hier ist ein Beispiel für Automator AppleScript, das Dateien als Eingabe empfängt und die ausgewählten Dateien in Chrome öffnet:

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

Lauf beenden

Natürlich können Sie den App-Namen "Sublime" als Texteditor ändern, als anderen Dienst speichern und beide Tastenkombinationen zuweisen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.