土曜日

ライブコーディング http://livecoding.org/ に行ってきました。
ライブコーダーがテーマを決めて即興でプログラムを書いて、その過程をみんなで鑑賞したり応援したりするというもので面白くて全く目が離せない。






Livecodingでは色々ためになる発見があったが、ぜひ使ってみたいと思ったのがflymake。
Eclipseがやってくれるみたいに、ソースを保存した時点で背景でコンパイルを行い、エラーのある箇所を表示してくれます。

帰ってきてさっそく導入に挑戦。emacs(僕の場合はxyzzy)はデフォルトで便利なのでつい素のままでずるずる使ってきましたが、はたして.emacsをうまく書けるでしょうか?

flymake-haskellの導入

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)))