10 votes

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

Existe-t-il un moyen de changer l'application qui ouvre un type de fichier de manière programmatique/avec un script ?

En gros, il m'arrive de travailler sur un site web, et je veux faire en sorte que tous les fichiers web s'ouvrent avec un éditeur de texte (*.php, *.html, *.htm, etc...).

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

Pour l'instant, je fais glisser les éléments sur les icônes du dock, ce qui fonctionne, mais est lent, surtout lorsque je passe en revue un grand nombre de fichiers avec le clavier uniquement.

En gros, ce que je veux, c'est un petit applescript/quelque chose qui modifie tous les paramètres d'open-with.
De cette façon, je peux avoir un script pour chaque programme open-with, et faire des allers-retours.

Merci.

13voto

Colas Nahaboo Points 141

C'est faisable, mais ce n'est probablement pas aussi simple que vous le pensez. Vous devrez vous familiariser avec les identificateurs de type uniforme. Consultez le site Wikipedia Identifiant de type uniforme page.

OS X stocke les informations sur les associations de fichiers préférées dans un fichier de préférences portant le nom de com.apple.LaunchServices.plist . Avant d'essayer de trouver et de modifier ce fichier, je vous suggère de vous familiariser avec la hiérarchie des domaines d'OS X pour les valeurs par défaut (alias "paramètres"). Un article décent sur ce sujet peut être trouvé aquí . (Avertissement : il semble qu'ils vendent quelque chose sur ce site. Je ne sais pas ce que c'est et je n'ai aucune association avec eux, l'explication est juste bonne).

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

Tout d'abord, vous devez connaître la bonne façon d'identifier les dossiers pour lesquels vous voulez faire une association.

Tu te souviens que j'ai dit que les infections urinaires étaient importantes ? Il existe plusieurs façons d'identifier un fichier. Cela dépend si le type a été formellement déclaré sur votre système ou non. Par exemple, les éditeurs de texte décents comme TextMate ou TextWrangler ajouteront un certain nombre de déclarations de types à la hiérarchie des 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é. Des exemples :

Obtenir l'UTI d'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-le quelque part.

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

Oups. OS X ne connaît pas les fichiers ".myExtn". Il a donc créé une UTI dynamique que nous ne pouvons utiliser pour rien. Et les types parents sont trop génériques pour être utiles.

Maintenant que nous savons quels sont nos fichiers, examinons 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 préférable. Sinon, l'autre construction. Notez qu'il y a d'autres constructions dans ce fichier, mais elles ne sont pas pertinentes pour votre question. Sachez simplement qu'ils sont là lorsque vous regardez la sortie.

Comme vous pouvez le constater, vous devrez trouver l'UTI correspondant à l'application que vous souhaitez utiliser. Les UTIs pour Safar et TextMate sont dans mon exemple ci-dessus, mais pour trouver de manière générique l'UTI d'une application :

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

NOTE : J'ai pas de idée de ce qui constitue la différence entre LSHandlerRoleAll et LSHandlerRoleViewer. Je ne trouve aucune documentation à ce sujet nulle part. Ce que je do est que, dans 99 % des cas, LSHandlerRoleAll est le seul défini (c'est-à-dire qu'il n'y a pas de LSHandlerRoleViewer du tout) et qu'il est défini sur l'UTI de l'application à laquelle vous souhaitez associer le type.

Après vous avoir amené jusqu'ici, je vais laisser au lecteur le soin de se demander COMMENT définir les valeurs que vous souhaitez. Jouer avec ces choses peut être quelque peu dangereux. Il est tout à fait possible de bousiller un fichier et qu'AUCUNE de vos associations de fichiers ne fonctionne. Vous devrez alors jeter le fichier et recommencer.

Quelques conseils :

  • Lire la suite defaults write et sa syntaxe
  • Jetez un coup d'œil à PlistBuddy . man PlistBuddy y /usr/libexec/PlistBuddy -h
  • Laissez tomber toutes ces bêtises et utilisez RCDefaultApp

6voto

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 les entrées existent déjà mais je n'ai trouvé aucun moyen d'appliquer les modifications sans redémarrer ou reconstruire la base de données des services de lancement.

Utilisation de duti vous pourriez exécuter duti ~/.duti après l'avoir enregistré comme ~/.duti :

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

1voto

Loïc Wolff Points 14389

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

En Inspecteur dans le Finder présente des informations pour le actuellement sélectionné fichier, ou fichiers :

+ + I

En Informations sommaires du Finder est utile lorsque plusieurs fichiers sont sélectionnés :

^ + + I

Si vous sélectionnez plusieurs fichiers du même type, l'une ou l'autre des méthodes ci-dessus vous permettra de changer facilement de type de fichier. Ouvrir avec : pour ces fichiers.

1voto

Ce n'est 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 pour ouvrir.

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

> open -a 'Google Chrome' *.html

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

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

En fonction de vos besoins, vous pourriez modifier ce service pour en faire un service Automator auquel on pourrait attribuer une touche de raccourci, en prenant comme argument les chemins d'accès aux fichiers sélectionnés.

Voici un exemple d'AppleScript Automator 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

fin de course

Évidemment, vous pourriez changer le nom de l'application "Sublime" éditeur de texte, l'enregistrer comme un autre service, et leur attribuer les deux touches de raccourci.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X