読者です 読者をやめる 読者になる 読者になる

ghc-modのflymakeエラーをミニバッファに表示する

(2014/04/05追記) この記事の内容はghc-mod-4以降では通用しなくなりました.

私のようなNo Window派のEmacs使いにとってはエラー・警告がミニバッファに出てくれないと正直困る.もしかするとWindowモードではM-n/M-p時にポップアップとかしてくれてるのかもしれないが,emacsをXアリでビルドしない(GentooメインなのでUSEフラグXアリでemacsをビルドすることが無い)ため,実際のところはよくわからないし出てても目にすることがない.

一応M-?でバッファに内容を出すghc-flymake-display-errorsが用意されているものの,バッファを作って出しておくほどのものじゃないので,一々バッファができちゃうと邪魔だなぁという印象になってしまう.なので,M-n/M-p時にエラー・警告をミニバッファに出すよう.emacsを書く必要がある.まぁ,ghc-flymake-display-errorsがバッファ作って表示してるところをmessageでミニバッファに出すだけなのだが.

;; ghc-mod
(autoload 'ghc-init "ghc" nil t)
(add-hook
 'haskell-mode-hook
 (lambda ()
   (ghc-init)
   (flymake-mode)
   ;; ミニバッファにエラー内容を表示
   (defun ghc-flymake-display-errors-to-minibuffer ()
     (if (not (ghc-flymake-have-errs-p))
         (message "No errors or warnings")
       (let ((title (ghc-flymake-err-title))
             (errs (ghc-flymake-err-list)))
         (message "%s\n\n%s\n\n" title
                  (mapconcat (lambda (x) (replace-regexp-in-string "\0" "\n" x)) errs "\n")))))
   ;; M-nで次のエラーに飛ぶと同時にミニバッファにエラー内容を表示
   (define-key haskell-mode-map ghc-next-key
     '(lambda ()
        (interactive)
        (flymake-goto-next-error)
        (ghc-flymake-display-errors-to-minibuffer)))
   ;; M-pで前のエラーに飛ぶと同時にミニバッファにエラー内容を表示
   (define-key haskell-mode-map ghc-previous-key
     '(lambda ()
        (interactive)
        (flymake-goto-prev-error)
        (ghc-flymake-display-errors-to-minibuffer)))))

なんで今更こんなことしてるかというと,最近までflymake用にghcのエラーメッセージ拾ったり上記のようなミニバッファ表示挙動にしたりといったところを自前でやっていたのだが,そろそろghc-mod使ってみようかなーと思いたったので.