mozreplのemacsインターフェイスの補完機能を強化するmoz-plus.elをcodereposにコミットしました。

まだ状況によって挙動が微妙だったりする部分がたくさんあって恥ずかしいのですが公開しないよりずっとましだとここ数週間で考え方が変わったのでcodereposにコミットさせていただきました。

これはなに?

inferior-moz-modeに補完機能を追加します。

機能

firefoxtelnet経由で通信できるようになる拡張mozreplのemacsインターフェイスinferior-moz-modeのminor-modeとして動作し、補完機能やmozreplを使うための少し便利な機能を追加します。



うまく説明できそうになかったので動画を貼り付けておきます。
windowsmeadowの背景を半透明にしてfirefoxに重ねて撮っています。


inferior-moz-modeはmozreplの配布に含まれているmoz.elで定義されているモードです。
comint使ってfirefoxのmozreplと通信するshell見たいなのを実現します。

便利だと思われる点

  • オブジェクトの調査や、ちょっとした確認のためにjs shellの代わりに使ったりできる。
  • firefox拡張を作ったことが無いので詳しいことはわかりませんが、chromeコンテキストからfirefoxの拡張をさわれたりするのでちょっと面白い。
  • スペース区切りで補完候補が絞り込めるのでうろ覚え状態での絞込みが可能?
  • 0 や @mozilla.org/moz/jssubscript-loader;1 などdot演算子でアクセスできないプロパティを補完した際に自動的に[]でのアクセス方法で挿入されるのでarr.0 //=> エラー となり ああっ、もういやん! となりにくい。


そのほか、常にcontentにコンテキストを置く、常にコンテキストを下部に表示するなどの機能もありますがたまに挙動が怪しくなったりします…。

インストール方法

firefox拡張mozreplをインストールする。
MozLab | hyperstruct


elispをインストールする。


上記の依存elとmoz-plus.elをパスの通った場所に配置後、.emacsに設定します。
以下、設定サンプルです。mozreplを起動するコマンド run-mozillaをautoloadしてM-xで呼べるようにし、起動時にmoz-plusマイナーモードがオンになるようにします。

(autoload 'run-mozilla "moz" "run inferior moz" t)
(add-hook 'inferior-moz-mode-hook (lambda ()
                                    (require 'moz-plus)
                                    (moz-plus 1)
                                    ))
設定可能な変数など

moz-plus-completion-include-dontenum-flagをtに設定するとdontEnum属性のオブジェクトも補完候補に加えることができます。
使用中に C-c m d で切り替えることができます。

使い方

デフォルトだとTAB(C-i)に補完のコマンドを割り当てます。

その他のmoz-plusによって提供されるコマンドはプレフィックスとして C-c m を使います。(デフォルト設定時. 変更は変数 moz-plus-prefix-key をさわってください)

各コマンド(一部動作が怪しいコマンドもあります。)

C-c m l

moz-plus-load-js ファイルとコンテキストを指定してJSを読み込む

C-c m w

moz-plus-display-where-am-i 現在のコンテキストを下部、モードラインに表示する。(動作怪しい)

C-c m e

moz-plus-always-enter-content 常にコンテキストをcontentブラウサが表示しているページにする。 毎回repl.enter(content)してるだけです。

C-c m i

moz-plus-complete-all-ids ドキュメントを走査してIDの補完をします。

C-c m c

moz-plus-complete-all-classes classを補完します。

C-c m n

moz-plus-complete-all-names nameを補完します。

C-c m a

moz-plus-complete-all-selector id, class, nameを補完します。多分。

C-c m s

moz-plus-display-status dontEnum属性をもつオブジェクトも補完候補にするか などのmoz-plusのオプションの状態をminibufferに表示します。

C-c m d

moz-plus-toggle-completion-include-dontenum 補完候補にdontEnum属性を含めるかどうかのフラグをトグルします。


major-modeで提供されているshell関連のその他のコマンドは、shell-modeのinfo等を参照してください。

C-h m でモードの説明が読めます。C-hを削除に割り当てている方は M-x help-for-help m でも同じです。

注意点

moz-plus-completion-include-dontenum-flagがnil以外の場合に、補完の補助のためのmozrepl.MOZPLUS というオブジェクトを作ります。

起動時にfirefoxに対してevalしていると言うことなので、まず大丈夫とは思いますが、codereposが登録している人なら誰でも変更できるという性質上、コード内のJS部分を危険なコードに書き換えられていた場合、危険です。


以上の理由から、お手数ですが使用前にコミットログの確認をお願いします。


近いうちにこのソースに関してはcoderepos以外の配布場所を作る予定です。

その他

dontEnum属性をもつオブジェクトの補完

この部分は、id:nazoking さん作のobjectdump.jsで使用されている技術を使わせていただいています。
大量のオブジェクト名の候補を用意してテストする方法です。


moz-plus.elの中ではobjectdump.js内のobjectdump.dontEnumsに0-20、1.6,7等の関数名を加えたりしたものを使わせていただいています。
加えた関数は自分が使っていて追加していったので結構適当です。

また、id:brazilさんのjshのソースも非常に参考にさせていただきました。


その他の参考リンク先からのリンクも非常に参考にさせていただき、勉強になりました。 ありがとうございました! 感謝です。

動画について

最初、youtubeにテストでUPしてみたのですが画質が悪くて文字が読めなかったのでニコニコ動画にしてみました。

動画をUPするのは初めてだったので変なところがあったらごめんなさい。

moz-plusについて

基本的な部分は二ヶ月ほど前に書いたもので、先ほどソースを読み直して見たのですがどうしてこんな実装になってるかわからない部分が結構あり、詳細を思い出すまでちょっと時間がかかるかもしれないです。

後で二ヶ月前の自分に対し、簡単なコメント位書くようにと文句を言っておきます。


個人的には新しくでたjs2-modeと連携させてfirefoxとつながったJS開発環境をemacs上に作ってみたいな、と夢を見ているので、時間があるときに少しずつ良くしていこうと思っています。


あとは、Emacs上で使えるという利点を活かしてmozreplのshell上でyasnippetを利用した補完とかもできたら思いついたときにさくっとJavaScriptを試したりできるなぁと思っていたり。

追記履歴

2008/04/03 typo修正