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から取るようにすると良いみたい。