defadviceで定義済みの関数に処理を付け足す

flymakeの勉強をしようと
僕のflymake-perl周りの設定晒し最終版(今現在) - taiyoh独言
を参考にしようと思ってみてみたら、"defadvice"というのが書いてあって、何なのか知らなかったので調べてみた。
GNU Emacs Lisp Reference Manual: Advising Functions
簡単に言うと、before, after, またはaroundという指定で、MooseのMethodModifiersのように本来の処理の前後に処理を追加できるらしい。
ちょっと使って書いてみた。本来flymake-goto-next-errorはエラー行に飛ぶだけなのだけど、その際にエラーメッセージをminibufferに表示したい。

(require 'flymake)
;; gotoした際にエラーメッセージをminibufferに表示する
(defun display-error-message ()
  (message (get-char-property (point) 'help-echo)))
(defadvice flymake-goto-next-error (after flymake-goto-next-error-display-message)
  (display-error-message))
(ad-activate 'flymake-goto-next-error 'flymake-goto-next-error-display-message)

こんなカンジ?
flymake-goto-next-errorの後に実行してほしい処理を

(defadvice flymake-goto-next-error (after flymake-goto-next-error-display-message)
  ...)

という具合に定義する。その場でactivateにしても良いけど、あとでそれを有効にする場合

(ad-activate 'flymake-goto-next-error 'flymake-goto-next-error-display-message)

と書いてやる。こうするとここで初めてflymake-goto-next-error-deisplay-messageが有効になる。らしい。
定義だけしておいて場合によってこれを有効にする、しないなどを切り替えられるということだと思う。


ちなみに上記例では、エラーメッセージを

(message (get-char-property (point) 'help-echo))

で表示させている。
flymakeのソースを読んだカンジでは、エラーのメッセージはflymake-highlight-line内で(flymake-ler-text (nth 0 line-err-info-list))の値をoverlay-putで'help-echoに設定しているのでそれを取得することで簡単にとれる、らしい。もっと詳細な情報が欲しい場合はflymake-err-infoから取るようにすると良いみたい。