Điều này là có thể làm được, nhưng có lẽ không đơn giản như bạn nghĩ. Bạn sẽ cần phải làm quen với Định danh loại thống nhất. Nhìn vào trang Định danh loại thống nhất của Wikipedia .
OS X lưu trữ thông tin về các liên kết tệp ưa thích trong một tệp ưu tiên có tên com.apple.LaunchServices.plist
. Trước khi bạn cố gắng tìm và sửa đổi tệp đó, tôi khuyên bạn nên tự làm quen với hệ thống phân cấp miền của OS X để mặc định (còn gọi là "cài đặt"). Một bài viết tốt về điều này có thể được tìm thấy ở đây . (Tuyên bố miễn trừ trách nhiệm: họ dường như đang bán thứ gì đó trên trang web đó. Tôi không biết đó là gì và không có mối liên hệ nào với họ, lời giải thích chỉ là một điều tốt.)
Bây giờ bạn đã biết tất cả về mặc định và UTI (er, không phải loại y tế), bây giờ chúng ta có thể nói về việc thiết lập các liên kết tệp từ một dòng lệnh / tập lệnh.
Trước tiên, bạn sẽ cần biết cách thích hợp để xác định các tệp mà bạn muốn tạo liên kết.
Hãy nhớ làm thế nào tôi nói UTI là quan trọng? Có nhiều cách để xác định một tập tin. Nó phụ thuộc vào việc loại đã được chính thức khai báo trên hệ thống của bạn hay chưa. Ví dụ, các trình soạn thảo văn bản đàng hoàng như TextMate hoặc TextWrangler sẽ thêm khá nhiều khai báo kiểu vào hệ thống phân cấp kiểu khi bạn sử dụng chúng trên hệ thống của mình. Tuy nhiên, nếu bạn không có các ứng dụng đó, bạn có thể không khai báo các loại đó.
OK, nói đủ rồi. Ví dụ:
Lấy UTI cho một tệp:
$ mdls myFile.xml
...
kMDItemContentType = "public.xml"
kMDItemContentTypeTree = (
"public.xml",
"public.text",
"public.data",
"public.item",
"public.content"
)
...
Ok, tuyệt Một loại nội dung rõ ràng chúng ta có thể sử dụng. Viết nó xuống một nơi nào đó.
$ mdls myFile.myExtn
...
kMDItemContentType = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree = (
"public.data",
"public.item"
)
...
Giáo sư. OS X không biết về các tệp ".myExtn". Vì vậy, nó đã tạo ra một UTI động mà chúng ta không thể sử dụng cho bất cứ điều gì. Và các loại cha mẹ quá chung chung là hữu ích.
Bây giờ chúng ta đã biết các tệp của mình là gì, hãy xem tệp LaunchService.plist và xem những gì chúng ta có thể làm:
$defaults read com.apple.LaunchServices
{
...
LSHandlers = (
{
LSHandlerContentType = "public.html";
LSHandlerRoleAll = "com.apple.safari";
LSHandlerRoleViewer = "com.google.chrome";
},
...
{
LSHandlerContentTag = myExtn;
LSHandlerContentTagClass = "public.filename-extension";
LSHandlerRoleAll = "com.macromates.textmate";
},
...
);
...
}
Vì vậy, khi bạn có loại nội dung "tốt" để sử dụng, cấu trúc đầu tiên sẽ tốt hơn. Nếu không thì xây dựng khác. Lưu ý, có các cấu trúc khác trong tệp đó, nhưng chúng không liên quan đến những gì bạn đã hỏi. Chỉ cần biết họ ở đó khi bạn nhìn qua đầu ra.
Như bạn có thể thấy, bạn sẽ cần tìm UTI cho ứng dụng bạn muốn sử dụng. Các UTI cho Safar và TextMate nằm trong ví dụ của tôi ở trên, nhưng để tìm UTI chung cho một ứng dụng:
$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
<key>CFBundleIdentifier</key>
<string>com.apple.Safari</string>
...
LƯU Ý: Tôi không biết điều gì tạo nên sự khác biệt giữa LSHandlerRole ALL và LSHandlerRoleViewer. Tôi không thể tìm thấy tài liệu về bất cứ nơi nào. Những gì tôi làm thấy là 99% thời gian LSHandlerRoleAll là chỉ có một bộ (tức là không có LSHandlerRoleViewer tại tất cả) và rằng nó được thiết lập để UTI cho ứng dụng mà bạn mong muốn để kết hợp các loại với.
Đã đưa bạn đến nay, tôi sẽ rời khỏi CÁCH để thiết lập các giá trị bạn muốn làm bài tập cho người đọc. Lộn xộn với những điều này có thể hơi nguy hiểm. Bạn hoàn toàn có thể làm hỏng một tập tin và không có bất kỳ hiệp hội tập tin nào của bạn hoạt động. Sau đó, bạn phải vứt bỏ các tập tin và bắt đầu lại.
Một số gợi ý:
- Đọc lên
defaults write
và cú pháp của nó
- Hãy nhìn vào
PlistBuddy
. man PlistBuddy
và/usr/libexec/PlistBuddy -h
- Bỏ qua tất cả những điều vô nghĩa này và sử dụng RCDefaultApp