May 02, 2008
【Emacs】ファイルを保存したときにFirefoxのアクティブページを更新させる
Perl MongerがVimでHTMLやCSSの保存と同時に各ブラウザのリロードを実現していたりするのを横でうらやましく思っていたのだけれども、よく見たら元ネタはEmacsで実現していた。お、と思ったらAppleScriptを使用。
またMacかぁああ!!
せっかくEmacsがローカルに手に入ったのに!!
で、
「Ubuntu Scriptとかあればなー」と#codecheck.in@irc.codecheck.inでボヤいていたら、mizzyさんがMozLabというかなりナイスなFirefox AddOnを紹介してくれた。
どうやらMozLabの中のMozReplというモジュールがFirefox自体とのtelnet接続を実現してくれるらしい。
telnet?
お、これEmacsで接続できるんじゃね?
で、調べてみるとmoz.elというEmacs Lispも配布されてた。いたれりつくせり。
とりあえずサイトから直接でmoz.elを取得。
wget http://repo.hyperstruct.net/mozlab/current/chrome/content/mozrepl/moz.elなかを見てみると基本的に対話的に使うコマンドが多く、Firefoxのアクティブページをリロードするような関数がなかった。
「ここまできたら作るしかない」とへっぽこなEmacs Lispで単純なリロード用関数を作成。
んでもってjs2-modeとかphp-modeとかcss-modeにマイナーモードとしてmoz-minnor-modeを有効化。
以下がコード。
(autoload 'moz-minor-mode "moz" "Mozilla Minor and Inferior Mozilla Modes" t)
(add-hook 'js2-mode-hook 'js2-moz-setup)
(defun js2-moz-setup ()
(moz-minor-mode 1))
(add-hook 'php-mode-hook 'php-moz-setup)
(defun php-moz-setup ()
(moz-minor-mode 1))
(add-hook 'css-mode-hook 'css-moz-setup)
(defun css-moz-setup ()
(moz-minor-mode 1))
(defun moz-send-reload ()
(interactive)
(comint-send-string (inferior-moz-process)
(concat moz-repl-name ".pushenv('printPrompt', 'inputMode'); "
moz-repl-name ".setenv('inputMode', 'line'); "
moz-repl-name ".setenv('printPrompt', false); undefined; "))
(comint-send-string (inferior-moz-process)
(concat "content.location.reload();\n"
moz-repl-name ".popenv('inputMode', 'printPrompt'); undefined;\n"))
)さらに、ファイルをセーブするたびにFirefoxをリロードするように設定。
(defun reload-moz()
(if (string-match "\.\\(css\\|js\\|php\\)$" (buffer-file-name))
(moz-send-reload)))
(add-hook 'after-save-hook 'reload-moz)で、実際に使ってみるとちゃんと動いた!
これで快適リロードライフを満喫できる!
というかいつもうらやましがっていないか俺?
【参考URL】
MozLab
CSSを保存したときにブラウザを更新 mac+applescript+emacs+safari (Unknown Quality)
最速インターフェース研究会 :: Firefoxの拡張MozLabの中に含まれるMozReplがヤバすぎる件について
