Modification par programmation / script du paramètre Open-With par défaut

8

Existe-t-il un moyen de modifier l'application qui ouvre un type de fichier par programme / avec un script?

Fondamentalement, je travaille parfois sur un site Web et je souhaite configurer tous les fichiers Web pour qu'ils s'ouvrent avec un éditeur de texte (* .php, * .html, * .htm, etc ...).

Cependant, d'autres fois, je veux simplement afficher les fichiers, donc je veux qu'ils s'ouvrent avec un navigateur.

En ce moment, je fais glisser des éléments sur les icônes du dock, ce qui fonctionne, mais est lent, en particulier lorsque je parcours un grand nombre de fichiers avec le clavier uniquement.

Fondamentalement, ce que je veux, c'est un petit applescript / quoi que ce soit qui change tous les paramètres open-with.
De cette façon, je peux avoir un script pour chaque programme open-with, et changer d'avant en arrière.

Merci.

Faux nom
la source

Réponses:

10

C'est faisable, mais ce n'est probablement pas aussi simple qu'on pourrait le penser. Vous devrez vous familiariser avec les identificateurs de type uniforme. Regardez la page Uniform Type Identifier de Wikipedia .

OS X stocke des informations sur les associations de fichiers préférées dans un fichier de préférences portant le nom com.apple.LaunchServices.plist. Avant d'aller chercher et de modifier ce fichier, je vous suggère de vous familiariser avec la hiérarchie de domaine d'OS X pour les valeurs par défaut (alias «paramètres»). Un article décent à ce sujet peut être trouvé ici . (Avertissement: ils semblent vendre quelque chose sur ce site. Je ne sais pas ce que c'est et je n'ai aucun lien avec eux, l'explication est juste bonne.)

Maintenant que vous savez tout sur les valeurs par défaut et les UTI (euh, pas le type médical), nous pouvons maintenant parler de la définition des associations de fichiers à partir d'un script / d'une ligne de commande.

Tout d'abord, vous devez connaître la bonne façon d'identifier les fichiers pour lesquels vous souhaitez créer une association.

Rappelez-vous comment j'ai dit que les IVU étaient importantes? Il existe plusieurs façons d'identifier un fichier. Cela dépend si le type a été officiellement déclaré sur votre système ou non. Par exemple, des éditeurs de texte décents comme TextMate ou TextWrangler ajouteront pas mal de déclarations de type à la hiérarchie de types lorsque vous les utiliserez sur votre système. Cependant, si vous ne disposez pas de ces applications, il se peut que ces types ne soient pas déclarés.

OK, assez parlé. Exemples:

Obtenez l'UTI pour un fichier:

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

OK cool. Un type de contenu explicite que nous pouvons utiliser. Notez cela quelque part.

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

Oops. OS X ne connaît pas les fichiers ".myExtn". Ainsi, il a créé une interface utilisateur dynamique que nous ne pouvons utiliser pour rien. Et les types parents sont trop génériques pour être utiles.

Maintenant que nous savons ce que sont nos fichiers, regardons le fichier LaunchServices.plist et voyons ce que nous pouvons faire:

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

Ainsi, lorsque vous avez un "bon" type de contenu à utiliser, la première construction est meilleure. Sinon, l'autre construction. Remarque, il existe d'autres constructions dans ce fichier, mais elles ne sont pas pertinentes pour ce que vous avez demandé. Sachez simplement qu'ils sont là lorsque vous regardez à travers la sortie.

Comme vous pouvez le voir, vous devrez trouver l'UTI de l'application que vous souhaitez utiliser. Les UTI pour Safar et TextMate sont dans mon exemple ci-dessus, mais pour trouver génériquement l'UTI pour une application:

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

REMARQUE: je n'ai aucune idée de ce qui constitue la différence entre LSHandlerRoleAll et LSHandlerRoleViewer. Je ne trouve aucune documentation là-dessus. Ce que je fais voir est que 99% du temps LSHandlerRoleAll est le seul jeu (il n'y a pas du tout LSHandlerRoleViewer) et qu'il est réglé sur l'UTI pour l'application que vous désirez associer le type avec.

Après vous avoir amené jusqu'ici, je vais laisser COMMENT définir les valeurs que vous voulez comme exercice pour le lecteur. Jouer avec ces choses peut être quelque peu dangereux. Il vous est tout à fait possible de bousiller un fichier et de ne faire fonctionner AUCUNE de vos associations de fichiers. Ensuite, vous devez jeter le fichier et recommencer.

Quelques conseils:

  • Lisez la suite defaults writeet sa syntaxe
  • Jetez un oeil à PlistBuddy. man PlistBuddyet/usr/libexec/PlistBuddy -h
  • Ignorez toutes ces absurdités et utilisez RCDefaultApp
dbingham
la source
RCDefault est-il scriptable? J'ai regardé leur site et ça ne leur ressemble pas.
Fake Name
Peu importe, j'ai des déclarations de type pour tous les types de fichiers qui m'intéressent.
Fake Name
Grande rédaction. En ce qui concerne LSHandlerRoleViewer, je me demande si cela peut être lié à la valeur par défaut pour l'affichage plutôt que pour l'édition ( apple.stackexchange.com/a/49998/206073 m'a mis sur ces lignes). Cependant, je ne sais pas dans quels contextes on peut déterminer si l'on ouvre pour la visualisation ou l'édition ... (hors sujet, CFBundleTypeRoleon dirait qu'il accepte des valeurs similaires)
Brett Zamir
En outre, il semble com.apple.LaunchServices/com.apple.launchservices.secureque ce soit le domaine des systèmes MacOS ultérieurs ...
Brett Zamir
2

Une option consiste à modifier ~/Library/Preferences/.GlobalPreferences.plist:

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

Vous pouvez utiliser PlistBuddy pour vérifier si des entrées existent déjà , mais je n'ai trouvé aucun moyen d'appliquer des modifications sans redémarrer ou reconstruire la base de données Launch Services.

En utilisant duti , vous pouvez exécuter duti ~/.dutiaprès avoir enregistré ceci sous ~/.duti:

net.sourceforge.skim-app.skim .pdf all
Lri
la source
1

Cela ne répond pas vraiment à votre question, mais pourrait être une solution.

L' inspecteur du Finder présente des informations sur le ou les fichiers actuellement sélectionnés :

+ +I

La fenêtre Informations récapitulatives du Finder est utile lorsque plusieurs fichiers sont sélectionnés:

^+ +I

Si vous sélectionnez plusieurs fichiers du même type, l'une des méthodes ci-dessus vous permettra de basculer facilement la propriété Ouvrir avec: pour ces fichiers.

Loïc Wolff
la source
0

Pas une réponse à votre question exacte, mais une autre solution possible. Vous pouvez ouvrir un document avec une application spécifique à partir de la ligne de commande avec l'argument -a à ouvrir.

Par exemple, ouvrez tous les fichiers html dans le répertoire en cours.

> open -a 'Google Chrome' *.html

Ouvrez index.html et les fichiers du contrôleur javascript dans l'éditeur de texte Atom:

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

En fonction de vos besoins, vous pouvez le modifier pour qu'il s'agisse d'un service Automator auquel une touche de raccourci peut être affectée, en prenant comme argument les chemins de fichier sélectionnés.

Voici un exemple d'Automator AppleScript qui reçoit des fichiers en entrée et ouvre les fichiers sélectionnés dans 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

moyen détourné

De toute évidence, vous pouvez modifier le nom de l'application "Sublime" éditeur de texte, l'enregistrer en tant que autre service et leur affecter les deux touches de raccourci.

Hurston
la source