読者です 読者をやめる 読者になる 読者になる

Re: Outputz を Growl で表示し隊。

エロい人達のコメントを待ってまーす。

http://d.hatena.ne.jp/tomoya/20081216/1229378861

やった。「エロい人」なら答えられる :)

outputz.el に手を入れないで、同じようなことをするコードを書いてみました。

(when (executable-find "growlnotify")
  (add-hook 'outputz-mode-hook
            (lambda ()
              (set (make-local-variable 'outputz-latest-count) 0)))

  (defun growlnotify (str)
    (shell-command (format "growlnotify -m %s" str)))

  (defun growlnotify-outputz (&optional count)
    (interactive)
    (growlnotify (format "Emacs: You are %s bytes Outputz!!!!!!"
                         (or count
                             outputz-latest-count))))

  (defadvice outputz-post (after
                           growl-outputz (count)
                           activate)
    (growlnotify-outputz (setq outputz-latest-count count))))

いろいろやってます。

executable-find

まず executable-find で growlnotify を探します。見付かったら...

outputz-latest-count

バッファローカル変数 outputz-latest-count を定義するよう定義。初期値は 0 にしておきます。

growlnotify

関数 growlnotify を定義。
growlnotify(1) の、ごく単純なラッパです。

growlnotify-outputz

関数 growlnotify-outputz を定義。

  • 引数 count が渡されたらその数値を
  • 渡されなかったら outputz-latest-count を

format して growlnotify に渡します。

growl-outputz

みんな大好き defadvice. outputz-post に対し アドバイス growl-outputz を定義します。

outputz-post が呼ばれた後 growlnotify-outputz へ数値を渡します。

  • outputz-post に渡ってきた count を再利用して渡しています。
  • ついでに outputz-latest-count へ count の値を束縛した返り値を束縛しています。*1

ところでぼくは chord を導入していないので試していませんが、 id:tomoya さんのこれもそのまま動くはず……です。

(key-chord-define-global "op" 'growlnotify-outputz)
http://d.hatena.ne.jp/tomoya/20081216/1229378861


というわけで今回も defadvice の布教でした。

既存のコードをに手を加えずに機能を追加できるのって素敵ですね :)

*1: そう setq は束縛した値を返すのです ;)