Programmgesteuertes/skriptgesteuertes Ändern der Standardeinstellung „Öffnen mit“.

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 alle Webdateien so einstellen, dass sie mit einem Texteditor geöffnet werden (*.php, *.html, *.htm usw.).

Manchmal möchte ich die Dateien jedoch nur anzeigen, also möchte ich, dass sie mit einem Browser geöffnet werden.

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 durchgehe.

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

Vielen Dank.

Antworten (4)

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

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

Nachdem Sie nun alles über Standardeinstellungen und UTIs (ähm, nicht die medizinischen) wissen, können wir jetzt über das Festlegen von Dateizuordnungen über ein Skript/eine Befehlszeile sprechen.

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

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

Okay, 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. Schreib das irgendwo auf.

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

Hoppla. OS X kennt keine ".myExtn"-Dateien. Es wurde also eine dynamische UTI erstellt, die wir für nichts verwenden können. Und die übergeordneten Typen sind zu generisch, 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 Frage nicht relevant sind. Sie müssen nur wissen, dass sie da sind, wenn Sie die Ausgabe durchsehen.

Wie Sie sehen können, müssen Sie die UTI für die Anwendung finden, die Sie verwenden möchten. Die UTIs für Safar und TextMate sind in meinem Beispiel oben, aber um die UTI für eine Anwendung allgemein 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 nirgends eine Dokumentation darüber finden. Was ich sehe , ist, dass LSHandlerRoleAll in 99 % der Fälle das einzige Set ist (dh es gibt überhaupt kein LSHandlerRoleViewer) und dass es auf die UTI für die Anwendung festgelegt ist, der Sie den Typ zuordnen möchten.

Nachdem Sie so weit gekommen sind, überlasse ich es dem Leser als Übung, WIE Sie die gewünschten Werte festlegen. Mit diesen Dingen herumzuspielen kann etwas gefährlich sein. Es ist durchaus möglich, dass Sie eine Datei vermasseln und KEINE Ihrer Dateizuordnungen funktioniert. Dann müssen Sie die Datei wegwerfen und von vorne beginnen.

Einige Hinweise:

  • Lesen Sie weiter defaults writeund seine Syntax
  • Schauen Sie sich 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 Website angesehen, und es sieht nicht so aus.
Macht nichts, ich habe Typdeklarationen für alle Dateitypen, an denen ich interessiert bin.
Tolle Aufschrift. Soweit LSHandlerRoleViewerfrage ich mich, ob es sich möglicherweise darauf bezieht, die Standardeinstellung für die Anzeige im Gegensatz zur Bearbeitung zu sein ( apple.stackexchange.com/a/49998/206073 hat mich auf diese Zeilen gebracht). Ich weiß jedoch nicht, in welchen Kontexten man feststellen kann, ob man zum Anzeigen oder Bearbeiten öffnet, aber ... (off-topic, CFBundleTypeRolesieht so aus, als würde es ähnliche Werte akzeptieren)
Außerdem scheint com.apple.LaunchServices/com.apple.launchservices.securees die Domäne in späteren MacOS-Systemen zu sein ...

Eine Möglichkeit 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, aber ich habe keine Möglichkeit gefunden, Änderungen anzuwenden, ohne die Launch Services-Datenbank neu zu starten oder neu zu erstellen.

Mit duti könnten Sie duti ~/.dutinach dem Speichern dies ausführen als ~/.duti:

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

Das beantwortet deine Frage nicht wirklich, könnte aber eine Lösung sein.

Der Inspektor im Finder zeigt Informationen für die aktuell ausgewählte (n) Datei(en) an:

+ +I

Das Übersichtsinfo- Fenster von Finder 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 einfach wechseln.

Keine Antwort auf Ihre genaue Frage, aber eine andere mögliche Lösung. Sie können ein Dokument mit einer bestimmten Anwendung von der Befehlszeile aus mit dem Argument -a zum Öffnen ö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 in einen Automator-Dienst ändern, dem eine Tastenkombination zugewiesen werden kann, wobei die ausgewählten Dateipfade als Argument übernommen werden.

Hier ist ein Beispiel für ein 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

Endlauf

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