Чи є більш швидкий спосіб змінити програми за замовчуванням, пов’язані з типами файлів на OS X?


13

Чи є щось зручніше, ніж використання RCDefaultApp або Magic Launch або просто багаторазове натискання кнопок Змінити все на інформаційних панелях Finder?

Я думав над тим, щоб написати скрипт оболонки, який змінив б масиви CFBundleDocumentTypes у файлах Info.plist. Але кожен додаток має кілька клавіш (іноді іконку), які потрібно було б змінити.

lsregister не можна використовувати для внесення конкретних змін до бази даних служб запуску.

$ `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

Дивовижна робота Лаурі, мережа переповнена людьми, які пропонують Cmd-i, Change All. Я дам dutiвир наступного разу, коли випробую інше додаток, яке перереєструє десятки типів файлів.
ocodo

Відповіді:


12

дуті

  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

Я написав сценарій Рубі, як дуті, перш ніж дізнався про нього. Потрібно перезапустити ОС, щоб застосувати зміни. Він також перезаписує будь-які зовнішні зміни 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


Прокоментував @kopischke… у деяких випадках перезапуск операційної системи після використання duti не потрібен.
Грехем Перрін

2
@GrahamPerrin Я мав на увазі, що мій власний сценарій Ruby (а не duti) вимагає перезавантаження. Я фактично перейшов на duti головним чином тому, що це не вимагає перезавантаження або перезапису списку.
Лрі

1

Ви можете змінити те, що програма відкриває всі AVI досить легко, сценарії не потрібні. Знайдіть файл AVI та отримайте інформацію про нього. Це покаже вам інформацію про файл. Виберіть програму, для якої потрібно відкрити файли, а потім натисніть кнопку «Змінити все ...». Це запропонує вам змінити об'єднання за замовчуванням. введіть тут опис зображення

Як невеликий момент, вилки ресурсів не припиняються, але коди творців є. Отже, новіші системи Mac OS мають більш гнучку систему для розробки способів відкриття файлів. Передбачається, що програми працюють на файлах, у яких немає вилок ресурсів, але деякі програми все ще використовують їх.


1
Для зміни програми за замовчуванням з інформаційного діалогу потрібно приблизно 10 дій миші або клавіатури. Це стає дуже дратує після перших кількох сотень разів.
Lri

У цьому випадку перегляньте цю відповідь в іншому місці на веб-сайті, вона покаже вам, як зробити зміну партії командного рядка.
март

(Пов'язана відповідь стосується зміни програми за замовчуванням для одного файлу з його вилки ресурсу.) Навіть якщо я змінив вилки ресурсів для всіх своїх існуючих файлів, це не змінить програми за замовчуванням файлів, які я матиму в майбутнє
Лрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.