flymake話まだひっぱりますよ

 昨日のadd-hookの話、もうちょっと調べてみました。
 んで、どうもプロンプトが出なくなる(=tramp使用時でもflymake-mode-onとなってる時)のは、例の設定から(id:antipop:20080701:1214838633)

(defun flymake-perl-load ()
  (interactive)
;  (defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
;    (setq flymake-check-was-interrupted t))
;  (ad-activate 'flymake-post-syntax-check)
  (setq flymake-allowed-file-name-masks (append flymake-allowed-file-name-masks flymake-allowed-perl-file-name-masks))
  (setq flymake-err-line-patterns flymake-perl-err-line-patterns)
  (set-perl5lib)
  (flymake-mode t))

; 問題の行
;  (defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
;    (setq flymake-check-was-interrupted t))
;  (ad-activate 'flymake-post-syntax-check)

 ここっぽい。ここを上のようにコメントアウトすると、正常に(?)動作します。ということでどなたか、この3行が何してるのかを教えてください…。(追記:2008-07-06 08:24 だいたいわかりました)
 なおみなさん、id:typesterのエントリから盲目的に以下の設定を書いてると思います。

(defun flymake-perl-init ()
  (let* ((temp-file (flymake-init-create-temp-buffer-copy
                     'flymake-create-temp-inplace))
         (local-file (file-relative-name
                      temp-file
                      (file-name-directory buffer-file-name))))
    (list "perl" (list "-wc" local-file))))

 実はこれ、flymake.elにそのまま書いてあるので、再定義する必要はないです。(少なくとも最新版では)ではいつ必要かといえば、「which perl」した時のperl以外の環境(こういうときに「vm」って使えばいい?)を指定したいとき以外はないのではないかと。

 諸々踏まえ、今つくった僕のperl-flymakeの設定

;; http://d.hatena.ne.jp/xcezx/20080314/1205475020
;; エラーをミニバッファに表示する関数credmp/flymake-display-err-minibufは
;; flymakeで共通で使えるので、先に定義済みとしておく
;; (require 'set-perl5lib)も既に書いてあるものとする

;; Perl用flymake設定
(push '("\\.pl$" flymake-perl-init) flymake-allowed-file-name-masks)
(push '("\\.pm$" flymake-perl-init) flymake-allowed-file-name-masks)
(push '("\\.t$" flymake-perl-init) flymake-allowed-file-name-masks)
(push '("\\(.*\\) at \\([^ \n]+\\) line \\([0-9]+\\)[,.\n]" 2 3 nil 1) flymake-err-line-patterns)
(add-hook 'cperl-mode-hook
 '(lambda ()
    (define-key cperl-mode-map "\C-cd" 'credmp/flymake-display-err-minibuf)
    (set-perl5lib)
    (flymake-mode)))

(後記)
 →なるほど。 - 3m4c5 - Emacsグループ

あと、俺は perl は全然アレですけど set-perl5lib 助かってます。 :-D

 あざっす><!
 既にあれは半分以上id:antipopプロダクトなので、特にしゃしゃり出る必要ないか、と思ってたんですが。
 アイディア自体も、id:typesterのぼやきですし。
 いつか、オリジナルアイディアでCodereposに何か入れたいですね。
 もしくはもうしばらく、id:typesterのぼやきドリブンで何か作るのもありかも。

(追記)

; 問題の行
;  (defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
;    (setq flymake-check-was-interrupted t))
;  (ad-activate 'flymake-post-syntax-check)

 ここはそのままズバリの設定で、flymake-check-was-interruptedをtrueにしておくと、プロンプトも何も出さずにこっそりflymakeの処理を終えてくれる、というものだということが分かりました。この時問題なのが、このほにゃらら-interupptedをnilにしておくと、プロンプトを出した後、メッセージの通りflymake-mode-offをやってくれるのですが、trueではそれをしてくれない。だから、tramp起動時でもflymakeが有効になってしまうんですね。因みにこのdefadviceというマクロは、Moose的に言うとメソッド実行時のbefore,after,aroundの機能と(全く)同じっぽいです。
 ついでに先ほど、気の迷いでtokyo-emacs groupの購読を開始しました。