EmacsからnodeやブラウザでCoffeeScriptを動かす

前に書いたJavaScriptの開発環境を整えるついでにCoffeeScriptの環境が整います。
EmacsでJavaScriptの環境を整えたい - はなちん C-x C-c

swank-jsの導入

ivan4thさんのswank-jsを使うとEmacsからNodeやブラウザにつないでJavaScriptを実行できます。
JavaScriptならChromeの開発者ツールやFirebugでも出来ますが、やはりEmacs上で出来ると幸せです。(そのまま保存出来るし)
僕はswank-jsにCoffeeScript用の機能をいくつか付け加えました。
GitHubに置いてあるので、そこから導入します。
GitHub - hanachin/swank-js: Swank backend for Node.JS and in-browser JavaScript

swank-js導入手順

ほとんど深町さんのこの記事と一緒です。
http://e-arrows.sakura.ne.jp/2011/06/connect-to-nodejs-and-chrome-from-emacs.html
違うところだけ、説明します。

0.swank-jsのダウンロード

CoffeeScript用に改造してある僕のリポジトリから落とします。

% git clone git@github.com:hanachin/swank-js.git
1.nodeをインストールします

自分はここを参考にしました。
http://nodejyuku.node-ninja.com/slides/nodeintro1/#handson-0-1

3.SLIMEをインストール

僕の環境だと最新のSLIMEだとswank-jsがうまく動かなかったので、LispBox同梱の物を使いました。
Lispbox
中に入っているslimeのフォルダを、Emacsのロードパスの通っている場所へ置きます。
自分の場合だと~/.emacs.d/elisp/あたりに入れてます。

5.emacsに設定を追記

もとの記事のjs2-mode-hookに加えて、coffee-mode-hookの設定を.emacsに追記します。

(add-hook 'coffee-mode-hook
          (lambda ()
            (slime-js-minor-mode 1)))

EmacsからCoffeeScriptを使う

swank-jsのディレクトリで以下のコマンドを実行し、swank-jsのサーバーを立てます。

% node swank

EmacsでM-x slime-connect、接続。(ここでslimeとswank-jsのバージョンが違う等のメッセージが出るが気にしない)
ここまではJavaScriptと同じです。

slime-repl JSのバッファーで,select-remoteと入力して、CoffeeScript/directを選びます。
あとはJavaScriptと同じ感覚でCoffeeScriptを入力して実行出来ます。とっても簡単ですね。

EmacsからブラウザのREPLにアクセスしCoffeeScriptを使う

次のブックマークレットを、CoffeeScript使ってattachしたいページで実行します。
Attach Swank Coffee
後はslime-reple JSの画面で,select-remoteでCoffeeScript Browserと書いてるやつを選べばおk

このように、Emacsで書いたCoffeeScriptをブラウザで実行できます。

また、coffee-modeで範囲を選択して、C-c C-rで実行することもできます。

まとめ

  • 最初はslime-js.elの方をいじって、elisp側でCoffeeScript->JavaScriptの変換かけようとしていたが面倒だった
  • swank-handlerのRemoteを継承するクラスを作ってevaluateメソッドをオーバーライドし、そこで実行前に変換をかければよい
  • そのクラスをswank.jsの中で使うようにする
  • 別のaltJSJavaScriptコンパイルされる言語(Cocoなど)をEmacsから叩きたいときも同じ感じでいけるかも。

という感じ。
CoffeeScriptの問題として、コンパイル後のJavaScriptコードを実行中にエラーがおき、エラー行が表示されても、元々のCoffeeScriptの何行目に対応するのか分からないといったところがあります。
これについてはこちらのスレッドで意見がかわされてるようです。
line number mapping for debug · Issue #558 · jashkenas/coffeescript · GitHub
まぁ僕はとりあえずCoffeeScriptEmacsから実行できる環境が整ったので満足です。
Emacs使いでCoffeeScript使いで興味を持ってくださった方は是非試されてみてください。
フィードバックは[twitter:@hanachin_]まで。