Existe-t-il un moyen plus rapide de modifier les applications par défaut associées aux types de fichiers sur OS X?

13

Y a-t-il quelque chose de plus pratique que d'utiliser RCDefaultApp ou Magic Launch , ou simplement en appuyant plusieurs fois sur les boutons Changer tout dans les panneaux d'information du Finder?

J'ai pensé à écrire un script shell qui modifierait les tableaux CFBundleDocumentTypes dans les fichiers Info.plist. Mais chaque application a plusieurs clés (parfois une icône) qui devraient être modifiées.

lsregister ne peut pas être utilisé pour apporter des modifications spécifiques à la base de données 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
la source
Super travail Lauri, le filet est inondé de gens qui suggèrent Cmd-i, Change All. Je vais faire dutiun tourbillon la prochaine fois que j'essaie une autre application qui réenregistre des dizaines de types de fichiers.
ocodo

Réponses:

12

duti

  1. Téléchargez le programme d'installation de pkg ou compilez à partir des sources
  2. Enregistrez un fichier comme celui-ci quelque part:

    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

Trouver des identifiants de bundle ou 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

J'ai écrit un script Ruby un peu comme duti avant de le découvrir. Il faut cependant redémarrer le système d'exploitation pour appliquer les modifications. Il remplace également toutes les modifications externes apportées à 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
la source
Commenté par @kopischke… dans certains cas, un redémarrage du système d'exploitation n'est pas nécessaire après l'utilisation de duti.
Graham Perrin
2
@GrahamPerrin Je voulais dire que mon propre script Ruby (pas duti) nécessite un redémarrage. En fait, je suis passé à duti principalement parce qu'il ne nécessite pas de redémarrer ou d'écraser le plist.
Lri
1

Vous pouvez changer quelle application ouvre tous les AVI assez facilement, aucun script requis. Recherchez un fichier AVI et obtenez des informations dessus. Cela vous montrera les informations sur le fichier. Sélectionnez le programme dont vous souhaitez ouvrir les fichiers, puis cliquez sur le bouton "Tout changer ...". Cela vous invitera à modifier l'association par défaut. entrez la description de l'image ici

Tout comme un petit point, les fourchettes de ressources ne sont pas supprimées, mais les codes des créateurs le sont. En tant que tels, les nouveaux systèmes Mac OS ont un système plus flexible pour déterminer comment ouvrir des fichiers. Les applications sont censées fonctionner sur des fichiers qui n'ont pas de fourches de ressources, mais certaines applications les utilisent toujours.

mauvedeity
la source
1
La modification de l'application par défaut à partir d'une boîte de dialogue d'informations nécessite environ 10 actions de la souris ou du clavier. Cela devient assez ennuyeux après les quelques centaines de fois.
Lri
Dans ce cas, consultez cette réponse ailleurs sur le site, il vous montrera comment effectuer un changement de lot en ligne de commande.
mauvedeity
(La réponse liée concerne la modification de l'application par défaut d'un seul fichier à partir de sa fourchette de ressources.) Même si je modifiais les fourchettes de ressources de tous mes fichiers existants, cela ne changerait pas les applications par défaut des fichiers que j'aurai dans le futur.
Lri