Mozrepl で prototype.js をいじる

repl.enter(content.wrappedJSObject)

を実行すれば普通に「$」とかにアクセスできるようになることが分かった。
このコマンドは Firefox3 用のもので、Firefox2 では代わりに

repl.enter(content)

とすればいけるらしい。


例えばprototype.js の公式ページにいって
以下のようにコマンドを実行すると

repl> repl.enter(content.wrappedJSObject)
[object Window]
repl> repl.whreAmI()
[object Window] - Document title: "Prototype JavaScript framework: Easy Ajax and DOM manipulation for dynamic web applications"
repl> repl.look()
.
. // 省略
.
this.$F=[function]
this.Field=[probably array, length 0]
this.Form=[probably array, length 0]
this.$$=[function]
this.Selector=[function]
this.$=[function]
this.Ajax=[probably array, length 0]
this.$R=[function]
this.$H=[function]
this.Hash=[function]
this.$w=[function]
this.$A=[function]
.
. // 省略
.

ほら!$ とか $A とかなんだかとっても見覚えのある方たちがいらっしゃるじゃないですか!


ここからちゃんと中身も見れるし

repl> repl.inspect($)
<function>.prototype=[probably array, length 1]
<function>.bind=[function]
<function>.bindAsEventListener=[function]
<function>.curry=[function]
<function>.delay=[function]
<function>.wrap=[function]
<function>.methodize=[function]
<function>.defer=[function


ちゃんと使える。

repl> $('container').innerHTML += 'hoge'

moz.el

Mozrepl 付属の moz.el を使えば
Emacs から prototype.js を対話的にいじれるようになる。
Emacs integration | hyperstruct


よく使うキーバインド2つ。

C-c C-s Mozrepl を対話的に処理できるシェルを呼び出す
C-c C-l 現在のカレントバッファの内容を Mozrepl に処理させる

moz-plus.el

いっしょにmoz-plus.elも使うとタブで補完も利くようになってなおよし!


リンク先で紹介されている elisp だと補完が利くのはシェル*1だけなのだけど
僕は javascript-mode で編集しているファイルでも利くようにしいている。

;;; moz
(autoload 'moz-minor-mode "moz" "Mozilla Minor and Inferior Mozilla Modes" t)
(add-hook 'inferior-moz-mode-hook (lambda ()
                                    (require 'moz-plus)
                                    (moz-plus 1)
                                    ))
(add-hook 'javascript-mode-hook 'javascript-custom-setup)
(defun javascript-custom-setup ()
  (moz-minor-mode 1)
  (require 'moz-plus)
  (moz-plus 1)
  )

追記

最後の javascript-mode でも利くようにするっていう設定は Mozrepl を使わないときは邪魔かも (´・ω・`)
トリガーをタブにしておくとタブでインデントができなくなっちゃうのでとりあえずコメントアウトしておく。

;;; moz
(autoload 'moz-minor-mode "moz" "Mozilla Minor and Inferior Mozilla Modes" t)
(add-hook 'inferior-moz-mode-hook (lambda ()
                                    (require 'moz-plus)
                                    (moz-plus 1)
                                    ))
(add-hook 'javascript-mode-hook 'javascript-custom-setup)
(defun javascript-custom-setup ()
  (moz-minor-mode 1)
;;  (require 'moz-plus)
;;  (moz-plus 1)
  )

*1:repl> って出てるバッファ