マウスの右クリックで表示されるコンテクストメニューをカスタマイズするツール、「Service Station」(Version 2020.9 (23))を購入して、macOS 12.2+M1 Mac miniの環境で試してみました。
同ツールはMac App Storeで販売されており、フリーでダウンロードしたのち、App内購入(1,840円)で購入できます。
OS標準のScript MenuにFinder上で選択中のファイルを対象としたAppleScriptを大量に仕込んで使っていますが、やはりコンテクストメニューから呼び出せたほうが便利なので、試してみることにしました。
Mac App Storeからダウンロードした状態(フリーで使えるお試し版)ではAppleScriptの起動はできないため、App内購入が必要です。
サポートページ(Github)、Twitterアカウントなどが公開されています。
この手のツールは、AppleScriptに対する知識が少ないデベロッパーが開発したものが多く、実際に使ってみると不満を覚える確率がきわめて高いジャンルです。これまでにも、実際に試すと「使い物にならない」と判断したツールがほとんどであるため、十分な検証が必要でしょう。
# デフォルト状態でAppleScriptの実行を指定できないのは、試用版の制限なのでご注意ください。
Service StationでAppleScript書類をコンテクストメニューから処理してみよう
本ツールのUser Interfaceはきわめてシンプルです。「Rules」でどのようにファイルを特定し、「Menu Items」でオープンするアプリケーションやAppleScriptを指定します。
初期状態では、「Folders」「Images」「Text」の3つのRulesが設定されています。ここに、AppleScript書類を処理するRulesを追加してみましょう。
どのような方法でAppleScript書類を特定できるのか、Rulesのポップアップを調べてみると……
「Kind -> Script」で「AppleScript」を指定するとよさそうです。Rulesを指定したあとで、「Menu Items」にサンプルScriptを指定してみましょう。特定のハンドラ宣言を記述したAppleScriptをここに指定できるようになっています(フラットなScriptだけであってバンドル形式は予想どおり実行できません)。
▲実行Scriptとしてバンドル形式のAppleScript書類(.scptd)を認識しないので、バンドル内に実行バイナリやAppleScriptライブラリを突っ込むのは無理
Service Stationで実行指定するAppleScriptは、~/Library/Application Scripts/com.knurling.ServiceStation.Attendant フォルダに入れる必要があります。
Finder上で試してみると…..AppleScript書類(.scpt、.scptd)を認識しません(ーー;;;
▲この設定にしたくなるが、この指定方法だとAppleScript書類(.scptおよび.scptd)を認識しない。罠なのでこの設定はしてはいけない。作者は.applescriptのテキスト形式のAppleScriptしか試していないもよう
この作者は「AppleScript書類」をテキスト形式(.applescript)でしかチェックしていないようです。なので、さきほどの「Rules」で提示された「Kind -> Script is AppleScript」は罠(Trap)なので選択してはいけません。
拡張子で指定しても応答しません(scpt、scptd)。RulesでUTIを指定できるようなので、
フラットなScript書類「com.apple.applescript.script」、バンドルScript書類「com.apple.applescript.script-bundle」、Script DebuggerのバンドルScript書類「com.latenightsw.osa.bundle」をAny条件で(どれかがヒットしたら該当したものとみなす)登録してみました。
はい。今度は問題なく、Finder上でAppleScript書類を選択した状態で表示させた(マウスの右クリック)コンテクストメニューでサンプルAppleScript(処理用のハンドラを記載しただけ)がメニューに表示され、添付のサンプルScript(「System Setup」タブの「Sample Scripts」ボタンを押すと表示される)を実行できました。
Service Station経由で実行したAppleScript(サンプルScript)は以下のような内容です。
AppleScript名:AppleScript.scpt |
on serviceStationDidSelect(targetedURL, selectedItemURLs, menuKind) display dialog "targetedURL: " & targetedURL & " " & "selectedItemURLs:" & selectedItemURLs & " " & "menuKind:" & menuKind end serviceStationDidSelect |
ランタイム環境はosascript
お約束で、Service StationのAppleScriptランタイム環境名は知っておかなければいけないので、
AppleScript名:Runtime名を表示.scpt |
use AppleScript version "2.4" use scripting additions use framework "Foundation" on serviceStationDidSelect(targetedURL, selectedItemURLs, menuKind) set procInfo to current application’s NSProcessInfo’s processInfo() set aName to procInfo’s processName() as string display dialog aName end serviceStationDidSelect |
こんなAppleScriptを書いて実験してみると….
のように、「osascript」を呼び出して実装していることがわかりました。
NSAlertダイアログを表示するも、最前面に表示されず
ランタイム環境が「osascript」だと、自前でアラートダイアログを表示させたときに「最前面に表示されない」といった問題が生じる可能性があります(osascriptでお手軽実装するの勘弁してほしい。Script側に苦労を押し付けないでほしい)。あとは、GUIなしプロセスで実行するようなので、GUI Scriptingの認証を通せるか不明です。
また、どこぞのネット上のサーバー上のREST APIにアクセスしようとしてもセキュリティ上の制約で「アクセスできない」可能性もあります(実行プロセス側でネット接続の許可をもらっていないと無理)。今後も検証が必要です。
現時点でみつけた「おや?」という仕様は、Rulesでルールを作った状態で複数のAppleScript書類を選択すると、コンテクストメニューにService Stationの項目が出てこないという点です。画像の複数選択には反応するようですが、自前で設定したRulesだと複数ファイル選択時に応答しません。
# これは、追試によって設定アプリケーションを終了させるまで設定が反映されない部分があることが判明
また、Service StationのRulesから呼び出すAppleScriptのハンドラで、受け渡されるのはHFS path stringであってURLではありませんし(fURLなのか?)、複数のURLを受信できるような表記がありながらも、本バージョンでは1つのURL(正確にはHFS path)しか受け渡されません。
# 追試の結果、複数のパス(fURL)が受け渡されていることが判明
本ツールの開発者はAppleScriptを日常的に書いていない気配が濃厚ですが、それでも修正されれば我慢できないというほどでもないでしょう。
▲予想どおり、NSAlertのダイアログを表示してもランタイムがosascriptなので最前面に表示されなかった(GUIなしの不可視プロセスからosascriptを実行した際の挙動)。CDN上のJavaScriptライブラリの呼び出しは行えた
パラメータの型チェックを試してみました。
AppleScript名:パラメータの型チェック.scpt |
on serviceStationDidSelect(targetedURL, selectedItemURLs, menuKind) set c1 to (class of targetedURL) as string set c2 to (class of selectedItemURLs) as string set c3 to (class of menuKind) as string display dialog "targetedURL: " & c1 & " " & "selectedItemURLs:" & c2 & " " & "menuKind:" & c3 end serviceStationDidSelect |
サンプルScriptの記述がよくないせいで勘違いしてしまったようです。targetedURLはfURL、selectedItemURLsはList、menuKindはintegerで返ってきていました。
ホームディレクトリ内のAppleScriptライブラリを呼び出す
コンテクストメニューから呼び出すAppleScript内で、ホームディレクトリ以下のAppleScriptライブラリを呼び出すことができるか確認してみました。
結論:呼べる
AppleScript名:AppleScript v2_with_Library.scpt |
use AppleScript version "2.4" use scripting additions use radioLib : script "displayTextView" on serviceStationDidSelect(targetedURL as «class furl», selectedItemURLs as list, menuKind as integer) set aStr to do shell script "cal 2022" display text view aStr main message "Main Message" sub message "Sub Message" with properties {font name:"Courier", size:13, width:600, height:300} end serviceStationDidSelect |