Emacs で JavaScript を書く

更新履歴

js2-mode をおとなしくさせる

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 にしています。

参考