Applescript menü çubuğundan çalıştırın?


6

Script Editor menüsünün farkındayım. Aradığım şey bu değil.

Menü çubuğundan bir Applescript çalıştırmanın bir yolu var mı? Bir dosya olarak kaydedebilir ve Komut Dosyası Düzenleyici menüsünden çalıştırabilirim ve bir uygulama olarak kaydedebilir ve dokuma yerleştirebilirim. Birçok uygulamanın yaptığı gibi, menü çubuğundan çalışmasına izin veren bir dosya formatı var mı? Ya da aynı şeyi yapan kodu düzenlemenin bir yolu?

Yanıtlar:


8

Bir komut dosyası olarak Cocoa-AppleScript veya Script Editor'da oluşturulan AppleScript uygulaması Menü Çubuğu uygulamasını destekler. Bu betik macOS 10.12'de çalışır (belki 10.10.x, 10.11.x'te çalışır). Bu script uygulama olarak kaydedilebilir.

--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:

Orijinali daha önce düzenledim kod , Piyomaru tarafından yayınlanan, derleyeceği noktaya, örnek oluşturmak için bazı ek bilgiler eklemek istedi kod AppleScript için nispeten yeni olan herkes için daha kullanışlıdır.

Halen örnekte kod olarak kaydedilmişse, uygulama yok kod istifa etmek uygulama , yalnızca menü çubuğu nesnesini kaldırır. Yani, içinde actionHandler işleyicisi arasında senaryo , aşağıdakileri ekleyin else şube arasında if Beyan , mevcut olandan sonra kod :

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

Kodlanır, böylece / Kod Düzenleyici içinden çalıştırıldığında Kod Düzenleyiciyi kapatmaya çalışmaz. Olmadan kullanabilirsiniz if Beyan engelle ve kullan tell current application to quit Komut Dosyası Düzenleyicisi'nden çalıştırmayacaksanız.

Çünkü bu senaryo Cocoa-AppleScript kullanıyor, bir kez Script Editor içinden çalıştırıldığında, Cocoa-Applescript tarafından oluşturulan C ve Objective-C işaretçilerinin yıkanması için kaydetmeden hemen önce tekrar derlenmesi gerekir. kod , işaretçiler komut dosyasında kaydedilemediğinden. Araç Çubuğundaki çekiç simgesine tıklamanız yeterlidir: Komut Dosyası Düzenleyicisi & gt; Komut Dosyası & gt; Derlemek ⌘K

Ayrıca, uygulama kontrol etmelisin Çalıştırıcıdan sonra açık kal check-box onu kaydederken ve varsayılan olarak uygulamanın Dock Tile çalışırken Dock'ta görünecektir. Bir menü çubuğu uygulaması için istenmeyen davranış olabileceğinden, aşağıdakileri kullanın komuta Gerekli eklemek için Terminal anahtar uygulamanın Info.plist Dock'ta görünmeyecek şekilde dosya.

defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
  • değiştirmek name_of_app asıl ismi ile kaydettiğinizde, gerekirse /Applications.
  • Uygulamayı Dock'a sürüklerseniz, Dock Tile hala Dock'ta görünecek, açıkken altında açık bir gösterge olmayacağını unutmayın. Bu eklendi anahtar Info.plist dosyasına göre, uygulama ilk önce Dock'a sürüklenmemişken Dock Tile'in Dock'ta görünmesini engellemektir.

İçinde actionHandler işleyicisi Orijinal örneğin kod , yalnızca tıklanan menü öğesi numarasına sahip bir iletişim kutusu görüntüler; kod Bununla birlikte, nasıl ayrılacağına dair farklı bir örnek göstermek istiyorum. kod hangi menü öğesinin tıklandığına bağlı olarak yürütülür. Aşağıdaki örnek kod tüm yerini alabilir actionHandler işleyicisi orjinalinde senaryo :

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:

Şimdi bu farklı bir şekilde yazılabilir, yani bir "Çık" else veya else if dibinde, ancak bu şekilde yaptım çünkü diğer tüm menü komutlarının bir else if Seçim, mantıksal olarak verilen herhangi bir menü komutunun tıklanma olasılığının daha yüksek olmasına rağmen "Çık". Benim için menü komutlarını eklemek / düzenlemek / kaldırmak daha kolay. kod bu şekilde yazıldığında. Bu sadece kişisel bir tercih, bu yüzden sizin için neyin doğru olduğunu hissettiğiniz gibi yapın.

AppleScript Dil Kılavuzu'ndan bir tartışma notu:

bir Eğer deyimi herhangi bir sayıda içerebilir aksi takdirde maddeleri; AppleScript, içinde bulunan ilk Boolean ifadesini arar. Eğer veya aksi takdirde yan tümce doğru , bloğunda yer alan ifadeleri çalıştırır (bir ifadeler arasında aksi takdirde ve aşağıdaki aksi takdirde veya Başka yan tümce), ve sonra çıkar Eğer Beyan.

bir Eğer deyimi ayrıca bir final içerebilir Başka fıkra. Bloğundaki ifadeler, eğer başka test yoksa Eğer deyim geçer.

Orijinal örnek kodun çoğu için, kodun sadece iki satırını değiştirmeniz gerekir. init işleyicisi :

set aList to {"Piyomaru", "Software", "", "Takaaki", "Naganoya", "", "Quit"}
  • Bu, menü komutlarının adını sıralarına göre ayarlar ve "" bir ayırıcı içindir.

Farklı bir simge için:

aStatusItem's setTitle:"🚗"
  • "" İfadesini tercih ettiğiniz başka bir şeyle değiştirin: Komut Dosyası Düzenleyici & gt; Düzenle & gt; Emoji ve amp; Semboller

Umarım ki belli if deyim bloğunda actionHandler işleyicisi karşılık gelecek aList içinde init işleyicisi , yani aTitle is equal to içinde actionHandler işleyicisi adlarına aList içinde init işleyicisi .

Gerisi kod İhtiyaç duyulması veya istenmesi halinde kesinlikle mümkün olmasına rağmen, değiştirilmeye gerek yoktur.


Cevabınızı düzelttim çünkü yazıldığı gibi derlenmeyecekti, şimdi yapmalı. Ayrıca, bu komut dosyası yalnızca normal veya standart AppleScript değil, Cocoa-AppleScript kullanır. Yine de +1.
user3439894

Komut dosyası veya uygulama olarak kaydedemiyorum. Derleme adımını yaptım, ancak elde etmeye devam et: "xxx" belgesi otomatik olarak kaydedilemedi. C ve Objective-C işaretçiler komut dosyalarına kaydedilemez. Neyi yanlış yapıyorum?
Gilby

AppleScript belge dosyası içinde C ve Objective-C işaretçilerini kaydedemez. Böylece, AppleScript'i (örneğin, boş satırları silmek veya boş satırları silmek) düzenlemeniz gerekir, sonra kaydedebilirsiniz. Orijinal Apple Script Editor için normal bir işlemdir.
Piyomaru

7

Komut dosyası olarak normal AppleScript veya Komut Dosyası Düzenleyicisi'nde oluşturulan AppleScript uygulaması Menü Çubuğu uygulaması olarak desteklenmez. Menü çubuğunda Komut Dosyası menüsünü kullanmak istemiyorsanız, Cocoa-AppleScript kullanmanız veya Xcode'da bir uygulama oluşturmanız (veya üçüncü taraf başlatıcısı kullanmanız) gerekir.

İşte Swift kullanarak Xcode'da yapılan bir örnek uygulama: WeatherBar .

Bunu yapan bir uzun zamandır güvenilir bir uygulama FastScripts ve Komut Dosyaları menüsüne benzese de, ek işlevler sunar. Sınırsız klavye kısayollarının kilidini açmak için ücretsiz bir uygulama olarak çalıştırılabilir, en fazla 10 klavye kısayolu veya 9,95 ABD doları karşılığında yükseltilebilir.

Ücretsiz bir uygulama olarak FastScripts kullanıcısı olarak Red Sweater Software, LLC ile hiçbir bağlantım yok.


FastScripts, menü öğeleriniz için klavye kısayolları atamanıza izin vermesi çok hoş. Apple'ın "Komut Dosyası Düzenleyici menüsü", yıllar ve yıllar önce menü öğelerine kısayollar atamanıza izin vermeyi durdurdu,
Wayfaring Stranger

3

El yazısıyla tam olarak ne yapmak istediğine bağlı olarak, belki de bitbar amacınız için uygun olabilir.

Genel olarak bu uygulama, menü çubuğunda çeşitli komut dosyalarının çıktısını görüntülemenizi sağlar - birçok komut dosyası zaten tamamlanmıştır ancak kendi komutunuzu da yazabilirsiniz.

Ancak yürütmek için de kullanılabilir applescripts. Ben çalıştırmak için kullanıyorum applescripted olarak kaydedildi service küçük bir bash betiği ile çağırarak:

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

-2

Az kullanılan bir "Servisler" menüsü (uygulamanın adının altındaki menüde) vardır ve komut dosyalarını servisler olarak kaydedebilir ve bunları belirli bir uygulama için servisler menüsünde kullanabilirsiniz.

"Takılabilir" uygulamalar da vardır, bu uygulamalar uygulamanın kendi menü komutlarına komut dosyası eklemenizi sağlar. Ancak takılabilir uygulamalar nadir görülür.

Bunlardan herhangi biri aradığınızı uygun mu?


Hayır! Menü çubuğundan çalışan bir uygulamayı değil, bir hizmeti arıyorum. Speedtest uygulamanız var mı? Bunun gibi bir şey, uygulamanın kendisi de menü çubuğundadır, ondan başlatılmaz.
DonielF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.