Ich kenne das Menü des Skripteditors. Das ist nicht das, wonach ich suche.
Gibt es eine Möglichkeit, ein Applescript über die Menüleiste auszuführen? Ich kann es als Datei speichern und über das Menü des Skripteditors ausführen, und ich kann es als Anwendung speichern und in mein Dock stecken. Gibt es ein Dateiformat, das es ermöglicht, es über die Menüleiste auszuführen, wie es viele Anwendungen tun? Oder eine Möglichkeit, den Code zu bearbeiten, der dasselbe tut?
Cocoa-AppleScript als Skript oder AppleScript-Anwendung, die im Skripteditor erstellt wurde, unterstützt die Menüleisten-App. Dieses Skript läuft auf macOS 10.12 (möglicherweise läuft es auf 10.10.x, 10.11.x). Dieses Skript kann als Anwendung gespeichert werden.
--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:
Ich habe zuvor den von Piyomaru geposteten Originalcode bis zu dem Punkt bearbeitet, an dem er kompiliert werden kann, und wollte einige zusätzliche Informationen hinzufügen, um den Beispielcode für alle, die AppleScript relativ neu kennen, nützlicher zu machen.
Wenn der Beispielcode derzeit als Anwendung gespeichert ist , hat er keinen Code zum Beenden der Anwendung , er entfernt nur das Menüleistenobjekt. Fügen Sie also im Handler des Skripts Folgendes zum Zweig der Anweisung nach dem vorhandenen Code hinzu :actionHandler
else
if
if (name of current application) is not "Script Editor" then
tell current application to quit
end if
Es ist so codiert, dass es nicht versucht, den Skripteditor zu schließen, wenn es vom Skripteditor aus ausgeführt wird. Sie können es ohne den if
Anweisungsblock verwenden und nur verwenden, tell current application to quit
wenn Sie es nicht im Skripteditor ausführen.
Da dieses Skript Cocoa-AppleScript verwendet, muss es nach der Ausführung im Skripteditor kurz vor dem Speichern erneut kompiliert werden, um die vom Cocoa-Applescript- Code erstellten C- und Objective-C-Zeiger zu leeren , da Zeiger nicht gespeichert werden können das Skript. Klicken Sie einfach auf das Hammer-Symbol in der Symbolleiste oder: Skripteditor > Skript > Kompilieren ⌘K
Darüber hinaus müssen Sie beim Speichern als Anwendung das Kontrollkästchen Nach Ausführungshandler geöffnet bleiben beim Speichern aktivieren, und standardmäßig wird die Dock-Kachel der App beim Ausführen im Dock angezeigt. Da dies ein unerwünschtes Verhalten für eine Menüleisten-App sein kann, verwenden Sie den folgenden Befehl im Terminal, um den erforderlichen Schlüssel zur Info.plist - Datei der App hinzuzufügen, damit er nicht im Dock angezeigt wird.
defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
name_of_app
Sie ihn durch den tatsächlichen Namen, unter dem Sie ihn gespeichert haben, und ändern Sie gegebenenfalls den Pfad, wenn er nicht in /Applications
.Im actionHandler
Handler des ursprünglichen Beispielcodes wird nur ein Dialogfeld mit der Nummer des Menüelements angezeigt, auf das geklickt wurde, was für Beispielcode sicherlich in Ordnung ist . Ich möchte jedoch ein anderes Beispiel zeigen, auf dessen Grundlage separater Code ausgeführt wird welcher Menüpunkt angeklickt wurde. Der folgende Beispielcode könnte den gesamten Handler im ursprünglichen Skript ersetzen :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:
Dies könnte jetzt anders geschrieben werden, dh "Beenden" als else
oder else if
ganz unten, aber ich habe es so gemacht, weil ich möchte, dass alle anderen Menübefehle eine else if
Auswahl sind, obwohl logischerweise jeder andere gegebene Menübefehl eher angeklickt wird dann "beenden". Ich denke, es ist einfacher, den Code des Menübefehls hinzuzufügen / zu bearbeiten / zu entfernen, wenn er auf diese Weise geschrieben wird. Es ist nur eine persönliche Vorliebe, also tun Sie es so, wie Sie es für richtig halten.
Eine Diskussionsnotiz aus dem AppleScript Language Guide:
Eine if -Anweisung kann beliebig viele else if -Klauseln enthalten; AppleScript sucht nach dem ersten booleschen Ausdruck, der in einer if- oder else if - Klausel enthalten ist , die wahr ist , führt die in seinem Block enthaltenen Anweisungen aus (die Anweisungen zwischen einer else if- und der folgenden else if- oder else - Klausel) und beendet dann die if - Anweisung.
Eine if -Anweisung kann auch eine abschließende else - Klausel enthalten. Die Anweisungen in seinem Block werden ausgeführt, wenn kein anderer Test in der if - Anweisung bestanden wird.
Für den größten Teil des ursprünglichen Beispielcodes sollten Sie nur zwei Codezeilen im init
Handler ändern müssen :
set aList to {"Piyomaru", "Software", "", "Takaaki", "Naganoya", "", "Quit"}
""
dient als Trennzeichen.Für ein anderes Symbol:
aStatusItem's setTitle:"🚗"
Hoffentlich ist es offensichtlich, dass der if
Anweisungsblock im Handler dem im actionHandler
Handler entspricht , also stimmen Sie die Namen im im Handler mit den Namen im im Handler ab .aList
init
aTitle is equal to
actionHandler
aList
init
Der Rest des Codes sollte nicht geändert werden müssen, kann es aber bei Bedarf oder Wunsch sicherlich.
Normales AppleScript als Skript oder im Skripteditor erstellte AppleScript-Anwendung wird nicht als Menüleisten-App unterstützt. Sie müssten Cocoa-AppleScript verwenden oder eine App in Xcode erstellen (oder einen Launcher eines Drittanbieters verwenden), wenn Sie das Skriptmenü in der Menüleiste nicht verwenden möchten.
Hier ist eine Beispiel-App, die in Xcode mit Swift erstellt wurde: WeatherBar .
Eine seit langem vertrauenswürdige App, die dies tut, ist FastScripts , und obwohl es wie das Skriptmenü aussieht, bietet es zusätzliche Funktionen. Es kann als kostenlose App mit bis zu 10 Tastenkombinationen ausgeführt oder für 9,95 $ aktualisiert werden, um unbegrenzte Tastenkombinationen freizuschalten.
Ich habe keine Verbindung zu Red Sweater Software, LLC, außer als Benutzer von FastScripts als kostenlose App.
Je nachdem, was genau Sie mit Ihrem Apple-Skript machen möchten, könnte vielleicht xbar / swiftbar für Ihren Zweck geeignet sein.
Im Allgemeinen können Sie mit diesen Anwendungen die Ausgabe einer Vielzahl von Skripten in der Menüleiste anzeigen - viele Skripte sind bereits verfügbar, aber Sie können auch Ihre eigenen schreiben.
Sie können auch zur Ausführung verwendet werden applescripts
. applescript
Ich verwende sie zum Beispiel, um ein gespeichertes als auszuführen , service
indem ich es über ein kleines Bash-Skript aufrufe:
#!/bin/bash
echo "blub"
echo "---"
echo "1 | bash=/Users/username/Library/Services/Space_1 terminal=false"
Es gibt ein wenig genutztes "Dienste"-Menü (im Menü unter dem Namen der Anwendung) und Sie können Skripte als Dienste speichern und sie im Dienste-Menü entweder für eine bestimmte Anwendung verfügbar machen.
Es gibt auch das Konzept von Anwendungen, die "anfügbar" sind. Diese Anwendungen ermöglichen es Ihnen, Skripts zu den eigenen Menübefehlen der Anwendung hinzuzufügen. Aber Anwendungen, die anschließbar sind, scheinen selten zu sein.
Passt etwas davon zu dem, was Sie suchen?
Benutzer3439894
Gilby
Piyomaru
Piyomaru