Programmatic / Script-atically cambiando la configuración predeterminada Open-With

8

¿Hay alguna forma 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 iconos de la base, lo que funciona, pero es lento, especialmente cuando estoy atravesando una gran cantidad de archivos solo con el teclado.

Básicamente, lo que quiero es un pequeño script de manzana / lo que sea que cambie todas las configuraciones de apertura con.
De esa manera, puedo tener un script para cada programa abierto, y cambiar de un lado a otro.

Gracias.

    
pregunta Fake Name 09.03.2011 - 16:59

4 respuestas

10

Esto es factible, pero probablemente no sea tan sencillo como podría pensar. Tendrá que familiarizarse con los identificadores de tipo uniforme. Mire la página 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 que intente buscar y modificar ese archivo, le sugiero que se familiarice con la jerarquía de dominios de OS X para los valores predeterminados (a.k.a. "configuración"). Puede encontrar un artículo decente sobre esto aquí . (Descargo de responsabilidad: parece que están 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 acerca de los valores predeterminados y las IU (no del tipo médico), ahora podemos hablar sobre la configuración de asociaciones de archivos desde una línea de comandos / comandos.

Primero, deberá conocer la forma correcta de identificar los archivos para los que desea hacer una asociación.

¿Recuerdas cuando dije que las UTI eran importantes? Hay varias formas de identificar un archivo. Depende de si el tipo ha sido declarado formalmente en su sistema o no. Por ejemplo, los editores de texto decentes como TextMate o TextWrangler agregarán bastantes declaraciones de tipo a la jerarquía de tipos cuando las use en su sistema. Sin embargo, si no tiene esas aplicaciones, es posible que no tenga dichos tipos declarados.

OK, basta de hablar. Ejemplos:

Obtenga la UTI para un archivo:

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

Ok, genial. 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"
)
...

Uy. 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 tienes 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 pidió. Solo debes saber que están ahí cuando miras 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 de manera genérica 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 ninguna parte. Lo que hago veo es que el 99% del tiempo LSHandlerRoleAll es el único conjunto (es decir, no hay ningún LSHandlerRoleViewer) y que está configurado a la UTI para la aplicación que desea asociar. escribe con.

Después de llevarte tan lejos, voy a dejar CÓMO establecer los valores que deseas como un ejercicio para el lector. Jugar con estas cosas puede ser algo peligroso. Es completamente posible que arruines un archivo y no tengas ninguna de tus asociaciones de archivos funcionando. Luego tienes que tirar el archivo y comenzar de nuevo.

Algunos consejos:

  • Lee sobre defaults write y su sintaxis
  • Echa un vistazo a PlistBuddy . man PlistBuddy y /usr/libexec/PlistBuddy -h
  • Omita todas estas tonterías y use RCDefaultApp
respondido por el dbingham 09.03.2011 - 20:28
1

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

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

+ + I

La ventana Información de resumen de Finder es útil cuando se seleccionan múltiples archivos :

^++I

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

    
respondido por el Loïc Wolff 09.03.2011 - 17:11
1

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 use PlistBuddy para verificar si las entradas ya existen , pero no he encontrado ninguna forma de aplicar los cambios sin reiniciar o reconstruir la base de datos de Servicios de lanzamiento.

Al utilizar duti , puede ejecutar duti ~/.duti después de guardar esto como ~/.duti :

net.sourceforge.skim-app.skim .pdf all
    
respondido por el user495470 10.03.2011 - 15:55
0

No es una respuesta a su pregunta exacta, sino otra solución posible. Puede abrir un documento con una aplicación específica desde la línea de comandos 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 modificarlo para que sea un servicio de Automator al que se le pueda asignar una tecla de método abreviado, considerando las rutas de archivo seleccionadas como un 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

final de ejecución

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

    
respondido por el Hurston 24.04.2017 - 19:25

Lea otras preguntas en las etiquetas