Esto es factible, pero probablemente no sea tan sencillo como podría pensar. Deberá familiarizarse con los identificadores de tipo uniforme. Mire la página de Identificador de tipo uniforme de Wikipedia .
OS X almacena información sobre asociaciones de archivos preferidos en un archivo de preferencias con el nombre com.apple.LaunchServices.plist
. Antes de ir a buscar y modificar ese archivo, le sugiero que se familiarice con la jerarquía de dominio de OS X para los valores predeterminados (también conocido como "configuración"). Un artículo decente sobre esto se puede encontrar aquí . (Descargo de responsabilidad: parecen estar vendiendo algo en ese sitio. No sé qué es y no tengo ninguna asociación con ellos, la explicación es buena).
Ahora que sabe todo sobre los valores predeterminados y las infecciones urinarias (er, no del tipo médico), ahora podemos hablar sobre la configuración de asociaciones de archivos desde una secuencia de comandos / línea de comando.
Primero, necesitará saber la forma correcta de identificar los archivos para los que desea hacer una asociación.
¿Recuerdas cómo dije que las infecciones urinarias eran importantes? Hay varias formas de identificar un archivo. Depende de si el tipo se ha declarado formalmente en su sistema o no. Por ejemplo, los editores de texto decentes como TextMate o TextWrangler agregarán bastantes declaraciones de tipos a la jerarquía de tipos cuando los use en su sistema. Sin embargo, si no tiene esas aplicaciones, es posible que no tenga esos tipos declarados.
OK, suficiente charla. Ejemplos:
Obtenga la UTI para un archivo:
$ mdls myFile.xml
...
kMDItemContentType = "public.xml"
kMDItemContentTypeTree = (
"public.xml",
"public.text",
"public.data",
"public.item",
"public.content"
)
...
Está bien. Un tipo de contenido explícito que podemos usar. Escribe eso en alguna parte.
$ mdls myFile.myExtn
...
kMDItemContentType = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree = (
"public.data",
"public.item"
)
...
Ups OS X no sabe acerca de los archivos ".myExtn". Entonces, creó una UTI dinámica que no podemos usar para nada. Y los tipos principales son demasiado genéricos para ser útiles.
Ahora que sabemos cuáles son nuestros archivos, veamos el archivo LaunchServices.plist y veamos qué podemos hacer:
$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";
},
...
);
...
}
Entonces, cuando tiene un tipo de contenido "bueno" para usar, la primera construcción es mejor. De lo contrario, la otra construcción. Tenga en cuenta que hay otras construcciones en ese archivo, pero no son relevantes para lo que solicitó. Solo sé que están allí cuando miras a través de la salida.
Como puede ver, necesitará encontrar la UTI para la aplicación que desea usar. Las UTI para Safar y TextMate están en mi ejemplo anterior, pero para encontrar genéricamente la UTI para una aplicación:
$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
<key>CFBundleIdentifier</key>
<string>com.apple.Safari</string>
...
NOTA: No tengo ninguna idea de lo que constituye la diferencia entre LSHandlerRoleAll y LSHandlerRoleViewer. No puedo encontrar documentación sobre eso en ningún lado. Lo que sí veo es que el 99% del tiempo LSHandlerRoleAll es el único conjunto (es decir, no hay ningún LSHandlerRoleViewer) y que está configurado en la UTI para la aplicación con la que desea asociar el tipo.
Después de haberlo traído hasta aquí, voy a dejar CÓMO establecer los valores que desea como ejercicio para el lector. Jugar con estas cosas puede ser algo peligroso. Es completamente posible que arruines un archivo y no hagas funcionar NINGUNA de tus asociaciones de archivos. Luego tienes que tirar el archivo y comenzar de nuevo.
Algunos consejos:
- Siga leyendo
defaults write
y su sintaxis
- Echa un vistazo a
PlistBuddy
. man PlistBuddy
y/usr/libexec/PlistBuddy -h
- Omita todas estas tonterías por completo y use RCDefaultApp