¿Existe una forma más rápida de cambiar las aplicaciones predeterminadas asociadas con los tipos de archivos en OS X?

13

¿Hay algo más conveniente que usar RCDefaultApp o Magic Launch , o simplemente presionar repetidamente los botones Cambiar todo en los paneles de información del Finder?

Pensé en escribir un script de shell que modificara las matrices CFBundleDocumentTypes en los archivos Info.plist. Pero cada aplicación tiene varias claves (a veces un icono) que deberían cambiarse.

lsregister no se puede usar para realizar modificaciones específicas en la base de datos de Launch Services.

$ `locate lsregister` -h
lsregister: [OPTIONS] [ <path>... ]
                      [ -apps <domain>[,domain]... ]
                      [ -libs <domain>[,domain]... ]
                      [ -all  <domain>[,domain]... ]

Paths are searched for applications to register with the Launch Service database.
Valid domains are "system", "local", "network" and "user". Domains can also
be specified using only the first letter.

  -kill     Reset the Launch Services database before doing anything else
  -seed     If database isn't seeded, scan default locations for applications and libraries to register
  -lint     Print information about plist errors while registering bundles
  -convert  Register apps found in older LS database files
  -lazy n   Sleep for n seconds before registering/scanning
  -r        Recursive directory scan, do not recurse into packages or invisible directories
  -R        Recursive directory scan, descending into packages and invisible directories
  -f        force-update registration even if mod date is unchanged
  -u        unregister instead of register
  -v        Display progress information
  -dump     Display full database contents after registration
  -h        Display this help
Lri
fuente
Impresionante trabajo Lauri, la red está inundada de gente que sugiere Cmd-i, Change All. Voy a dar dutiun giro próxima vez que intento a cabo otra aplicación que vuelve a registrar decenas de tipos de archivo.
ocodo

Respuestas:

12

holandés

  1. Descargue el instalador de pkg o compile desde el código fuente
  2. Guarde un archivo como este en alguna parte:

    com.macromates.textmate public.shell-script all
    com.macromates.textmate public.unix-executable all
    com.macromates.textmate com.apple.property-list all
    org.videolan.vlc .avi all
    org.videolan.vlc .mkv all
    # ...
    
  3. duti $file.duti

Encontrar identificadores de paquetes o UTI:

bundleid() {
  osascript -e "id of app \"$*\""
}

getuti() {
  local f="/tmp/me.lri.getuti.${1##*.}"
  touch "$f"
  mdimport "$f"
  mdls -name kMDItemContentTypeTree "$f"
  rm "$f"
}

lsapps

Escribí un guión de Ruby muy parecido al holandés antes de descubrirlo. Sin embargo, requiere reiniciar el sistema operativo para aplicar los cambios. También sobrescribe cualquier cambio externo a com.apple.LaunchServices.plist.

#!/usr/bin/env ruby

datafile = "#{ENV['HOME']}/Notes/lsapps.txt"
cachedir = "#{ENV['HOME']}/Library/Caches/me.lri.scripts"
cachefile = cachedir + "/lsapps"
`mkdir -p #{cachedir}; touch #{cachefile}`
cachetext = IO.read(cachefile)

a = []
IO.readlines(datafile).each do |line|
  line.strip!
  next unless line =~ /^([^#].*): (.+)/
  z = $1, $2

  bid = cachetext.scan(/#{z[0]}  (.*)/)[0]
  unless bid
    bid = `osascript -e 'id of app "#{z[0]}"'`.chomp
    next unless bid
    File.open(cachefile, "a") { |f| f.puts(z[0] + "  " + bid) }
  end

  z[1].strip.split(" ").each do |e|
    if e =~ /(.+):\/\/$/
      a << "{LSHandlerURLScheme='#{$1}';LSHandlerRoleAll='#{bid}';}"
    elsif e.include?(".")
      a << "{LSHandlerContentType='#{e}';LSHandlerRoleAll='#{bid}';}"
    else
      a << "{LSHandlerContentTag='#{e}';LSHandlerContentTagClass=\
'public.filename-extension';LSHandlerRoleAll='#{bid}';}"
    end
  end
end

system("defaults", "write", "com.apple.LaunchServices", "LSHandlers",
"(" + a.join(",") + ")")

`defaults write com.apple.LaunchServices LSQuarantine -bool false`

lsapps.txt

NetNewsWire Lite: feed:// public.rss
iCal: icaltodo icalevent
Google Chrome: chrome://
Safari: public.html
TextEdit: txt text md markdown csv
TextMate: public.shell-script public.unix-executable public.script ssh:// xml plist dict css rst tex sh pl py rb gemspec php js java c h m conf bash opml as cfm cfml class coffee ctp erb rhtml haml less msass scss yaml rd
VLC: avi mpg flv mkv mp4 flac 3gp
The Unarchiver: rar
Skim: pdf
iChm: chm
AppleScript Editor: scpt
Sequential: png jpg
Lri
fuente
Comentado por @kopischke ... en algunos casos, no es necesario reiniciar el sistema operativo después del uso de duti.
Graham Perrin
2
@GrahamPerrin Quise decir que mi propio script Ruby (no holandés) requiere reiniciar. De hecho, cambié a holandés principalmente porque no requiere reiniciar o sobrescribir el plist.
Lri
1

Puede cambiar qué aplicación abre todos los AVI con bastante facilidad, sin necesidad de secuencias de comandos. Encuentre un archivo AVI y obtenga información sobre él. Esto le mostrará la información del archivo. Seleccione el programa que desea abrir los archivos, luego haga clic en el botón "Cambiar todo ...". Eso le pedirá que cambie la asociación predeterminada. ingrese la descripción de la imagen aquí

Solo como un pequeño punto, los tenedores de recursos no se están eliminando gradualmente, pero los códigos de creadores sí. Como tal, los sistemas Mac OS más nuevos tienen un sistema más flexible para determinar cómo abrir archivos. Se supone que las aplicaciones funcionan en archivos que no tienen bifurcaciones de recursos, pero algunas aplicaciones aún las usan.

malvadedad
fuente
1
Cambiar la aplicación predeterminada desde un cuadro de diálogo de información requiere aproximadamente 10 acciones del mouse o del teclado. Eso se vuelve bastante molesto después de los primeros cientos de veces más o menos.
Lri
En ese caso, vea esta respuesta en otra parte del sitio, le mostrará cómo hacer un cambio por lotes de la línea de comandos.
mauvedeity
(La respuesta vinculada se trata de cambiar la aplicación predeterminada de un solo archivo de su bifurcación de recursos). Incluso si modificara las bifurcaciones de recursos de todos mis archivos existentes, no cambiaría las aplicaciones predeterminadas de archivos que tendré en el futuro.
Lri