js2-mode

Carbon Emacsに最初から入っているJavaScriptのモードがいろいろ酷かったので,評判の良さそうなjs2-modeを入れてみた.
インデントや色付けも正確だし,リアルタイムに警告/エラーを表示してくれる.ただ.{を入れると改行と}を入れてくれたり,(や[でも閉じ括弧を入れてくれたりとなかなかのお節介だ.

obj = {};
// { の後にundoするとうまくいく

閉じ括弧の上で閉じ括弧入力してもカーソル位置が動くだけだし.あと行内の前後に"があるときに"を入れると,手前に\が挿入される.

"hoge\" + a + "fuga"

ちげーよ!後ろに"が偶数個あるときだけにしてくれ.
何故俺がこれらの機能をお節介と言うのかというと,sequentialに書く時はいいけど,そうでないときはうまくいかないからだ.ここら辺の機能は消してしまおうかとも思ったが,慣れの問題か,何か解決法があってほしいのでしばらく様子見る.(閉じ括弧入れないと構文エラーがうるさいとかありそうだし.)


いくつかの不満もある.その一部は設定で解消した.js2.elのソースが読みやすくて助かる.

(add-hook 'js2-mode-hook
          '(lambda ()
             (set-face-foreground 'js2-function-param-face (face-foreground font-lock-variable-name-face))
             (setq js2-basic-offset 4)
             (setq js2-bounce-indent-flag nil)
             (setq js2-strict-cond-assign-warning nil)))
  1. 仮引数の色が,黒背景だと見にくい(解決)
  2. indent-for-tab-commandが行ったり来たりする(解決)
  3. indent-for-tab-commandでインデント済みのとき,カーソルがインデントの後ろまで移動してくれない
  4. 元々自分で設定していたfont-lockが効かない
  5. 警告Undeclared variableのせいで,C-sしたとき等にミニバッファが見えない.

3はM-m使えって話なんだろうけど,C-a tabで慣れちゃってるからなぁ.この機会にM-m覚えた方がいいかもしれない.js2-indent-hookでなんとかできそうな気もする.(5/19追記:できないっぽい.js2-indent-hookはインデントの仕方をカスタマイズする…のか?よくわからない)
4は全角スペースと行末のスペースを可視化してたんだけど,見えなくなってしまった.設定でなんとかなりそう.
5のオレンジの色付けはありがたいんだけど,警告メッセージにミニバッファが乗っ取られるのもどうなんだ.トップレベルで事前にvarしろってことなんだろうけど,ブックマークレットで挙動変わったりしないかな…そもそも生のグローバル変数を使いまくってるのが間違いか.
関数名/変数名の補完はないのかな?