js2-mode は Emacs で JavaScript を書くための major-mode です。 外部の JavaScript 処理系無しに (flymake のように) 文法上のエラーを表示するなど、 かなり意欲的な機能を備えています。
しかしその一方で、js2-mode のデフォルトの挙動はかなり独特です。 ここでは、それらの挙動を他の major-mode とそろえる方法を説明します。
js2-mode はファイル単体で配布されていますので、それを load-path の通った場所に置きます。
% wget http://js2-mode.googlecode.com/files/js2-20080616a.el % mv js2-20080616a.el /PATH/TO/js2.el
js2-mode はバイトコンパイルが必須です。 Emacs 上で M-x byte-compile-file して /PATH/TO/js2.el を指定してください。
以下が ~/.emacs 上の設定です。
(setq-default c-basic-offset 4) (when (load "js2" t) (setq js2-cleanup-whitespace nil js2-mirror-mode nil js2-bounce-indent-flag nil) (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))) (define-key js2-mode-map "\C-i" 'indent-and-back-to-indentation) (define-key js2-mode-map "\C-m" nil) (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode)))
個々の内容について説明します。
js2-cleanup-whitespace を nil にします。
js2-mirror-mode を nil にします。
まず、c-basic-offset でインデント幅を 4 にします。 js2-mode のインデント幅は js2-basic-offset ですが、 c-basic-offset が設定されていれば、 その値が js2-basic-offset の初期値として使われます。
次に C-i (TAB) のたびに、haskell-mode のようにインデントが変わるのを、 js2-bounce-indent-flag を nil にして止めます。
最後に、インデントの際のカーソル移動を他の major-mode とそろえます。 Emacs のほとんどの major-mode では下図の _ の位置にカーソルを置いてインデントすると、 カーソルが r の位置にジャンプします。
function f(x, y) { _ return x + y; }
js2-mode ではジャンプしなかったため、 新たに indent-and-back-to-indentation を定義・設定しています。
これは必要ない人も多いと思います。
js2-mode では C-m に js2-enter-key をあてていますが、個人的に
(global-set-key "\C-m" 'newline-and-indent)
しているので js2-mode-map の C-m を nil にしています。