すごい Vim で Haskell を書こう ... の補足
この記事は Vim Advent Calendar の 274 日目の記事です。昨日は id:osyo-manga さんの unite-highlight つくった でした。
はじめに
先週の日曜日(8/25)になごやまつりというイベントがあり、そこで Haskell を Vim で書く方法というネタで LT をしてきました。発表するのが決まったのが前日ということもありちゃんとまとまった内容になっていなかったので、本エントリで少し補足を書きたいと思います。
とりあえず、インデントをどうにかする
発表では「Haskell のデフォルトのインデントプラグインは全然ダメ」という発言をしましたが、間違いでした。訂正します。 「Haskell のデフォルトのインデントプラグインなんてなかった!」
まさか、ないとは...。
という訳で、インデントプラグインを入れましょう。作者は Vim 界の神こと kana さんです。
NeoBundle 'kana/vim-filetype-haskell'
これで、↓みたいな残念な感じのが、
↓のようにちゃんとインデントされます。ただ、Haskell のインデントの計算は難しいっぽく常に正しいインデントが得られるとは限らないので適宜手動で調整が必要です。
型の表示
Haskell は静的型付け言語です。せっかく型の情報があるのでこれを Vim 上で表示できると便利そうです。
まず、外部コマンドの ghc-mod
というものを用意します。これは cabal で簡単にインストールできます。
$ cabal install ghc-mod
あとは、このコマンドの出力を Vim から使えるようにする ghcmod.vim
というプラグインを入れます。
NeoBundle 'eagletmt/ghcmod-vim'
Haskell のコード上でおもむろに :GhcModType
すると現在のカーソルがある位置の項がハイライトされ、その型が下の方に表示されます。
ハイライトを消すには GhcModTypeClear
します。常用するにはコマンドが長いので適当に \t
とかにマップすると良いでしょう。
いい感じで補完をする
Haskell でも IDE のように空気を読んだ補完をしたいものです。これも ghc-mod でできるのでその出力を使って補完するプラグインがあれば可能になります。
NeoBundle 'Shougo/neocomplcache' NeoBundle 'ujihisa/neco-ghc'
Haskell のコードを即座に実行する
ちょっと Haskell のコードを書くときなんかに、今編集しているファイルを Vim 上からすぐに実行できると便利です。そういう時のために 'quickrun' というプラグインがあります。Haskell だけでなく他にもいろいろな filetype に対応しています。
NeoBundle 'thinca/vim-quickrun'
Haskell のエラーを Vim 上に表示する
文法のエラーや型エラー何かを Vim 上で表示するととても便利です。これも ghc-mod でできるので、その結果を使うプラグインを入れましょう。
NeoBundle 'osyo-manga/vim-watchdogs'
vim-watchdogs を使うと ghc-mod を使ってチェックした結果を Quickfix に突っ込むことができます。それをさらに別のプラグインを使って Vim のウィンドウに結果を表示させています。このプラグインは Haskell 以外にも Ruby や JavaScript など他の filetype にも汎用に使えるので便利なのですが、依存関係や設定が少し面倒なのが玉に瑕です。詳しくはwatchdogs.vim つくりました - C++でゲームプログラミング で説明されています。
watchdogs 入れるの面倒だよという人はさっきの型の表示に使った ghcmod.vim でも同様のことができます。:GhcModCheckAndLintAsync とすると watchdogs と同様にチェックの結果を Quickfix に突っ込みます。
Vim から即座に hoogle を引く
hoogle というのは Haskell のリファレンスです。すごいやつです。例えば、人のソースコードを読むなどのときによく分からない関数などが出てきたらとりあえず、Hoogle を引きたいですよね。Vim から。これを可能にするのが ref-vim および ref-hoogle です。なお、実行には cabal install hoogle
が必要です。
NeoBundle 'thinca/vim-ref' NeoBundle 'ujihisa/ref-hoogle'
調べたいキーワードにカーソルを合わせて K
で hoogle の結果が表示されます。
もっと import を便利にする
Haskell では import 文はファイルの先頭にまとめるのが普通のようですね。しかし、いちいち先頭まで移動して import を書くのは面倒です。これを解決するのが unite-haskellimport
です。当たり前ですが unite.vim に依存します。あと hoogle も必要です。
NeoBundle 'Shougo/unite.vim' NeoBundle 'ujihisa/unite-haskellimport'
:Unite haskellimport
すると Unite のインターフェースでパッケージを選択→挿入できます。
詳しくは Vim-users.jp - Hack #241: Haskellで使いたい関数を使ってからそのモジュールをimportする を参照してください。
おわりに
すみません。偉そうに書いた割に実は Haskell は全然書けないのです。適当にネットとかで調べたのをまとめただけです。もっと Haskell を勉強すれば便利な機能とかプラグインとかに気づくかもしれません。頑張って勉強します。
明日は id:manga-osyo さんです。