あどけない話

インターネットに関する技術的な話など

Emacs での Haskell プログラミングを幸せにする

前から予告していましたが、Emacs での Haskell プログラミングを幸せにするプロジェクトを開始しています。ゆくゆくは、haskell-mode を置き換えたいのですが、とりあえず haskell-mode と共存して、補完とドキュメントの閲覧が幸せになるコードをリリースします。

まだ、プロジェクトのページを作っていないので、コードは一時的にここに置いておきます。

補完 (M-TAB)

  • 行頭では、行頭に来るべき予約語(import とか)の補完ができます
  • import の後では、モジュール名(Data.List とか)の補完ができます。
  • その他の場所では、予約語(where とか)、関数名(foldr とか)、型名(Bool とか)などの補完ができます。

cabal などを使ってインストールしているモジュール名が補完対象となります。つまり、ghc-pkg が表示してくれるパッケージに含まれているモジュールです。

これ以外の場所に書かれている関数名などは、そのファイルを読み込んでおけば、M-/ で補完できるのでいいですよね?

ドキュメントの閲覧 (M-C-d)

import の行で M-C-d とすると、モジュール名を切り出してくれます。単に RET を押すと、そのモジュールのドキュメントがブラウザに表示されます。(browse-url が、ちゃんとブラウザと連動するように設定して下さいね!)

適当なところで M-C-d を押すと、モジュール名が空になるので、TAB で補完しながらモジュール名を入力して下さい。

インストール

Haskell で書かれた ghc-mod というコマンドと、ghc*.el という Emacs Lisp をインストールします。

% tar zxvf ghc-mod-0.1.tar.gz
% cd ghc-mod-0.1
% cabal configure
% cabal build
% cabal install
% cd elisp
% make
#ここで、*.el と、作成された *.elc を Emacs の load-path が通っているところへコピー

シェルの PATH に "~/.cabal/bin" が通っているか確認。

以下を .emacs.emacs.el に入れる。

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

仕組み

Emacs で適当な .hs を開いてみましょう。「Executing "ghc -l browse Prelude..."」などのようにミニバッファに表示されれば、OK です。

この時点で、

  • ghc-pkg dump からモジュール名のリストを作っている
  • ghci + :browse Prelude で、Prelude に定義されている名前のリストを作っている

です。

これらの作業をするコマンドが、ghc-mod です。

あと、30秒間何も入力がなければ、読み込んでいるすべての .hs から import 文を調べて、新規のモジュールから名前のリストを作ります。

ghc-mod は、少し時間のかかるコマンドです。結果をキャッシュするようにすれば、速くなることは分かっているのですが、そこまでやる必要があるのか思案中です。

ドキュメント

cabal でパッケージをインストールしているが、マニュアルをインストールしてない人は、以下のようにしましょう。

% cabal install パッケージ名 --enable-documentation --reinstall

野望

haskell-mode の行頭揃えはお粗末なので、なんとかしたいです。