Есть ли более быстрый способ изменить приложения по умолчанию, связанные с типами файлов в OS X?

13

Есть ли что-нибудь более удобное, чем использование RCDefaultApp или Magic Launch или просто многократное нажатие кнопок «Изменить все» на информационных панелях Finder?

Я думал о написании сценария оболочки, который изменял бы массивы CFBundleDocumentTypes в файлах Info.plist. Но у каждого приложения есть несколько ключей (иногда значок), которые необходимо изменить.

lsregister нельзя использовать для внесения конкретных изменений в базу данных 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
источник
Потрясающая работа Лаури, в сети полно людей, предлагающих Cmd-i, Изменить все. В dutiследующий раз я попробую другое приложение, которое перерегистрирует десятки типов файлов.
ocodo

Ответы:

12

duti

  1. Загрузите установщик pkg или скомпилируйте его из исходного кода
  2. Сохраните файл где-нибудь так:

    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

Нахождение идентификаторов пакета или 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

Я написал скрипт на Ruby, очень похожий на duti, прежде чем узнал об этом. Это требует перезагрузки ОС, чтобы применить изменения, хотя. Он также перезаписывает любые внешние изменения в 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
источник
Комментарий @kopischke… в некоторых случаях перезапуск операционной системы не требуется после использования duti.
Грэм Перрен
2
@GrahamPerrin Я имел в виду, что мой собственный скрипт на Ruby (не duti) требует перезапуска. Я фактически переключился на duti, главным образом потому, что он не требует перезапуска или перезаписи plist.
Lri
1

Вы можете изменить то, что приложение открывает все AVI довольно легко, никаких сценариев не требуется. Найдите файл AVI и получите информацию о нем. Это покажет вам информацию о файле. Выберите программу, которую хотите открыть, и нажмите кнопку «Изменить все ...». Это побудит вас изменить ассоциацию по умолчанию. введите описание изображения здесь

Как небольшой пункт, ресурсные вилки не постепенно исчезают, а коды создателей. Таким образом, новые системы Mac OS имеют более гибкую систему для разработки способов открытия файлов. Приложения должны работать с файлами, которые не имеют разветвлений ресурсов, но некоторые приложения все еще используют их.

mauvedeity
источник
1
Для изменения приложения по умолчанию из информационного диалога требуется около 10 действий мыши или клавиатуры. Это становится довольно раздражающим после первых нескольких сотен раз или около того.
Lri
В этом случае посмотрите этот ответ в другом месте на сайте, он покажет вам, как выполнить пакетное изменение командной строки.
Mauvedeity
(Связанный ответ об изменении приложения по умолчанию для одного файла из его ветки ресурсов.) Даже если бы я изменил вилки ресурсов всех моих существующих файлов, это не изменит приложения по умолчанию для файлов, которые будут у меня в будущее.
Lri