Cambio programático/secuencia de comandos de la configuración predeterminada Abrir con

¿Hay alguna manera de cambiar qué aplicación abre un tipo de archivo mediante programación/con un script?

Básicamente, a veces estoy trabajando en un sitio web y quiero configurar todos los archivos web para que se abran con un editor de texto (*.php, *.html, *.htm, etc.).

Sin embargo, otras veces, solo quiero ver los archivos, así que quiero que se abran con un navegador.

En este momento, estoy arrastrando elementos a los íconos del Dock, lo que funciona, pero es lento, particularmente cuando estoy revisando una gran cantidad de archivos solo con el teclado.

Básicamente, lo que quiero es un pequeño applescript/lo que sea que cambie todas las configuraciones abiertas.
De esa manera, puedo tener una secuencia de comandos para cada programa abierto y cambiar de un lado a otro.

Gracias.

Respuestas (4)

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 Identificador de tipo uniforme de Wikipedia .

OS X almacena información sobre las asociaciones de archivos preferidas en un archivo de preferencias con el nombre com.apple.LaunchServices.plist. Antes de intentar encontrar 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: parece que están vendiendo algo en ese sitio. No sé qué es y no tengo asociación con ellos, la explicación es simplemente buena).

Ahora que sabe todo sobre los valores predeterminados y las UTI (no del tipo médico), ahora podemos hablar sobre la configuración de asociaciones de archivos desde una secuencia de comandos/línea de comandos.

En primer lugar, deberá conocer la forma correcta de identificar los archivos para los que desea realizar una asociación.

¿Recuerdas que 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.

Bien, 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. Escríbelo en alguna parte.

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

Ups. OS X no conoce 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 preguntó. Solo sepa que están allí cuando mira a través de la salida.

Como puede ver, deberá 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 idea de cuál es la diferencia entre LSHandlerRoleAll y LSHandlerRoleViewer. No puedo encontrar documentación sobre eso en ninguna parte. Lo que veo es que el 99% de las veces LSHandlerRoleAll es el único conjunto (es decir, no hay LSHandlerRoleViewer en absoluto) y que está configurado en la UTI para la aplicación con la que desea asociar el tipo.

Habiéndolo 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 que NINGUNA de tus asociaciones de archivos funcione. Entonces tienes que tirar el archivo y empezar de nuevo.

Algunos consejos:

  • Sigue leyendo defaults writey su sintaxis
  • PlistBuddyEcha un vistazo a man PlistBuddyy/usr/libexec/PlistBuddy -h
  • Omita todas estas tonterías por completo y use RCDefaultApp
¿Es RCDefault programable? Revisé su sitio y no lo parece.
No importa, tengo declaraciones de tipos para todos los tipos de archivos que me interesan.
Gran redacción. En cuanto a LSHandlerRoleViewer, me pregunto si puede estar relacionado con ser el predeterminado para ver en lugar de editar ( apple.stackexchange.com/a/49998/206073 me puso en esas líneas). Sin embargo, no sé en qué contextos se puede determinar si uno está abriendo para ver o editar, sin embargo... (fuera de tema, CFBundleTypeRoleparece que acepta valores similares)
Además, parece que com.apple.LaunchServices/com.apple.launchservices.securepuede ser el dominio en sistemas MacOS posteriores...

Una opción es editar ~/Library/Preferences/.GlobalPreferences.plist:

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

Puede usar PlistBuddy para verificar si ya existen entradas , pero no he encontrado ninguna forma de aplicar cambios sin reiniciar o reconstruir la base de datos de Launch Services.

Usando duti , puede ejecutar duti ~/.dutidespués de guardar esto como ~/.duti:

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

Realmente no responde a su pregunta, pero podría ser una solución.

El Inspector en Finder presenta información para el archivo o archivos actualmente seleccionados :

+ +I

La ventana Resumen de información del Finder es útil cuando se seleccionan varios archivos :

^+ +I

Si selecciona varios archivos del mismo tipo, cualquiera de los métodos anteriores le permitirá cambiar fácilmente la propiedad Abrir con: para esos archivos.

No es una respuesta a su pregunta exacta, sino otra posible solución. Puede abrir un documento con una aplicación específica desde la línea de comando con el argumento -a para abrir.

Por ejemplo, abra todos los archivos html en el directorio actual.

> open -a 'Google Chrome' *.html

Abra index.html y los archivos del controlador javascript en el editor de texto Atom:

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

Dependiendo de sus necesidades, puede modificar esto para que sea un servicio de Automator al que se le podría asignar una tecla de acceso directo, tomando las rutas de archivo seleccionadas como argumento.

Aquí hay un ejemplo de Automator AppleScript que recibe archivos como entrada y abre los archivos seleccionados en 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

carrera final

Obviamente, puede cambiar el nombre de la aplicación del editor de texto "Sublime", guardarlo como otro servicio y asignarles ambas teclas de acceso directo.