AppleScript で diff

書いてはほったらかし、書いてはほったらかし...そんな使い勝手のいい AppleScript ですが、ハードディスクを整理していたら、でるわでるわコンパイル済みスクリプトファイル...。要不要をチェックしながら整理しているのですが、同じようなスクリプトのどこが違うのかを確認するのはいちいち面倒だな...と思っていたのです。ファイルを開いてみないと分からないし、Script Editor では行番号すら表示してくれない。で、思いつきました。FileMerge があるじゃないかと。

そのままでは AppleScript のスクリプトファイルを FileMerge で比較することはできませんが、FileMerge は Filter の設定でファイルにフィルターをかけることができるのでした。そして、Mac OS X 10.5 以降ならスクリプトファイルのコードを表示してくれる osadecompile があるのでした。

osadecompile はその名の通り、AppleScript(等の)コンパイルされたスクリプトファイルから中の文字列を表示してくれるツール。スクリプトファイルが「実行専用」で保存されていない限り「コンパイル済みスクリプト(拡張子: scpt)」、「アプリケーション(拡張子: app)」、「スクリプトバンドル(拡張子: scptd)」、「アプリケーションバンドル(拡張子: app)」、「テキスト(拡張子: applescirpt)」のそれぞれのコード文字列を表示してくれる。

使い方は至って簡単で、ターミナルなどで

$ osadecompile ~/Desktop/Classic.app

とするだけ。スクリプトファイルを引数にとり、オプションなどは一切なし。これを FileMerge の「環境設定(英語しかリソースがないので Preferences... となっている)」にある「Filters」で以下のように設定。

/usr/bin/osadecompile $(FILE)

「Extension」は「scpt」、または「applescript」、「Display」は「Filtered」、「Apply」は「No」で。

FileMearge 環境設定

これでスクリプトファイルの比較ができるや...と思いきや、このままでは日本語の混じったスクリプトファイルだと表示されなかったりする...(まぁ、プログラムファイルに日本語などを混ぜてはいけないってことなんだろうけど、日本語もごちゃ混ぜで記述できる気楽さが AppleScript のいいところなんだよな)。また、スクリプトアプリケーションやスクリプトバンドルなどもそのままではうまく表示できない。フィルタースクリプトを書いて処理すればいいんだろうけど...挫折してしまいました。

誰か、書いてくれないかな。

2 件のコメント :

  1. AS Editorでテキストに書き出すとUTF-16で保存されるので、iconvでUTF16(UTF16-BE)からUTF-8にコンバートして、改行コードもLFからCRに置換してFileMergeにかけると問題なくdiff表示できますよ。

    返信削除
  2. 情報ありがとうございます。早速、試してみます。

    返信削除