btoメモ

なんか適当に書く

サーバ上のvimでファイルを上書きした時に自動的にブラウザでリロードできるようにしてみた

この前PHP勉強会で halt さんが ma.la さんがやってるみたいな感じで、サーバ上の vim で保存して自動的にブラウザのリロードをしたいんだけど、なんかうまくいかないよねっていうのをやってた。

いろいろ話しているうちに LD_PRELOAD で write() をフックしてやればいいんじゃない、ということになって、面白そうなので実装してみた。

libchkwrite

rpm パッケージとか tarball を用意しておいたのでインストールしてみてください。

インストールすると libchkwrite.so というライブラリがインストールされるはずです。

libchkwrite.so は LD_PRELOAD で指定して使用します。

LD_PRELOAD に libchkwrite.so を指定すると libchkwrite.so は write() をオーバーライドして、write() がコールされるたびに環境変数 CHKWRITE_UPDATE_FILE で指定されたファイルのタイムスタンプを更新します。

例えば

CHKWRITE_UPDATE_FILE=$HOME/public_html/chkupdate LD_PRELOAD=/usr/lib/libchkwrite.so vim $HOME/public_html/index.html

のように vim を実行すると $HOME/public_html/index.html が保存されるたびに $HOME/public_html/chkupdate のタイムスタンプが更新されるようになります。

$HOME/public_html/chkupdate を http でアクセスできるとこにおいておき、ブラウザ側で定期的にチェックしてタイムスタンプが更新されたときにブラウザ側を自動的にリロードすれば、サーバ側でファイルを更新してすぐにクライアントのブラウザ側に反映されるようになります。

ブラウザ側の処理

greasemonkeyスクリプトを用意してみました。

chkupdate.user.js

スクリプト中の check_url を更新をチェックする URL に置き換えて登録してください。

指定された URL のタイムスタンプが更新されると自動的に開いてるページをリロードするようになります。

別に greasemonkey でなくても、開発中プロジェクト専用の js ファイルを埋め込んでおいて、IE でも Opera でも自動的にチェックできるようにした方がいいでしょう。

クライアント側に専用のプログラムを作っておいてもいいかもしれません。

追記:

greasemonkeyスクリプトはちょっとこだわって作ってみました。

全ての変数群を無名関数の中に閉じ込めて、既存の Javascript と絶対に衝突しないようにしました。

setTimeout() とか XHT の onload に渡す関数に値の使いまわしをするのが結構面倒くさかった。