js2-mode の設定をちょっといじった

Emacs で JavaScript を書くを参考にして少し設定を追加した。

;;; js2-mode
;; エラーの判定処理が気になる
(autoload 'js2-mode "js2" nil t)
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))
(add-hook 'js2-mode-hook
          '(lambda ()
             (setq js2-bounce-indent-flag nil)
             (define-key js2-mode-map "\C-m" 'newline-and-indent)
             (define-key js2-mode-map "\C-i" 'indent-and-back-to-indentation)
             ))
(defun indent-and-back-to-indentation ()
  (interactive)
  (indent-for-tab-command)
  (let ((point-of-indentation
         (save-excursion
           (back-to-indentation)
           (point))))
    (skip-chars-forward "\s " point-of-indentation)))


追加した設定についてメモしておく。

(setq js2-bounce-indent-flag nil)

js2-mode はデフォルトの設定だと C-i(TAB) を入力するたびにインデントの位置が変わるんだけど
他のほとんどのメジャーモードはそんな挙動はしないし
一発でピシッと決まって動かない方が落ち付くのでそうなるようにした。

(define-key js2-mode-map "\C-i" 'indent-and-back-to-indentation)

これもインデント関係の設定で
インデントしたときにスペースを除いた行頭にポイントが移動するようにした。


上の2つ設定を追加しただけでけっこう使いやすくなった js2-mode だけども
まだあと2つ気になる点がある。


1つ目。
js2-mode は flymake 抜きで文法のエラーをチェックしてくれる機能があって
デフォルトだとエラー箇所にオレンジ色の下線を引いて示してくれるんだけど
flymake みたいに背景色をピンクにするくらいした方が分かりやすくていいと思う。


2つ目。
なんでエラーになるのかよく分からないのがある。
例えば以下のスクリプトで function() に下線が引かれるんだけど何がいけないんだろう?

setTimeout(function() {new Ten.JSONP(uri, obj, method)}, 500);

ちなみにこのスクリプトは HatenaStar.js から抜粋した。

追記

後から見直してみたら気付いた。
上のスクリプトは new Ten.JSONP() のあとに ; がないや。
function(){ alert() } みたいに
function の中が一行で済むときは ; が書かれてないのをよく見かけるけど
javascript では } の直前の ; は省略できるらしい。
(JavaScript 2.0 構文)
でもこの省略を使うと j2-mode が下線を引いてくるので僕はなるべく省略しないことにする。


この2つが何とかなったらたぶん javascript-mode から乗り換える。
javascript-mode といえば、こいつもよく分からないところがあって
たまにインデントの位置が定まらないときがある。
例えば HatenaStar.js の頭は以下のようになっているのだけど
この if のある行でインデントすると位置が定まらずに if が延々と右にずれていく。

/* Ten */
if (typeof(Ten) == 'undefined') {
  Ten = {};
}
Ten.NAME = 'Ten';
Ten.VERSION = 0.19;

そっくりそのままコピーしてすぐ下に張り付けるとずれなくなる。不思議。