読者です 読者をやめる 読者になる 読者になる

反省はしても後悔はしない

Vim とか備忘録とか。それと関数型言語勉強中

すごい Vim で Haskell を書こう ... の補足

Vim Haskell

この記事は Vim Advent Calendar の 274 日目の記事です。昨日は id:osyo-manga さんの unite-highlight つくった でした。

はじめに

先週の日曜日(8/25)になごやまつりというイベントがあり、そこで HaskellVim で書く方法というネタで LT をしてきました。発表するのが決まったのが前日ということもありちゃんとまとまった内容になっていなかったので、本エントリで少し補足を書きたいと思います。

とりあえず、インデントをどうにかする

発表では「Haskell のデフォルトのインデントプラグインは全然ダメ」という発言をしましたが、間違いでした。訂正します。 「Haskell のデフォルトのインデントプラグインなんてなかった!」

まさか、ないとは...。

という訳で、インデントプラグインを入れましょう。作者は Vim 界の神こと kana さんです。

NeoBundle 'kana/vim-filetype-haskell'

これで、↓みたいな残念な感じのが、

f:id:cohama:20130901013812p:plain

↓のようにちゃんとインデントされます。ただ、Haskell のインデントの計算は難しいっぽく常に正しいインデントが得られるとは限らないので適宜手動で調整が必要です。

f:id:cohama:20130901013829p:plain

型の表示

Haskell は静的型付け言語です。せっかく型の情報があるのでこれを Vim 上で表示できると便利そうです。

まず、外部コマンドの ghc-mod というものを用意します。これは cabal で簡単にインストールできます。

$ cabal install ghc-mod

あとは、このコマンドの出力を Vim から使えるようにする ghcmod.vim というプラグインを入れます。

NeoBundle 'eagletmt/ghcmod-vim'

Haskell のコード上でおもむろに :GhcModType すると現在のカーソルがある位置の項がハイライトされ、その型が下の方に表示されます。 ハイライトを消すには GhcModTypeClear します。常用するにはコマンドが長いので適当に \t とかにマップすると良いでしょう。

f:id:cohama:20130901013130p:plain

いい感じで補完をする

Haskell でも IDE のように空気を読んだ補完をしたいものです。これも ghc-mod でできるのでその出力を使って補完するプラグインがあれば可能になります。

NeoBundle 'Shougo/neocomplcache'
NeoBundle 'ujihisa/neco-ghc'

f:id:cohama:20130901013143p:plain

Haskell のコードを即座に実行する

ちょっと Haskell のコードを書くときなんかに、今編集しているファイルを Vim 上からすぐに実行できると便利です。そういう時のために 'quickrun' というプラグインがあります。Haskell だけでなく他にもいろいろな filetype に対応しています。

NeoBundle 'thinca/vim-quickrun'

f:id:cohama:20130901013232p:plain

Haskell のエラーを Vim 上に表示する

文法のエラーや型エラー何かを Vim 上で表示するととても便利です。これも ghc-mod でできるので、その結果を使うプラグインを入れましょう。

NeoBundle 'osyo-manga/vim-watchdogs'

vim-watchdogs を使うと ghc-mod を使ってチェックした結果を Quickfix に突っ込むことができます。それをさらに別のプラグインを使って Vim のウィンドウに結果を表示させています。このプラグインは Haskell 以外にも RubyJavaScript など他の filetype にも汎用に使えるので便利なのですが、依存関係や設定が少し面倒なのが玉に瑕です。詳しくはwatchdogs.vim つくりました - C++でゲームプログラミング で説明されています。

f:id:cohama:20130901013200p:plain

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 の結果が表示されます。

f:id:cohama:20130901013244p:plain

もっと 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 さんです。