Hatena::ブログ(Diary)

mooz deceives you

(about 'mooz) ; => "See http://mooz.github.com/index-ja.html"

 | 

March 15 (Mon), 2010

js2-mode.el をいくつかの新しい JavaScript の記法に対応させた

JavaScript の奇妙な記法

最近の JavaScript (Firefox 3.5 以降) では, 色々と奇妙な記法が可能となっている. 例えば, 次のようなもの.

let obj = {a: 10, b: 20};

let {a: a, b: b} = obj; // 分割代入の一種
let {a, b} = obj;       // 上の省略記法

let [a, b] = [1, 2]; といった分割代入をご存知の方は多いのではないかと思う. 上記の記法はそれの一種とされていて, オブジェクトから特定プロパティの値を持ってくるときに有用. コードゴルフをたしなむ方々や, 某邪悪なアドオンのプラグインを書かれている方々の間では, 空気のような存在となっているらしい.

自分はこの記法を数ヶ月ほど前に知り, それからずっとこの書き方に憧れては, とある理由の為に使うことができずもどかしい思いをしていた. その理由とは「愛用している Emacs 用拡張 Elisp の js2-mode.el が, この記法に対応していない」というもの. (くどい……)

js2-mode

js2-mode.el を知らない方々の為に一行で説明すると, 「js2-mode とは, Emacs Lisp で書かれた JavaScript のパーサを持ち, リアルタイムなシンタックスチェックが可能な素晴らしいメジャーモード」といったところだろうか. 何より素晴らしいのは, 通常ないがしろにされがちな「let, 分割代入, ジェネレータ, E4X」といったモダン JavaScript の機能をしっかりとサポートしてくれているところ. 現在 JavaScript を書く環境としては, 最上の一つだと僕は考えている.

しかし, その頼れる js2-mode も冒頭の記法には残念ながら対応していない. 実際にコードを書いてみると, 次のようにパーサがエラーを吐いてしまう.

f:id:mooz:20100315225609p:image

f:id:mooz:20100315225608p:image

修正した

数か月間悶々としてどうにも収まりがつかなくなったため, 一念発起し js2-mode のコードに手を加えてみることにした. 一万行を超える巨大なソースコードということもあり色々大変なところはあったが, 半日を費やした結果, 自分なりに満足のいくものができた.

SVN で落としたモノを修正したためパッチだと色々面倒かと考え GitHub の方へリポジトリを作成.

mooz/js2-mode - GitHub

本家にも一応パッチを送ってみるつもりではいるが, 最近 js2-mode の開発が停滞気味のようなので, こちらはこちらで勝手に続けていくかもしれない. まあどちらにせよ, そのままパッチが採用されることはないだろうと思われる.

修正後のスクリーンショット

修正後の js2-mode で冒頭の記法を試すと, エラー無く表示されていることが確認できる.

f:id:mooz:20100315225702p:image

f:id:mooz:20100315225701p:image

また, コードをいじっている最中に気づいた js2-mode のバグ (プロパティの値として式クロージャ記法を使うとパースエラーが生じる) も同時に修正しておいた.

f:id:mooz:20100315225738p:image

バグ報告など

バグ報告は Issues - mooz/js2-mode - GitHub の方へお願いします. アカウントを持っておられない方はこの日記のコメント欄にでも書き込んでやってください.

まとめ

はりきってエントリを書き始め, 途中 "Firefox アドオン系開発者" & "Emacs ユーザ" & "js2-mode ユーザ" に当てはまる人しか得をしないことに気づき, 最後にはしおれていた.

NaruhodiusNaruhodius 2010/03/17 16:16 すばらしいですね。
私も js2-mode.el 本家ではなく id:mooz さんの派生版を使わせていただこうと思います。

moozmooz 2010/03/17 19:21 >Naruhodius さん

おお, ありがたいです. 何か気づいたことなどありましたらお気軽に報告くださいませ.

 |