प्रोग्रामेटिकली / स्क्रिप्ट-डिफ़ॉल्ट रूप से डिफ़ॉल्ट ओपन-विथ सेटिंग को बदलना


8

क्या कोई तरीका है जो किसी फ़ाइल को प्रोग्राम के साथ / स्क्रिप्ट के साथ खोलता है?

मूल रूप से, कभी-कभी मैं एक वेब साइट पर काम कर रहा हूं, और मैं एक टेक्स्ट एडिटर (*/p।, * .Html, * .htm, आदि ...) के साथ खोलने के लिए सभी वेब फाइलें सेट करना चाहता हूं।

हालांकि, अन्य समय में, मैं केवल फाइलों को देखना चाहता हूं, इसलिए मैं चाहता हूं कि वे एक ब्राउज़र के साथ खोलें।

अभी, मैं गोदी आइकन पर आइटम खींच रहा हूं, जो काम करता है, लेकिन धीमा है, खासकर जब मैं कीबोर्ड के साथ बड़ी संख्या में फाइलों से गुजर रहा हूं।

मूल रूप से, मैं जो चाहता हूं वह एक छोटी सी एप्सस्क्रिप्ट है / जो कुछ भी सभी खुले-सेटिंग्स के साथ बदलता है।
इस तरह, मेरे पास प्रत्येक खुले कार्यक्रम के लिए एक स्क्रिप्ट हो सकती है, और आगे और पीछे बदल सकती है।

धन्यवाद।

जवाबों:


10

यह उल्लेखनीय है, लेकिन शायद उतना सीधा नहीं है जितना आप सोच सकते हैं। आपको यूनिफ़ॉर्म टाइप आइडेंटिफ़ायर से बहुत परिचित होने की आवश्यकता होगी। विकिपीडिया के यूनिफ़ॉर्म टाइप आइडेंटिफ़ायर पेज को देखें।

ओएस एक्स नाम के साथ वरीयता फ़ाइल में पसंदीदा फ़ाइल संघों पर जानकारी संग्रहीत करता है 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और इसके सिंटैक्स को पढ़ें
  • देख लेना PlistBuddyman PlistBuddyतथा/usr/libexec/PlistBuddy -h
  • यह सब बकवास पूरी तरह से छोड़ दें और RCDefaultApp का उपयोग करें

क्या आरसीडीफॉल्ट स्क्रिप्ट योग्य है? मैंने उनकी साइट पर देखा, और यह ऐसा नहीं दिखता है।
फेक नेम

कोई बात नहीं, मेरे पास उन सभी फ़ाइल प्रकारों के लिए घोषणाएँ हैं, जिनमें मैं रुचि रखता हूँ।
नकली नाम

महान लेखन। जहां तक LSHandlerRoleViewer, मुझे आश्चर्य है कि क्या यह संपादन के विपरीत देखने के लिए डिफ़ॉल्ट होने से संबंधित हो सकता है ( Apple.stackexchange.com/a/49998/206073 मुझे उन पंक्तियों पर मिला)। मैं नहीं जानता कि क्या संदर्भों में कोई यह निर्धारित कर सकता है कि कोई देखने या संपादन के लिए खोल रहा है, हालांकि ... (विषय से, CFBundleTypeRoleऐसा लगता है कि यह समान मूल्यों को स्वीकार करता है)
ब्रेट ज़मीर

इसके अलावा, ऐसा लगता com.apple.LaunchServices/com.apple.launchservices.secureहै कि बाद में मैकओएस सिस्टम में डोमेन हो सकता है ...
ब्रेट ज़मीर

2

एक विकल्प संपादित करना है ~/Library/Preferences/.GlobalPreferences.plist:

defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=com.adobe.pdf;LSHandlerRoleAll=net.sourceforge.skim-app.skim;}'

आप पहले से मौजूद हैं या नहीं, यह जांचने के लिए आप PlistBuddy का उपयोग कर सकते हैं , लेकिन मुझे लॉन्च सेवा डेटाबेस को पुनः आरंभ या पुनर्निर्माण किए बिना परिवर्तनों को लागू करने का कोई तरीका नहीं मिला है।

Duti का उपयोग करते हुए , आप duti ~/.dutiइसे इस प्रकार सहेज कर चला सकते हैं ~/.duti:

net.sourceforge.skim-app.skim .pdf all

1

यह वास्तव में आपके प्रश्न का उत्तर नहीं देता है, लेकिन एक समाधान हो सकता है।

इंस्पेक्टर खोजक में के लिए जानकारी प्रस्तुत करता है वर्तमान में चयनित फ़ाइल या वे फ़ाइलें:

+ +I

कई फ़ाइलों को चुनने पर खोजक की सारांश जानकारी विंडो उपयोगी होती है :

^+ +I

यदि आप एक ही प्रकार की कई फ़ाइलों का चयन करते हैं, तो ऊपर दी गई विधि से आप आसानी से उन फ़ाइलों के लिए संपत्ति के साथ ओपन स्विच कर सकते हैं।


0

आपके सटीक प्रश्न का उत्तर नहीं, बल्कि एक और संभावित समाधान। आप खोलने के लिए -a तर्क के साथ कमांड लाइन से एक विशिष्ट एप्लिकेशन के साथ एक दस्तावेज़ खोल सकते हैं।

उदाहरण के लिए, वर्तमान निर्देशिका में सभी HTML फाइलें खोलें।

> open -a 'Google Chrome' *.html

अनुक्रमणिका पाठ संपादक में index.html और जावास्क्रिप्ट नियंत्रक फ़ाइलें खोलें:

> open -a 'atom' index.html js/controllers/*.js

अपनी आवश्यकताओं के आधार पर, आप इसे एक स्वचालित सेवा के रूप में संशोधित कर सकते हैं जिसे एक शॉर्टकट कुंजी सौंपी जा सकती है, जिसे एक तर्क के रूप में चयनित फ़ाइल पथों में लिया जा सकता है।

यहाँ एक उदाहरण है स्वचालक AppleScript, जो इनपुट के रूप में फाइल प्राप्त करता है और क्रोम में चयनित फ़ाइलों को खोलता है:

on run {input, parameters}
set openFiles to "open -a 'Google Chrome' " --note the trailing space
set filePaths to {}

--covert the filePaths to posix style
repeat with i from 1 to count of input
    set aFile to input's item i as alias
    set aFile to quoted form of POSIX path of aFile
    set filePaths's end to aFile
end repeat

--convert filePaths list to a string delimited by spaces
set tid to text item delimiters
set text item delimiters to " "
set filePaths to filePaths as text
set text item delimiters to tid

--Open files via commandline
do shell script openFiles & filePaths
return input

अंत चला

जाहिर है, आप "सबलाइम" टेक्स्ट एडिटर का नाम बदल सकते हैं, इसे एक अन्य सेवा के रूप में सहेज सकते हैं, और उन्हें दोनों शॉर्टकट कुंजी असाइन कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.