Czy istnieje szybszy sposób zmiany domyślnych aplikacji powiązanych z typami plików w systemie OS X?

13

Czy jest coś wygodniejszego niż używanie RCDefaultApp lub Magic Launch lub po prostu wielokrotne naciskanie przycisków Zmień wszystko w panelach informacyjnych Findera?

Myślałem o napisaniu skryptu powłoki, który zmodyfikowałby tablice CFBundleDocumentTypes w plikach Info.plist. Ale każda aplikacja ma wiele kluczy (czasem ikonę), które należy zmienić.

lsregister nie można używać do wprowadzania określonych modyfikacji bazy danych usług uruchamiania.

$ `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
źródło
Świetna robota Lauri, sieć jest zalana ludźmi, którzy sugerują Cmd-i, Zmień wszystko. Przy dutinastępnym wirowaniu wypróbuję kolejną aplikację, która ponownie rejestruje dziesiątki typów plików.
ocodo

Odpowiedzi:

12

duti

  1. Pobierz instalator pkg lub skompiluj ze źródła
  2. Zapisz gdzieś taki plik:

    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

Znajdowanie identyfikatorów pakietów lub identyfikatorów 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

Napisałem skrypt Rubiego bardzo podobny do duti, zanim się o tym dowiedziałem. Wymaga to jednak ponownego uruchomienia systemu operacyjnego, aby zastosować zmiany. Zastępuje również wszelkie zmiany zewnętrzne do 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
źródło
Skomentowane przez @kopischke… w niektórych przypadkach ponowne uruchomienie systemu operacyjnego nie jest wymagane po użyciu duti.
Graham Perrin
2
@GrahamPerrin Miałem na myśli, że mój własny skrypt Ruby (nie duti) wymaga ponownego uruchomienia. Właściwie przełączyłem się na duti głównie dlatego, że nie wymaga to restartu ani zastąpienia listy odtwarzania.
Lri
1

Możesz dość łatwo zmienić, która aplikacja otwiera wszystkie pliki AVI, bez konieczności wykonywania skryptów. Znajdź plik AVI i zrób o nim informacje. Spowoduje to wyświetlenie informacji o pliku. Wybierz program, który chcesz otworzyć pliki, a następnie kliknij przycisk „Zmień wszystko ...”. Pojawi się monit o zmianę domyślnego powiązania. wprowadź opis zdjęcia tutaj

W pewnym sensie rozwidlenia zasobów nie są wycofywane, ale kody twórców są. W związku z tym nowsze systemy Mac OS mają bardziej elastyczny system opracowywania sposobów otwierania plików. Aplikacje powinny działać na plikach, które nie mają widelców zasobów, ale niektóre aplikacje nadal z nich korzystają.

mauvedeity
źródło
1
Zmiana domyślnej aplikacji z okna dialogowego informacji wymaga około 10 działań myszy lub klawiatury. To robi się dość denerwujące po pierwszych kilkuset razach.
Lri,
W takim przypadku zapoznaj się z tą odpowiedzią w innym miejscu witryny, a dowiesz się, jak dokonać zmiany partii w wierszu polecenia.
mauvedeity
(Połączona odpowiedź dotyczy zmiany domyślnej aplikacji pojedynczego pliku z rozwidlenia zasobów.) Nawet jeśli zmodyfikowałem rozwidlenia zasobów wszystkich moich istniejących plików, nie zmieniłoby to domyślnych aplikacji plików, które będę mieć w przyszłość.
Lri