मेनू बार से अप्प्लीस्क्रिप्ट चलता है?


6

मुझे स्क्रिप्ट एडिटर मेन्यू की जानकारी है। वह नहीं है जो मैं देख रहा हूँ।

क्या मेन्यू बार से अप्प्लीस्क्रिप्ट चलाने का कोई तरीका है? मैं इसे एक फ़ाइल के रूप में सहेज सकता हूं और इसे स्क्रिप्ट एडिटर मेनू से चला सकता हूं, और मैं इसे एक एप्लिकेशन के रूप में सहेज सकता हूं और इसे मेरी गोदी में चिपका सकता हूं। क्या कोई फ़ाइल प्रारूप है जो इसे मेनू बार से चलाने की अनुमति देता है, जैसा कि कई अनुप्रयोग करते हैं? या कोड को संपादित करने का एक तरीका जो समान कार्य करता है?

जवाबों:


8

एक स्क्रिप्ट के रूप में कोको-ऐप्पलस्क्रिप्ट या स्क्रिप्ट एडिटर में बनाया गया ऐप्पलस्क्रिप्ट एप्लिकेशन मेनू बार ऐप का समर्थन करता है। यह स्क्रिप्ट macOS 10.12 (शायद 10.10.x, 10.11.x पर चलती है) पर चलती है। इस स्क्रिप्ट को एप्लिकेशन के रूप में सहेजा जा सकता है।

--AppleScript: menu bar script -- Created 2017-03-03 by Takaaki Naganoya
--2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
--http://piyocast.com/as/archives/4502

property aStatusItem : missing value

on run
    init() of me
end run

on init()
    set aList to {"Piyomaru", "Software", "", "Takaaki", "Naganoya", "", "Quit"}
    set aStatusItem to current application's NSStatusBar's systemStatusBar()'s statusItemWithLength:(current application's NSVariableStatusItemLength)

    aStatusItem's setTitle:"🚗"
    aStatusItem's setHighlightMode:true
    aStatusItem's setMenu:(createMenu(aList) of me)
end init

on createMenu(aList)
    set aMenu to current application's NSMenu's alloc()'s init()
    set aCount to 1
    repeat with i in aList
        set j to contents of i
        if j is not equal to "" then
            set aMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:j action:"actionHandler:" keyEquivalent:"")
        else
            set aMenuItem to (current application's NSMenuItem's separatorItem())
        end if
        (aMenuItem's setTarget:me)
        (aMenuItem's setTag:aCount)
        (aMenu's addItem:aMenuItem)
        if j is not equal to "" then
            set aCount to aCount + 1
        end if
    end repeat

    return aMenu
end createMenu

on actionHandler:sender
    set aTag to tag of sender as integer
    set aTitle to title of sender as string

    if aTitle is not equal to "Quit" then
        display dialog aTag as string
    else
        current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
    end if
end actionHandler:

मैंने पहले मूल का संपादन किया था कोड , Piyomaru द्वारा पोस्ट, बस इस बिंदु पर संकलन करेगा और उदाहरण बनाने के लिए कुछ अतिरिक्त जानकारी जोड़ना चाहता था कोड AppleScript के लिए अपेक्षाकृत नए किसी के लिए अधिक उपयोगी है।

वर्तमान में उदाहरण में कोड , अगर एक के रूप में बचाया आवेदन यह नहीं है कोड पद छोड़ना आवेदन , यह केवल मेनू बार ऑब्जेक्ट को निकालता है। तो, में actionHandler हैंडलर का लिपि , निम्नलिखित को जोड़ें else डाली का if बयान , मौजूदा के बाद कोड :

        if (name of current application) is not "Script Editor" then
            tell current application to quit
        end if

यह स्क्रिप्ट कोड के भीतर से चलने पर / अगर इसे कोडित किया जाता है तो यह स्क्रिप्ट एडिटर को बंद करने का प्रयास नहीं करेगा। आप इसे बिना उपयोग कर सकते हैं if बयान ब्लॉक करें और उपयोग करें tell current application to quit यदि आप इसे स्क्रिप्ट संपादक के भीतर से नहीं चलाने जा रहे हैं।

क्योंकि यह लिपि कोको-ऐप्पस्क्रिप्ट का उपयोग कर रहा है, एक बार स्क्रिप्ट एडिटर के भीतर से चलता है, इसे कोको-एप्सस्क्रिप्ट द्वारा बनाई गई सी और ऑब्जेक्टिव-सी पॉइंटर्स को फ्लश करने के लिए सहेजने से पहले फिर से संकलित किया जाना चाहिए कोड , क्योंकि संकेत स्क्रिप्ट में सहेजे नहीं जा सकते। टूलबार पर हथौड़ा आइकन पर क्लिक करें, या: स्क्रिप्ट संपादक & gt; स्क्रिप्ट और जी.टी. संकलन ⌘K

इसके अतिरिक्त, जब एक के रूप में बचाया आवेदन आप अवश्य देखें रन हैंडलर के बाद खुले रहें चेक-बॉक्स इसे सहेजते समय, और डिफ़ॉल्ट रूप से ऐप का डॉक टाइल चलने पर डॉक में दिखाई देगा। चूंकि यह मेनू बार ऐप के लिए अवांछित व्यवहार हो सकता है, इसलिए निम्न का उपयोग करें आदेश आवश्यक जोड़ने के लिए टर्मिनल में कुंजी ऐप के लिए Info.plist फ़ाइल इसलिए यह डॉक में नहीं दिखाई देगा।

defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
  • बदलने के name_of_app वास्तविक नाम के साथ आपने इसे सहेजा है, और यदि आवश्यक हो तो पथ को बदलें यदि नहीं /Applications
  • ध्यान दें कि यदि आप डॉक पर एप्लिकेशन को खींचते हैं, तो इसकी डॉक टाइल अभी भी डॉक पर दिखाई देगी, बस खुले होने पर इसके नीचे एक खुला संकेतक नहीं होगा। यह जोड़ा गया कुंजी Info.plist फ़ाइल को डॉक पर दिखाते समय डॉक टाइल को चालू रखने के लिए है, जब एप्लिकेशन को पहली बार डॉक पर नहीं घसीटा गया है।

में actionHandler हैंडलर मूल उदाहरण का कोड , यह सिर्फ मेनू आइटम नंबर के साथ एक संवाद बॉक्स प्रदर्शित करता है जिसे क्लिक किया गया था, जो निश्चित रूप से उदाहरण के लिए ठीक है कोड हालाँकि, मैं एक अलग उदाहरण दिखाना चाहता हूँ कि कैसे अलग है कोड किस मेनू आइटम पर क्लिक किया गया। निम्न उदाहरण कोड पूरी जगह ले सकता है actionHandler हैंडलर मूल रूप में लिपि :

on actionHandler:sender
    set aTitle to title of sender as string
    if aTitle is equal to "Quit" then
        current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
        if (name of current application) is not "Script Editor" then
            tell current application to quit
        end if
    else if aTitle is equal to "Piyomaru" then

        --  # Your code to run for this menu choice goes here:

    else if aTitle is equal to "Software" then

        --  # Your code to run for this menu choice goes here:

    else if aTitle is equal to "Takaaki" then

        --  # Your code to run for this menu choice goes here:

    else if aTitle is equal to "Naganoya" then

        --  # Your code to run for this menu choice goes here:

    end if
end actionHandler:

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

AppleScript भाषा गाइड से एक चर्चा नोट:

एक अगर कथन में कोई भी संख्या हो सकती है और अगर खंड; AppleScript पहले बूलियन अभिव्यक्ति के लिए एक में निहित दिखता है अगर या और अगर क्लॉज वह है सच , इसके ब्लॉक में निहित कथनों (एक के बीच के कथनों) को निष्पादित करता है और अगर और निम्नलिखित और अगर या अन्य खंड), और फिर बाहर निकलता है अगर बयान।

एक अगर बयान में एक अंतिम भी शामिल हो सकता है अन्य खंड। यदि कोई अन्य परीक्षण नहीं करता है तो इसके ब्लॉक के कथनों को निष्पादित किया जाता है अगर स्टेटमेंट पास

मूल उदाहरण कोड के अधिकांश भाग के लिए, आपको केवल कोड की दो पंक्ति को संशोधित करना होगा init हैंडलर :

set aList to {"Piyomaru", "Software", "", "Takaaki", "Naganoya", "", "Quit"}
  • यह उनके क्रम में मेनू कमांड का नाम सेट करता है, और "" एक विभाजक के लिए है।

एक अलग आइकन के लिए:

aStatusItem's setTitle:"🚗"
  • "कुछ और जिसे आप पसंद करते हैं, उससे बदलें: स्क्रिप्ट संपादक & gt; संपादित करें & gt; इमोजी और amp; प्रतीक

उम्मीद है कि यह स्पष्ट है कि if में बयान ब्लॉक actionHandler हैंडलर के अनुरूप होगा aList में init हैंडलर , इसलिए नामों का मिलान करें aTitle is equal to में actionHandler हैंडलर में नाम के लिए aList में init हैंडलर

का बाकी कोड को संशोधित करने की आवश्यकता नहीं होनी चाहिए, हालांकि यह निश्चित रूप से आवश्यकता हो सकती है या चाहिए।


मैंने आपका उत्तर संपादित कर दिया क्योंकि जैसा लिखा गया है वह संकलन नहीं होगा, ऐसा अब होना चाहिए। साथ ही, यह स्क्रिप्ट कोको-AppleScript का उपयोग करती है, सामान्य या मानक AppleScript अकेले नहीं। हालांकि +1।
user3439894

मैं इसे सहेज नहीं सकता - या तो स्क्रिप्ट या एप्लिकेशन के रूप में। मैंने कंपाइल स्टेप किया है, लेकिन प्राप्त करना है: दस्तावेज़ "xxx" को स्वतः सहेजा नहीं जा सका। सी और ऑब्जेक्टिव-सी पॉइंटर्स को स्क्रिप्ट्स में सेव नहीं किया जा सकता है। मैं क्या गलत कर रहा हूं?
Gilby

AppleScript दस्तावेज़ फ़ाइल सी और ऑब्जेक्टिव-सी पॉइंटर्स को इसमें सेव नहीं कर सकती है। तो, आपको AppleScript (ex.add रिक्त लाइनों या रिक्त लाइनों को हटाने) को संपादित करना होगा, फिर आप इसे सहेज सकते हैं। यह Apple के वास्तविक स्क्रिप्ट एडिटर के लिए एक सामान्य ऑपरेशन है।
Piyomaru

7

स्क्रिप्ट के रूप में सामान्य AppleScript या स्क्रिप्ट एडिटर में बनाया गया AppleScript एप्लिकेशन मेनू बार ऐप के रूप में समर्थित नहीं है। यदि आप मेनू बार में स्क्रिप्ट मेनू का उपयोग नहीं करना चाहते हैं, तो आपको कोको-ऐप्पस्क्रिप्ट का उपयोग करना होगा या एक्सकोड में एप्लिकेशन का निर्माण करना होगा (या किसी तीसरे पक्ष के लॉन्चर का उपयोग करना होगा)।

यहाँ स्विफ्ट का उपयोग करके Xcode में किया गया एक उदाहरण ऐप है: WeatherBar

एक लंबे समय से भरोसेमंद ऐप जो ऐसा करता है FastScripts , और यद्यपि यह लिपियों के मेनू जैसा दिखता है, जो अतिरिक्त कार्यक्षमता प्रदान करता है। इसे 10 कीबोर्ड शॉर्टकट तक मुफ्त ऐप के रूप में चलाया जा सकता है, या असीमित कीबोर्ड शॉर्टकट अनलॉक करने के लिए $ 9.95 में अपग्रेड किया जा सकता है।

Red Sweater Software, LLC के साथ मेरा कोई जुड़ाव नहीं है, फिर एक फ्री ऐप के रूप में FastScripts के उपयोगकर्ता के रूप में।


FastScripts अच्छा है कि यह आपको अपने मेनू आइटम के लिए कीबोर्ड शॉर्टकट असाइन करने देता है। ऐप्पल के "स्क्रिप्ट एडिटर मेनू" ने आपको सालों और सालों पहले इसके मेनू आइटम के शॉर्टकट्स देने से रोक दिया था
Wayfaring Stranger

3

निर्भर करता है कि आप वास्तव में अपने सेब स्क्रिप्ट के साथ क्या करना चाहते हैं bitbar अपने उद्देश्य के लिए उपयुक्त हो सकता है।

सामान्य तौर पर यह एप्लिकेशन आपको मेनू बार में कई प्रकार की स्क्रिप्ट के आउटपुट को प्रदर्शित करने देता है - कई स्क्रिप्ट पहले से ही खत्म हो चुकी हैं, लेकिन आप अपना खुद का भी लिख सकते हैं।

लेकिन इसे निष्पादित करने के लिए भी इस्तेमाल किया जा सकता है applescripts। मैं इसे निष्पादित करने के लिए उपयोग करता हूं a applescripted के रूप में बचाया service इसे थोड़ा बैश स्क्रिप्ट के माध्यम से कॉल करके:

#!/bin/bash
echo "blub"
echo "---"
echo "1 | bash=/Users/username/Library/Services/Space_1 terminal=false"

-2

थोड़ा-सा "सेवा" मेनू (एप्लिकेशन के नाम के तहत मेनू में) है और आप स्क्रिप्ट को सेवाओं के रूप में सहेज सकते हैं और उन्हें किसी विशिष्ट एप्लिकेशन के लिए सेवा मेनू में उपलब्ध करा सकते हैं।

अनुप्रयोगों की अवधारणा भी है जो "अटैचमेंट" हैं, ये अनुप्रयोग आपको एप्लिकेशन के स्वयं के मेनू कमांड में स्क्रिप्ट जोड़ने की अनुमति देते हैं। लेकिन जो अनुप्रयोग अटैच होते हैं वे दुर्लभ लगते हैं।

क्या आप जो खोज रहे हैं, उसमें से कोई भी फिट बैठता है?


नहीं। मैं एक ऐसे एप्लिकेशन की तलाश कर रहा हूं जो मेनू बार से ही चलता है, सेवा नहीं। क्या आपके पास स्पीडटेस्ट ऐप है? ऐसा कुछ, जहां ऐप खुद मेनू बार में है, न कि केवल इससे लॉन्च किया गया है।
DonielF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.