Esiste un modo più rapido per modificare le app predefinite associate ai tipi di file su OS X?


13

C'è qualcosa di più conveniente che usare RCDefaultApp o Magic Launch o semplicemente premere ripetutamente i pulsanti Cambia tutto nei pannelli informativi di Finder?

Ho pensato di scrivere uno script shell che avrebbe modificato gli array CFBundleDocumentTypes nei file Info.plist. Ma ogni app ha più chiavi (a volte un'icona) che dovrebbero essere modificate.

lsregister non può essere utilizzato per apportare modifiche specifiche al database di 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

Fantastico lavoro Lauri, la rete è piena di gente che suggerisce Cmd-i, Cambia tutto. La dutiprossima volta proverò a provare un'altra app che registra nuovamente dozzine di tipi di file.
ocodo,

Risposte:


12

Duti

  1. Scarica il programma di installazione pkg o compila dal sorgente
  2. Salva un file come questo da qualche 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

Ricerca di identificativi di bundle 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

Ho scritto una sceneggiatura di Ruby molto simile a duti prima di scoprirlo. Tuttavia, è necessario riavviare il sistema operativo per applicare le modifiche. Sovrascrive anche eventuali modifiche esterne 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


Commentato da @kopischke… in alcuni casi, non è necessario riavviare il sistema operativo dopo l'uso di duti.
Graham Perrin,

2
@GrahamPerrin Intendevo dire che il mio script Ruby (non duti) richiede il riavvio. In realtà sono passato a duti principalmente perché non richiede il riavvio o la sovrascrittura del plist.
Lri,

1

È possibile modificare l'applicazione che apre tutti gli AVI abbastanza facilmente, senza necessità di script. Trova un file AVI e ottieni informazioni su di esso. Questo ti mostrerà le informazioni sul file. Seleziona il programma che desideri aprire i file, quindi fai clic sul pulsante "Cambia tutto ...". Ciò ti chiederà di cambiare l'associazione predefinita. inserisci qui la descrizione dell'immagine

Proprio come un piccolo punto, le fork di risorse non vengono gradualmente eliminate, ma lo sono i codici creatore. Pertanto, i sistemi Mac OS più recenti hanno un sistema più flessibile per capire come aprire i file. Le applicazioni dovrebbero funzionare su file che non hanno fork di risorse, ma alcune applicazioni li usano ancora.


1
La modifica dell'app predefinita da una finestra di dialogo delle informazioni richiede circa 10 azioni del mouse o della tastiera. Diventa abbastanza fastidioso dopo le prime centinaia di volte.
Lri,

In tal caso, vedi questa risposta altrove sul sito, ti mostrerà come effettuare una modifica batch della riga di comando.
mauvedeity

(La risposta collegata riguarda la modifica dell'app predefinita di un singolo file dal relativo fork delle risorse.) Anche se modificassi le forcelle delle risorse di tutti i miei file esistenti, non cambierebbe le app predefinite dei file che avrò futuro.
Lri,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.