2010-09-17 18 views
7

के लिए एक हिम तेंदुए की सेवा लिखना मैं वर्तमान में खोजक में नई फाइलें बनाने की अक्षमता के साथ समस्या को हल करने में देख रहा हूं। मैं जो स्रोत लिखता हूं उसे खोलूंगा क्योंकि मुझे लगता है कि मैक समुदाय को इस हल की जरूरत है।Finder.app

विंडोज़ पर, आप राइट-क्लिक कर सकते हैं, नई टेक्स्ट फ़ाइल बना सकते हैं।

  • राइट-क्लिक करें> सेवाएं> नया पाठ फ़ाइल

एक खोजक Service लेखन बनाएं Snow Leopard में है: ओएस एक्स, आप एक सेवा है जो इस तरह काम करेगा के साथ ऐसा करने में सक्षम होना चाहिए सैद्धांतिक रूप से इसे पूरा करने का तरीका, हालांकि मुझे कोई नमूना कोड नहीं मिला है। (मैं स्वीकार करूंगा कि मैंने केवल दस्तावेज़ीकरण को बहुत संक्षेप में देखा है)।

मुझे यकीन नहीं है कि कैसे शुरू किया जाए, चाहे ऐप्पल एक्सकोड में एक सेवा टेम्पलेट प्रदान करे। असल में मैं एक कामकाजी सेवा प्रोजेक्ट चलाने के लिए मदद की तलाश में हूं। Obj-C में लिखने के लिए कार्यान्वयन कोड तब मेरे लिए छोटा होना चाहिए। तो मैं एक नई कार्यकारी सेवा परियोजना बनाने के लिए क्या कर सकता हूं? अगर मैं इसके बारे में गलत हूं तो मुझे ऐसा करने का सही तरीका बताएं और कृपया मुझे प्रारंभ करने के लिए नमूना कोड या कुछ कदम प्रदान करें।

संपादित करें: मुझे विश्वास करो, मैं ओएस एक्स नोब नहीं हूं। काम के आसपास काम करने के लिए कई ऐप्स की कोशिश की है: पथदर्शी, ऑटोमेटर, टर्मिनल, आदि और मैं उनमें से किसी के साथ खुश नहीं हूं।

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

दुखद तथ्य यह है कि ऐप्पल ने तीसरे पक्ष के प्रासंगिक मेनू आइटम को अक्षम कर दिया जब हिम तेंदुए को रिहा कर दिया गया और देव खुश नहीं थे। आप ऑटोमेटर के साथ प्रासंगिक मेनू के तहत सेवाएं बना सकते हैं, लेकिन यह बहुत सीमित था।

हां, क्विक्सिलवर इस समय फाइलें बनाने का तरीका है, जब तक कि मैं touch ~/Desktop/file.txt या कहीं भी टर्मिनल में नहीं हूं।

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

उत्तर

13

Services Implementation Guide पढ़ें। यदि आप एक कामकाजी नमूना कोड चाहते हैं, तो मैंने पकाया this project देखें। के रूप में गाइड में बताया गया है, तुम क्या करने की जरूरत है सेवा हैंडलर इंस्टॉल करना है:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    [NSApp setServicesProvider:self]; 
    NSUpdateDynamicServices(); 
} 

- (void)handleServices:(NSPasteboard *)pboard 
      userData:(NSString *)userData 
     error:(NSString **)error { 
    if([[pboard types] containsObject:NSFilenamesPboardType]){ 
     NSArray* fileArray=[pboard propertyListForType:NSFilenamesPboardType]; 
      // do something... 
    } 
} 

और अपने Info.plist में यह विज्ञापित:

<key>NSServices</key> 
<array> 
    <dict> 
     <key>NSMenuItem</key> 
     <dict> 
      <key>default</key> 
      <string>Service Handling Demo</string> 
     </dict> 
     <key>NSMessage</key> 
     <string>handleServices</string> <!-- This specifies the selector --> 
     <key>NSPortName</key> 
     <string>services</string>  <!-- This is the name of the app --> 
     <key>NSSendTypes</key> 
     <array> 
      <string>NSFilenamesPboardType</string> 
     </array> 
    </dict> 
</array> 

यह इस रूप में के रूप में आसान है! आपको System Preferences.app के कीबोर्ड शॉर्टकट अनुभाग में सेवा प्रविष्टि को मैन्युअल रूप से चालू करने की आवश्यकता हो सकती है। यदि आप इसे स्वचालित रूप से चालू करना चाहते हैं, तो आप pbs.plist में Library/Preferences/ के अंदर लिख सकते हैं, लेकिन यह चीजों को करने का एक दस्तावेज तरीका नहीं है।

समस्या यह है कि जब आप खोजक विंडो में खाली क्षेत्र पर राइट-क्लिक करते हैं तो खोजक यह सेवा आइटम नहीं दिखाता है। आप कोड इंजेक्शन के अलावा, इसके साथ कुछ भी नहीं कर सकते हैं।यह सेवा प्रणाली के खोजक के समर्थन में निहित है। यदि आप उस व्यवहार को बदलना चाहते हैं, तो आपको Finder.app के अंदर कोड इंजेक्ट करने की आवश्यकता है। यह मुश्किल नहीं है। हिम तेंदुए पर, ओएसएक्स लोडिंग चाल का उपयोग करने के लिए मानक है, उदाहरण के लिए वर्णित in this blog post। फिर आप in this Apple document वर्णित विधियों को बदलकर, खोजक के दायाँ-क्लिक के व्यवहार को पैच करने के लिए उद्देश्य-सी रनटाइम फ़ंक्शंस का उपयोग कर सकते हैं। (मुझे नहीं पता कि कौन सी विधि खोजक राइट-क्लिक घटना का जवाब देने के लिए उपयोग करता है, हालांकि।)

इसके बजाए, यदि आप सही के बजाय खोजक विंडो के टूलबार पर एक बटन पर क्लिक करने के ठीक हैं, क्लिक करके, आप इस यूटिलिटी cd-to में एक बटन जोड़ सकते हैं। यह ऐप का आइकन फाइंडर टूलबार पर रखने की क्षमता का उपयोग करता है। ऐप स्वयं ऐप्पल घटनाओं के माध्यम से सामने की खोजक विंडो के पथ को पढ़ता है, और इसके लिए टर्मिनल विंडो खोलता है। मुझे लगता है कि आप जो भी चाहते हैं उसे करने के लिए आप इस ऐप के कोड को ट्विक कर सकते हैं।

यहाँ व्यक्तिपरक सामान का पालन करें:

ईमानदारी से, आप एक खोजक सेवा लिखने के लिए ऑब्जेक्टिव-सी का उपयोग करने के लिए यदि आप सिर्फ एक नई फ़ाइल बनाना चाहते जरूरत नहीं है। ऑटोमेटर एक ही स्क्रिप्ट स्क्रिप्ट और/या एप्पलस्क्रिप्ट के साथ एक ही काम कर सकता है।

आप मैक पर कुशलता से फाइलों का प्रबंधन करने के लिए चाहते हैं, तो पहले से ही हैं महान उपयोगिताओं के आसपास: कोशिश Butler या launchbar या Quicksilver, उदाहरण के लिए।

+0

ऑटोमेटर सीमित है। यह आपको एक नई पाठ फ़ाइल बनाने के लिए कोई क्रिया नहीं करने देता है। मैं विवरण बिल्कुल भूल गया लेकिन मैंने कुछ समय पहले यह कोशिश की और इसे हासिल करने में असमर्थ था। वैसे भी, मैं ऑटोमेटर का उपयोग नहीं करना चाहता। मैं इसे कोड में करना चाहता हूं। –

+0

@Yuji: "ऐप को डॉक या स्पॉटलाइट से खोलें।" यह एक कदम नहीं है। (1) ओपन ऐप, (2) कमांड + एस (3) खोजक विंडो की प्रॉक्सी को ऐप सेव डायलॉग पर खींचें। कभी-कभी मुझे विंडो आकारों पर Alt-Tab को प्रदर्शित करना होता है और कौन से ऐप्स खुले होते हैं (4) फ़ाइल को सहेजने के लिए एंटर दबाएं। ---- कम से कम 4 कदम। –

+0

क्या आपने ऑटोमेटर में "रन शेल स्क्रिप्ट" क्रिया का प्रयास किया था? आप जो कुछ भी चाहते हैं वह कर सकते हैं। ऑटोमेटर फ़ोल्डर नाम को शेल स्क्रिप्ट में पास करता है। एक शेल स्क्रिप्ट एक कोड है, है ना? दुर्भाग्य से आप उस सेवा का आह्वान करने के लिए खोजक विंडो के खाली भाग पर राइट-क्लिक नहीं कर सकते; इसके बजाय आपको उस फ़ोल्डर को राइट-क्लिक करने की आवश्यकता है जिसमें आप फ़ाइल बनाना चाहते हैं। यह प्रतिबंध है, मुझे लगता है कि ऑटोमेटर की सीमा नहीं है बल्कि सेवा प्रणाली की सीमा है। – Yuji