Ejacs + js-mode + MozRepl - EmacsでJavaScriptを書くための設定

Emacs23.2からJavaScriptのためのメジャーモードとしてjs-modeが組み込まれている*1。auto-mode-alistに("\\.js\\'" . js-mode)が既に登録されているので*2、拡張子が.jsなファイルを開けば自動的にjs-modeとなるはずだ。
このときファイルを実行する方法として2つの選択肢が*3ある。
1つはEmacs上でJavaScriptインタプリタを走らせる方法で、もう一つはFirefoxに実行させる方法。どちらが必要かは場合によるので*4、両方使えるように設定する。

Ejacs

Ejacsというのは全部Emacs Lispで書かれたとかいうJavaScriptインタプリタ
Google Code Archive - Long-term storage for Google Code Project Hosting.からzipを落としてきて解凍し、load-pathの通った場所(site-lispとか)に解凍する。

MozRepl and moz.el

MozReplというのはFirefoxtelnet接続して色々できるようになるアドオンで、moz.elというelispを使うとEmacsからMozReplを介してFirefoxにちょっかい出せるようになる*5
まず、MozReplをHome · bard/mozrepl Wiki · GitHubからFireFoxへインストールしておく。正常にインストールされるとFireFoxの「ツール」にMozReplというのが追加されて、そこからMozReplを起動できる。起動しておくと外部から接続可能になるので、何かしたかったら起動しておく。
次にmoz.elをmozrepl/moz.el at master · bard/mozrepl · GitHubから落としてきて、これもload-pathの通った場所に置く。

init.el(.emacs)の設定

以下の記述をinit.el(または.emacs)に追加(一部vallog: Ejacs(Ejax)とjs2-modeを連携させるを参考にさせてもらいました。)

;;; ejacs {{{2
;; C-c C-jでjs-consoleを起動
;; C-c rで選択範囲を実行 
(autoload 'js-console "js-console" nil t)
(defun js-console-execute-region (start end)
  "Execute region"
  (interactive "r")
  (let ((buf-name (buffer-name (current-buffer))))
    (copy-region-as-kill start end)
    (switch-to-buffer-other-window "*js*")
    (js-console-exec-input (car kill-ring))
    (switch-to-buffer-other-window buf-name)))
(defun run-js-console-and-split-window ()
  "Run js-console and split window horizontally."
  (interactive)
  (split-window-horizontally)
  (js-console)
  (other-window 1)
  )
(add-hook 'js-mode-hook
          (lambda ()
            (moz-minor-mode 1) ;; 要moz.el
            (local-set-key "\C-c\C-j" 'run-js-console-and-split-window)
            (local-set-key "\C-cr" 'js-console-execute-region)
            ))

使い方

C-c C-jでEjacsが起動する。

C-c rで選択範囲をインタプリタへ送って実行させる

C-c C-rで選択範囲をFirefoxへ送って実行させる

*1:もともとespresso-modeと呼ばれていたもの(Emacs 23.2 Features (released 2010-05))

*2:*scratch*で(rassoc 'js-mode auto-mode-alist)と記入して行末でC-jすると確認できる。もしこの返り値がnilだったら.emacsに、(add-to-list 'auto-mode-alist '("\\.js\\'" . js-mode) )などと記述しておく。

*3:良く調べてないのでもっとあるかもしれない

*4:偉そうに言ってみたけどサイの絵の付いた本(JavaScript 第5版)を読み始めて2日目なのでよく知りません

*5:というか、js-modeはそもそもmoz.elと一緒に使うことを想定しているみたい