Có cách nào nhanh hơn để thay đổi các ứng dụng mặc định được liên kết với các loại tệp trên OS X không?


13

Có điều gì thuận tiện hơn việc sử dụng RCDefaultApp hoặc Magic Launch hay chỉ cần nhấn liên tục các nút Change All trong bảng thông tin của Finder?

Tôi đã nghĩ về việc viết một tập lệnh shell sẽ sửa đổi các mảng CFBundleDocumentTypes trong các tệp Info.plist. Nhưng mỗi ứng dụng có nhiều khóa (đôi khi là một biểu tượng) cần được thay đổi.

lsregister không thể được sử dụng để thực hiện các sửa đổi cụ thể cho cơ sở dữ liệu Dịch vụ khởi chạy.

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

Công việc tuyệt vời Lauri, mạng thật tuyệt vời với những người gợi ý Cmd-i, Change All. dutiLần tới tôi sẽ quay cuồng khi tôi thử một Ứng dụng khác đăng ký lại hàng tá loại tệp.
ocodo

Câu trả lời:


12

duti

  1. Tải xuống trình cài đặt pkg hoặc biên dịch từ nguồn
  2. Lưu một tập tin như thế này ở đâu đó:

    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

Tìm số nhận dạng gói hoặc 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

Tôi đã viết một kịch bản Ruby rất giống duti trước khi tôi phát hiện ra nó. Nó yêu cầu khởi động lại hệ điều hành để áp dụng các thay đổi mặc dù. Nó cũng ghi đè lên bất kỳ thay đổi bên ngoài nào 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


Được bình luận bởi @kopischke, trong một số trường hợp, không cần phải khởi động lại hệ điều hành sau khi sử dụng duti.
Graham Perrin

2
@GrahamPerrin Ý tôi là kịch bản Ruby của riêng tôi (không phải duti) yêu cầu khởi động lại. Tôi thực sự đã chuyển sang duti chủ yếu vì nó không yêu cầu khởi động lại hoặc ghi đè lên bảng.
Lri

1

Bạn có thể thay đổi những gì ứng dụng mở tất cả các AVI khá dễ dàng, không cần kịch bản. Tìm một tập tin AVI và nhận thông tin về nó. Điều này sẽ cho bạn thấy thông tin tập tin. Chọn chương trình bạn muốn mở tệp, sau đó nhấp vào nút "Thay đổi tất cả ...". Điều đó sẽ nhắc bạn thay đổi liên kết mặc định. nhập mô tả hình ảnh ở đây

Chỉ là một điểm nhỏ, các tài nguyên sẽ không bị loại bỏ, nhưng mã người tạo thì có. Như vậy, các hệ thống Mac OS mới hơn có một hệ thống linh hoạt hơn để tìm ra cách mở tệp. Các ứng dụng được cho là hoạt động trên các tệp không có nhánh tài nguyên, nhưng một số ứng dụng vẫn sử dụng chúng.


1
Thay đổi ứng dụng mặc định từ hộp thoại thông tin cần khoảng 10 thao tác chuột hoặc bàn phím. Điều đó trở nên khá khó chịu sau vài trăm lần đầu tiên.
Lri

Trong trường hợp đó, hãy xem câu trả lời này ở nơi khác trên trang web, nó sẽ chỉ cho bạn cách thực hiện thay đổi hàng loạt dòng lệnh.
mauvedeity

(Câu trả lời được liên kết là về việc thay đổi ứng dụng mặc định của một tệp từ ngã ba tài nguyên của nó.) Ngay cả khi tôi đã sửa đổi các nhánh tài nguyên của tất cả các tệp hiện có của mình, nó sẽ không thay đổi ứng dụng mặc định của các tệp tôi sẽ có Tương lai.
Lri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.