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 write
et sa syntaxe
- Jetez un oeil à
PlistBuddy
. man PlistBuddy
et/usr/libexec/PlistBuddy -h
- Ignorez toutes ces absurdités et utilisez RCDefaultApp