Outputz を Growl で表示し隊。

追記 id:elim んにRe: Outputz を Growl で表示し隊。という記事で、defadvice を使った、元のコードに手を入れないでGrowlる方法を教えてもらいました :-) あっちも見てね!
自分がアウトプットした文字の量を記録するOutputzというCybozu Labsのサービスがあって、outputz-mode という minor-mode をけんたろさんが作ってくれて、それを利用しはじめたんですが、せっかく Mac には Growl っていう素晴しい Notifier あるので、OutputzGrowl で通知したいなぁと思ったわけです。
ぜんぜん Lisp とか分かんないんですが、GNU Emacs Lispリファレンスマニュアルとか見ながら、がんがって outputz.el のソースを見ると、after-save-hook に outputz 関数が入るようになっているので、保存時に Outputz されるバイトを計算している模様です。
んでもって、Outputz する文字数が記録されている変数 current-count はローカル変数となっていて、しかも毎度リセットされてしまうみたい(まぁ当然か)。
とりあえず、Outputz する文字数が自由に使えるようになれば、ごにょごにょできそうだけども、ローカル変数への参照の仕方が分かんないので、outputz.el の関数 outputz-post の部分に、グローバル変数 growl-outputz-count を定義してカウントを代入するようにしてみました。

(defun outputz-post (count)
  (let ((url "http://outputz.com/api/post")
        (url-request-method "POST")
        (url-request-extra-headers
         '(("Content-Type" . "application/x-www-form-urlencoded")))
        (url-request-data
         (concat "key="   outputz-key
                 "&uri="  (format outputz-uri major-mode)
                 "&size=" (int-to-string count))))
    (setq growl-outputz-count (int-to-string count)) ; この行を追記
    (url-retrieve url 'outputz-callback)))

すると、Growl で表示する部分ですが、こんな感じで表示させる事ができるみたい。

(shell-command (concat "growlnotify -m \"Emacs: You are " growl-outputz-count " bytes Outputz!!!!!!\""))

scratch バッファに書いて、C-j で実行すると、ちゃんと Growl で表示されました。

しかし、まだ何も入力していない段階で実行すると、growl-outputz-count 変数が void-variable やと怒られるので、未定義かどうかを評価する必要があるっぽいです。boundp を使うと、未定義かどうかを t or nil で返してくれるそうなので、if を使ってこんな感じにしたら上手くいった模様。

(defun growlnotify-outputz ()
  (interactive)
  (if (boundp 'growl-outputz-count)
    (growl-outputz growl-outputz-count)
    (shell-command (concat "growlnotify -m \"Emacs: You are no Outputz.\""))))

(defun growl-outputz (count)
  (shell-command (concat "growlnotify -m \"Emacs: You are " count " bytes Outputz!!!!!!\"")))

後はこれを after-save-hook のリストなどに突っ込むなどすれば、Outputz + Growl ライフが楽しめそうです。
ですが、普通に after-save-hook リストに入れると、outputz も入っているため、実行される順番によっては前に保存したときのバイト数が表示されてしまいます。
hook で呼び出す場合は、必ず関数 outputz が実行された直後に関数 growlnotify-outputz で通知してもらうようにしなければならないので、リストに追加する時に、growlnotify-outputz を末尾に追加すればいいはずです。
その場合、add-hook でリストに追加する関数の後に nil 以外の引数を与えると、フックリストの末尾に関数が追加できるらしいでので、

(add-hook 'after-save-hook 'growlnotify-outputz t)

これで、保存時に GrowlOutputz したバイト数を表示させる事に成功しました。わーい。
しかし、これだけでは面白くないということで、Emacs の第三のキーバインド key-chord.el を使えば、前回保存したときにOutputzしたバイト数をワンタッチで見る事ができる。

(key-chord-define-global "op" 'growlnotify-outputz)

これだと、op を同時押しで Growl で通知されるようになる。これを試してみて思ったが、key-chord.el + Growl という組み合わせは、非常に便利かつ楽しいと思うので、あれこれ Growl してみる様にするのもいいかもしれない。
というわけで、色々と無駄なところがあると思うので、エロい人達のコメントを待ってまーす。