前から予告していましたが、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" が通っているか確認。
(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 の行頭揃えはお粗末なので、なんとかしたいです。