path to me の話

Contents

最新情報 2009-11-16

Mac OS X 10.3 で追加された OSA の API、OSADoScriptFile、OSALoadFile などを使えば、アプリケーション側で特別な配慮をしなくとも、自動的に path to me はそのスクリプトファイルへの参照を返すようになるそうです。

たぶん、これらの API を使っているおかげか、Leopard では、mi および Quicksilver は path to me でスクリプトファイルへの参照が返ってきます。また、Mac OS X 10.5 から、スクリプトエディタでも path to me はスクリプトファイルへの参照を返します。

Introduction

AppleScript で、スクリプトから自分自身へのファイル参照を取得したいことが時々ある。一番わかりやすいのが、バンドル形式のアプレット/ドロップレット/スクリプトファイルの中にリソース(何らかのデータやシェルスクリプトなど?)を収めておいて、それらにアクセスしたいときだ。

そんな時に使うのが path to me というコマンドだ。このコマンドはほとんどの場合、スクリプトを実行しているアプリケーションの参照を返す。アプレットやドロップレットの場合はこれで問題ないよね。スクリプトファイルの場合はどうだろう?スクリプトファイルは必ず何らかのアプリケーションによって実行されるけど、そんなときでもスクリプトファイルへの参照を取得したい!!これができるかどうかは、スクリプトファイルを実行するアプリケーション側で配慮してくれているかどうかに依存するんだ。残念ながら、スクリプトファイルの場合、確実に自分自身へのファイル参照を取得する手段はない

僕の知る限り、スクリプトファイルからの path to me でスクリプトファイルへの参照を教えてくれるアプリケーションは以下の物だけだ(他にあったら教えてください)。

僕としては、スクリプトエディタと mi と Quicksilver がこのリストにないのが非常に寂しい。

スクリプトを実行するアプリケーションの開発者には、ぜひ path to me へのご配慮をお願いしたい(たぶん、このイベントをスクリプティング機能追加に渡さないで自分で処理することになるのではないだろうか?)。

path to me のデバッグ

path to me で自分自身への参照が得られることを期待するアプレット/ドロップレットを作っているとします。ここで、困ってしまうのはスクリプトエディタは path to me でスクリプトエディタへの参照を返してしまうことです。スクリプトへのファイル参照が得られないんです。

いちばん、おすすめなのは Script Debugger を購入すること。Script Debugger なら、path to me で、ちゃんとスクリプトへの参照が得られます。他にもいろいろ

という機能があるので、買っても損しないと思います。とくに、複雑なアプリケーションのスクリプティングでは、Explorer 機能があるとなしでは理解と効率が全然違います。

意地でも、スクリプトエディタにこだわりたい人は、path to コマンドを override してしまうのもありかと思います。

on path to a_target
set a_path to continue path to a_target
if a_target is me then
if bundle identifier of (info for of a_path) starts with "com.apple.ScriptEditor" then
tell application "Script Editor"
set a_path to path of document 1
end tell
if a_path is not missing value then
set a_path to POSIX file a_path as alias
end if
end if
end if
return a_path
end path to

path to me

上の path to ハンドラをスクリプトにコピー&ペーストしておくと、path to me をスクリプトエディタで実行したときは、スクリプトエディタの最前面のファイル参照を返し、それ以外は通常通りに振る舞います。

でも、この path to ハンドラを override するという手法は副作用があります。スクリプトで override した path to はスクリプティング機能追加で定義されているそれと完全な互換性がないです。スクリプティング機能追加の path to は 「as」などのラベルで、いくつものオプショナルパラメータがいくつか使えますが、それらが使えなくなっちゃいます。

override などしなくても、それ専用のハンドラを用意した方がいいかもしれません。