Steve YeggeのEmacs javascriptモード「js2」をインストールする

javascriptemacsそしてコンパイラマニアのSteve Yeggeが製作したモードがこれだ
http://code.google.com/p/js2-mode/
これがjs2-modeを紹介するブログ:
http://steve-yegge.blogspot.com/2008/03/js2-mode-new-javascript-mode-for-emacs.html

emacsの言語モードといったら大抵、適当なパーサをelispで実装したものが普通だ。perlのようにパースが難しい言語だと、emacsが混乱することもよくある。しかし、js2は Mozilla Rhino(http://www.mozilla.org/rhino/) のパーサのポートなのだ。つまり本物のjavascriptパーサってことだ。さすがコンパイラオタク。そのサイズは1万2千loc! ブログが長いので有名なYeggeだがemacs modeも長い。

ブログによるとその機能は (これは古いので、最新の情報はcode.google.comを参照)

  • M-x customizeでカスタマイズできる
  • 3段階のシンタックスハイライト
  • font-lockを使わない独自のハイライティング
  • 「非同期」パーシング。ユーザコマンドがなくてemacsが暇なときにパースすることによって体感的速さを意地。

(これに関しての初代javasscriptの開発者Brenden Eichとのやりとりが面白い)

  • ちゃんと機能するインデント (インデントの実装って大変なんだな…)
  • code folding: 関数やコメントを隠す機能

Cc-Coで今いる関数の定義を一行に閉じたり開いたりできる。
menubar-->JavaScript-->Show/Collapse Elementなど。

  • シンタックスエラーをハイライトしてくれる
  • Strict warnings: JavaScriptで定義されているstrict-modeの警告を実装。

例えばリストの最後のエレメントにカンマがついているとオレンジの下線がでる。

  • jsdocのハイライト

もっとあるようだが、ここまで書いてトイレに行ってしまった。最新の機能はWiki (http://code.google.com/p/js2-mode/) でチェックをしてほしいと言いのこして、、

前からこのモードを使ってみたいと思っていたが、JavaScriptを使うプロジェクトを始めたのでインストールしてみた。

コンパイルエラー…

$ wget http://js2-mode.googlecode.com/files/js2-20090723b.el
去年の夏からいじっていないようだけど、ちょうどこのときにRSIで手首を痛めたんだろう。これをdiredからBでバイトコンパイルしてみると、、エラーがでた。確かこのような


js2.el:7037:24:Error: Variable binding depth exceeds max-specpdl-size
(何故か今はエラーが再現できない)

バッチモードでコンパイル

ここにバッチモードでコンパイルすると通ると書いてある


$ w3m -dump http://code.google.com/p/js2-mode/issues/detail?id=68 | grep -A 10 ' gopal418, Sep 19, 2008'
$ emacs --batch --eval '(byte-compile-file "js2-20090723b.el")'
....
Wrote /home/tengu/emacs/javascript-modes/js2-20090723b.elc
見事に成功。

とりあえずロードしてみる


load-file js2-20090723b.elc
M-x js2-mode
大丈夫そうだ。

インストール


cp js2-20090723b.el /usr/local/share/emacs/23.2/site-lisp/js2-mode.el
cp js2-20090723b.elc /usr/local/share/emacs/23.2/site-lisp/js2-mode.elc

.emacsでの設定


;; steve yegge's javascript mode
(autoload 'js2-mode "js2-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))

第一印象


Yeggeが苦労しただけあってindentが上手くいっている。JavaScriptはC系シンタックスを装っているもの、実際のコーディングスタイルは「標準言語」の中では一番LISPに近いと思う。closureとか使いまくって。なので、C系言語を対象としたCCモードなどではどうも、インデントが上手くいかなかった。でもjs2-modeだとバッチリだ。あとjqueryの実装にみられるような変な関数定義スタイルでも関数の頭や尻にちゃんと移動できる。( js2-[beginning|end]-of-defun ) これが標準キーバインディング(Esc C-e, Esc C-a)になっていないが。

これで使えるJavaScriptモードが入ったので、次はMozillaemacsのインテグレーションをやってみたい。

参考

JavaScriptがサーバにおいても次のデカい言語になると予想したポスト。Nodes.jsなどによりその予想は現実化している。

emacs使いへのアドバイス。これ以外にも面白いemacsに関するポストがいくつかある。

プログラマコンパイラを知れと説いている。js2はこれを実践した成果と言える。