Haskell を快適に利用するための Emacs 環境の構築

    edX で Haskell の講座をとり始めました.

    内容はさておき, まずは Emacs の環境作りから始めました.

    環境づくりに夢中になって内容がおろそかになるという, いつもの悪いパターン.

    haskell-mode

    Haskell のマイナーモード.

    (autoload 'haskell-mode "haskell-mode" nil t)
    (autoload 'haskell-cabal "haskell-cabal" nil t)
    
    (add-to-list 'auto-mode-alist '("\\.hs$" . haskell-mode))
    (add-to-list 'auto-mode-alist '("\\.lhs$" . literate-haskell-mode))
    (add-to-list 'auto-mode-alist '("\\.cabal\\'" . haskell-cabal-mode))

    モードの設定.以下のリンクが詳しい.

     ;; indent の有効.
    (add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
    (add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
    (add-hook 'haskell-mode-hook 'font-lock-mode)
    (add-hook 'haskell-mode-hook 'imenu-add-menubar-index)

    Haskell Script の編集モード

    (add-to-list 'interpreter-mode-alist '("runghc" . haskell-mode))
    (add-to-list 'interpreter-mode-alist '("runhaskell" . haskell-mode))

    Haskell でかかれたスクリプトを haskell-mode で編集する.

    #!/usr/bin/env runhaskell

    Ghci との連携

    M-x run-haskell で ghci が起動.

    (setq haskell-program-name "/usr/bin/ghci")

    C-c, C-l でも起動.

    (add-hook 'haskell-mode-hook 'inf-haskell-mode) ;; enable

    ghci の起動とファイルの読み込みを一緒に行う設定.

    (defadvice inferior-haskell-load-file (after change-focus-after-load)
      "Change focus to GHCi window after C-c C-l command"
      (other-window 1))
    (ad-activate 'inferior-haskell-load-file)

    - inferior-haskell-mode で設定すると便利なこと - プログラムとかのの blog

    gcd-mod

    Haskell 開発を助ける機能がそろったツール.

    Install

    % cabal update
    % cabal install ghc-mod

    Settings

    (autoload 'ghc-init "ghc" nil t)
    (autoload 'ghc-debug "ghc" nil t)
    (add-hook 'haskell-mode-hook (lambda () (ghc-init)))

    Emacs での使い方は以下のページに書いてある.

    エラーチェック

    flymake

    構文チェック.

    (add-hook 'haskell-mode-hook (lambda () (flymake-mode)))

    hlint

    コードチェック. cabal install hlint でインストールする. C-c C-c でカーソル部のチェック.

    自動補完

    こんなの見つけた. ac-haskell-process.

    (require 'ac-haskell-process) ; if not installed via package.el
    (add-hook 'interactive-haskell-mode-hook 'ac-haskell-process-setup)
    (add-hook 'haskell-interactive-mode-hook 'ac-haskell-process-setup)
    (eval-after-load "auto-complete"
      '(add-to-list 'ac-modes 'haskell-interactive-mode))

    Links