flymake-haskellを導入するにはEmacs Wikiの該当ページを参考。
ついでにエラーメッセージをミニバッファに表示するように設定します。
ただhaskell-modeもミニバッファを利用しているので衝突。
なにせhaskell-modeはアイドルになって0.5秒後にミニバッファにヘルプを表示するという仕様のため、flymake-haskellのメッセージが即座に消えてしまいます・・・。
どういう処理をしてるのかhaskell-modeのソースを呼んでみるが、複雑な処理をしていてすぐには流用できなさげ。
しかし、実験しているうちにsit-forの挙動がわかってきたので、以下のようにメッセージを出したら最後に待つことで、許容できる動作をするようになりました。
- なにもない行にカーソルを止めればhaskell-modeのヘルプが出るし、
- C-c d すれば60秒間はflymake-haskellのエラーメッセージが出続ける。
- カーソルを移動すればエラーメッセージは消えてヘルプが出る。
これにてflymake-haskell問題はとりあえず解決。他の方法があったらぜひ教えてください。
(global-set-key "\C-cd"
'flymake-show-and-sit )
(setq haskell-doc-idle-delay 0.1)
(defun flymake-show-and-sit ()
"Displays the error/warning for the current line in the minibuffer"
(interactive)
(progn
(let* ( (line-no (flymake-current-line-no) )
(line-err-info-list (nth 0 (flymake-find-err-info flymake-err-info line-no)))
(count (length line-err-info-list))
)
(while (> count 0)
(when line-err-info-list
(let* ((file (flymake-ler-file (nth (1- count) line-err-info-list)))
(full-file (flymake-ler-full-file (nth (1- count) line-err-info-list)))
(text (flymake-ler-text (nth (1- count) line-err-info-list)))
(line (flymake-ler-line (nth (1- count) line-err-info-list))))
(message "[%s] %s" line text)
)
)
(setq count (1- count)))))
(sit-for 60.0)
)
;; Auto enter flymake
(add-hook 'haskell-mode-hook
'(lambda ()
(flymake-mode)))