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の購読を開始しました。