Steve YeggeのEmacs javascriptモード「js2」をインストールする
javascript、emacsそしてコンパイラマニアの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モードが入ったので、次はMozillaとemacsのインテグレーションをやってみたい。
参考
- http://www.emacswiki.org/emacs/JavaScriptMode
- http://code.google.com/p/js2-mode/
- http://steve-yegge.blogspot.com/2007/02/next-big-language.html
JavaScriptがサーバにおいても次のデカい言語になると予想したポスト。Nodes.jsなどによりその予想は現実化している。