यह उल्लेखनीय है, लेकिन शायद उतना सीधा नहीं है जितना आप सोच सकते हैं। आपको यूनिफ़ॉर्म टाइप आइडेंटिफ़ायर से बहुत परिचित होने की आवश्यकता होगी। विकिपीडिया के यूनिफ़ॉर्म टाइप आइडेंटिफ़ायर पेज को देखें।
ओएस एक्स नाम के साथ वरीयता फ़ाइल में पसंदीदा फ़ाइल संघों पर जानकारी संग्रहीत करता है com.apple.LaunchServices.plist
। इससे पहले कि आप उस फ़ाइल को खोजने और संशोधित करने का प्रयास करें, मैं आपको सुझाव देता हूं कि आप ओएस एक्स के डोमेन पदानुक्रम को डिफॉल्ट्स (उर्फ "सेटिंग्स") से परिचित कराएं। इस पर एक अच्छा लेख यहां पाया जा सकता है । (अस्वीकरण: वे उस साइट पर कुछ बेच रहे हैं। मुझे नहीं पता कि यह क्या है और उनके साथ कोई संबंध नहीं है, स्पष्टीकरण सिर्फ एक अच्छा है।)
अब जब आप सभी चूक और यूटीआई (एर, मेडिकल प्रकार नहीं) के बारे में जानते हैं, अब हम एक स्क्रिप्ट / कमांड लाइन से फ़ाइल संघों की स्थापना के बारे में बात कर सकते हैं।
सबसे पहले, आपको उन फाइलों की पहचान करने का उचित तरीका जानना होगा जिनके लिए आप एक एसोसिएशन बनाना चाहते हैं।
याद रखें कि मैंने कैसे कहा कि यूटीआई महत्वपूर्ण थे? किसी फ़ाइल की पहचान करने के कई तरीके हैं। यह इस बात पर निर्भर करता है कि आपके सिस्टम पर औपचारिक रूप से घोषित किया गया है या नहीं। उदाहरण के लिए, TextMate या TextWrangler जैसे सभ्य टेक्स्ट एडिटर आपके सिस्टम पर उपयोग करते समय टाइप पदानुक्रम में कुछ प्रकार की घोषणाएँ जोड़ देंगे। यदि, हालांकि, आपके पास वे एप्लिकेशन नहीं हैं, तो आपके पास उन प्रकारों की घोषणा नहीं हो सकती है।
ठीक है, काफी बात करते हैं। उदाहरण:
किसी फ़ाइल के लिए UTI प्राप्त करें:
$ mdls myFile.xml
...
kMDItemContentType = "public.xml"
kMDItemContentTypeTree = (
"public.xml",
"public.text",
"public.data",
"public.item",
"public.content"
)
...
अच्छा ठीक है। एक स्पष्ट सामग्री प्रकार जिसका हम उपयोग कर सकते हैं। वह कहीं लिख लें।
$ mdls myFile.myExtn
...
kMDItemContentType = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree = (
"public.data",
"public.item"
)
...
उफ़। OS X को ".myExtn" फाइलों के बारे में पता नहीं है। इसलिए, इसने एक गतिशील यूटीआई बनाया जिसे हम किसी भी चीज के लिए उपयोग नहीं कर सकते। और माता-पिता प्रकार उपयोगी होने के लिए बहुत सामान्य हैं।
अब जब हमें पता है कि हमारी फाइलें क्या हैं, तो LaunchServices.plist फाइल को देखें और देखें कि हम क्या कर सकते हैं:
$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";
},
...
);
...
}
इसलिए, जब आपके पास उपयोग करने के लिए "अच्छा" सामग्री प्रकार होता है, तो पहला निर्माण बेहतर होता है। अन्यथा अन्य निर्माण। ध्यान दें, उस फ़ाइल में अन्य निर्माण हैं, लेकिन वे आपके द्वारा पूछे गए के लिए प्रासंगिक नहीं हैं। जब आप आउटपुट के माध्यम से देखते हैं, तो वे वहीं होते हैं।
जैसा कि आप देख सकते हैं, आपको उस एप्लिकेशन के लिए यूटीआई खोजना होगा जिसे आप उपयोग करना चाहते हैं। Safar और TextMate के लिए UTIs ऊपर मेरे उदाहरण में हैं, लेकिन एक आवेदन के लिए उदारता से UTI खोजने के लिए:
$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
<key>CFBundleIdentifier</key>
<string>com.apple.Safari</string>
...
नोट: मुझे पता नहीं है कि LSHandlerRoleAll और LSHandlerRoleViewer के बीच क्या अंतर है। मुझे उस पर कहीं भी प्रलेखन नहीं मिल रहा है। मैं जो देखता हूं वह यह है कि LSHandlerRoleAll का 99% समय केवल एक ही सेट है (यानी कोई LSHandlerRoleViewer बिल्कुल भी नहीं है) और यह उस एप्लिकेशन के लिए UTI पर सेट है जिसे आप टाइप के साथ जोड़ना चाहते हैं।
आप इसे दूर तक लाए, मैं पाठक के लिए एक अभ्यास के रूप में आपके द्वारा वांछित मूल्यों को निर्धारित करने के लिए HOW को छोड़ने जा रहा हूं। इन चीजों के साथ खिलवाड़ करना कुछ खतरनाक हो सकता है। यह आपके लिए पूरी तरह से संभव है कि आप किसी फ़ाइल को खंगालें और आपकी किसी भी फ़ाइल के साथ काम न करें। फिर आपको फ़ाइल को फेंकना होगा और शुरू करना होगा।
कुछ संकेत:
- पर
defaults write
और इसके सिंटैक्स को पढ़ें
- देख लेना
PlistBuddy
। man PlistBuddy
तथा/usr/libexec/PlistBuddy -h
- यह सब बकवास पूरी तरह से छोड़ दें और RCDefaultApp का उपयोग करें