Major mode for AppleScript


ちょっとした編集などの度にいちいち AppleScript Editor を開くのも嫌なので作ってみました.既に applescript-mode.el というのもあるんですがそれとは別物です.

追記(同日)

はてブで指摘があったので,早速,as- から apples- に名称変更しました.記事内容やリンクも更新されています.

リポジトリ

apples-mode という名前でやってます.

# URL: http://github.com/tequilasunset/apples-mode

$ git clone git://github.com/tequilasunset/apples-mode.git

動作環境

テストは GNU Emacs 23.2.1 on Mac OS X 10.6.6 で行っています.

機能

  • キーワードの色付け
  • インデント
  • AppleScript の実行と結果の表示
  • エラー箇所のハイライト
  • 機能の殆どはメニューからアクセス可能

というメジャーモードっぽい機能が揃っています.下の画像はエラーを出してみたところです.flymake のように常時実行はできませんが,エラー箇所をハイライトしてその位置にカーソルを飛ばします.

インストール

モノをロードパスに置いて

(autoload 'apples-mode "apples-mode" "Happy AppleScripting!" t)
(autoload 'apples-open-scratch "apples-mode" "Open scratch buffer for AppleScript." t)
(add-to-list 'auto-mode-alist '("\\.\\(applescri\\|sc\\)pt\\'" . apples-mode))

あるいは,

(require 'apples-mode)
(add-to-list 'auto-mode-alist '("\\.\\(applescri\\|sc\\)pt\\'" . apples-mode))

とします.バイトコンパイル推奨ですが,しょうもない warnings は無視してください.apples-mode.el と同じ階層にある apples-mode というディレクトリには yasnippet 向けのスニペットが入っています.

お試し用のコードがないよって人は AppleScript Editor の Help メニューから探ってみてください.

コンパイル済みのコードはそのままでは編集できないので,コマンド apples-decompile を使ってデコンパイルする必要があります.あるいは,コマンド apples-open-scratch を使って一からコードを書いてみてください.実行用のコマンドは幾つかありますが,apples-run-region/buffer が使いやすいと思います.

既知のバグ

初めて書いたメジャーモードなのでかなりバギーだと思ってください.

display dialog コマンドがこけることがある.

これが結構致命的なんですが,display dialog コマンドはそのままでは実行できないのでこちらを参考に一時ファイルをかませて実行しています.これで取り敢えず実行出来るようになるんですが,それでも時々下のようなエラーが出ます(apples-mode ではエラーではなく返り値として表示されます).日本語環境だと日本語で表示されるかもしれません.

A identifier can't go after this “"”.
A property can’t go after this “\"”.

一時ファイルのコーディングに問題があるような気がしますが(AppleScript Editor に直接コードをコピペするとうまくいくけど,osascript や do-applescript から一時ファイルを指定して実行すると躓くので),解決策を模索中といったところです(実際にはスーパーハッカーの登場を期待しているわけですが).

whitespace.el が動作していないかもしれない.

そもそも僕の whitespace.el の設定が正しいのかも不明ですが,ハイライトが上手くなされていないようです.ただし,これは elisp のみ(シンタックスクラスかな?)の問題なのですぐに修正されると思います.

その他にも大小様々なバグがあると思いますが,Emacs から AppleScript を実行してみるのも結構楽しいので是非トライしてみてください.

更新

2011/01/20

現在,v0.0.2 ですが,display dialog に関するバグは既に修正されています.
まだ,細かいバグも残っていますが,ひと通りの機能は揃ったと思います.

2011/01/17

whitespace.el に関するバグを修正しました.hook に問題があったようです.
まず,僕の使っている whitespace.el (v12.1) にはバグがあるようで,例えば,

(global-whitespace-mode 1)

としていても,メジャーモードを変更するとハイライトが消えてしまいます.なので init file に次のような修正を加えます.

;; For the whitespace.el v12.1
(defun global-whitespace-mode-enable-in-buffers ()
  ;; `global-*-mode-enable-in-buffers' is generally created by the macro
  ;; `define-global-minor-mode'.
  ;; Also added to the hook `after-change-major-mode-hook'.
  (unless whitespace-mode
    (whitespace-turn-on-if-enabled)
    ;; Include the scratch buffer
    (when (string= (buffer-name) "*scratch*")
      (whitespace-turn-on))))
(add-hook 'after-change-major-mode-hook
          'global-whitespace-mode-enable-in-buffers)

で,apples-mode を最新のやつに更新すると,適切にハイライトしてくれるようになります.
余談ですが,メジャーモードを定義するときには run-hooks ではなくて,run-mode-hooks を使わないと after-change-major-mode-hook が実行されないようです.古いメジャーモード(js2-mode とか)では run-hooks のままになっていて,メジャーモードの変更に global-minor-mode が追従してくれないかもしれません.