VimでClojureを良い感じに使うためのアレ

Clojure良いよClojure!!最近のマイブーム

が、変化が速く?日本語で見つかる情報が若干古く、Vimでの環境構築に苦労したのでメモ。 もちろん自分用のメモなのでMac向けな内容。 ここの内容を自分が実際にやった内容を思い出しながら書いた。

到達目標

  • Leiningenでプロジェクト作ったり何やら
  • VimClojureからNailgunに繋いでVim内でREPLとか特定の行を評価したり ←これがメイン

Leiningen

Homebrewで入る。簡単。

brew install leiningen
# プロジェクトを作る
lein new hoge

# 依存関係を解決済みなREPLを起動する
lein repl

# あとはへるぷ嫁
lein help

続いて、Leiningenのプラグインを入れる。 ~/.lein/profiles.cljを編集し、lein-tarsierを読み込むようにしておく。

{:user {:plugins [[lein-tarsier "0.10.0"]]}}

lein depsして依存関係を解決したらlein vimclojureサブコマンドが使えるようになる。

これでLeiningen側の準備はOK!

Nailgun

Nailgunは、JVMを立ち上げっぱなしにしておくことでJVMを起動する時間を短縮してプログラムの実行時間を短くしてくれる君…という認識で合っているのかな。 怪しいけど、ひとまず「起動を速くしてくれる」機能が間違いなく備わっているはず。

Homebrewにパッケージがあるけど、これを使ってはならない。 VimClojureから接続するときに、なんか上手く繋がらない。 これでかなり時間を取られてしまった感あるのでご注意を。

VimClojureのリポジトリをダウンロードし、解凍しmakeする。 出力されたngが実行可能であるか確認し、パスが通っている場所に放り込む。 (参考にしていたドキュメントでは作者氏のサイトへの直リンクが貼ってあったけど、それを転載するのはアレなのでリポジトリのリンクを貼ってある)

cd kotarak-vimclojure-22bbb523b401/client
make
mv ng ~/bin/

これでNailgunの準備はOK!

VimClojure

NeoBundleでVimClojureを入れる。

NeoBundle 'VimClojure'

こんな感じで設定する。

let vimclojure#WantNailgun       = 1     " Nailgunを要求する
let vimclojure#NailgunClient     = "ng"  " Nailgunのクライアントコマンド
let vimclojure#HighlightBuiltins = 1     " ビルトイン系をハイライト
let vimclojure#ParenRainbow      = 1     " カッコの色を階層に応じてカラフルにする

これでVimClojureの準備はOK!

いざ、試す

プロジェクトを作る。

lein new hoge
cd hoge

lein vimclojureコマンドを実行して放置する。 ちなみに、下記の表示が出て止まる。

$ lein vimclojure
Starting VimClojure server on localhost, port 2113
Happy hacking!

この状態で、別のウィンドウにてVimを開く。 エラーが表示されなければ、Nailgunへ接続できているはず。

src/hoge/core.cljを次のように変更し(末尾にfooを使うコードを追加しただけ)、おもむろに\efと入力する! (\<Leader>のこと)

(ns hoge.core)

(defn foo
  "I don't do a whole lot."
  [x]
  (println x "Hello, World!"))

(foo "hoge")

するとVimのウィンドウが2つにわかれ、上部にはこのような表示が出る。 これはsrc/hoge/core.cljを評価した結果だ! \efは、REPLでファイル全体を評価した結果を表示してくれる。

; Use \p to close this buffer!

nil
#'hoge.core/foo
hoge Hello, World!
nil

(foo "hoge")の行にカーソルがある状態で\etとすると、その行のみを評価することができる。

; Use \p to close this buffer!

hoge Hello, World!
nil

\sRで、現在開いているファイルのネームスペースにてREPLがVim上で起動する! 普通のREPLと同じように評価したい式を入力してエンターで評価してくれる。

Clojure
hoge.core=> (foo "hoge")
hoge Hello, World!
nil
hoge.core=> 

ちなみに、\srではuserネームスペースにてREPLを起動する。

Clojure
user=> (use 'hoge.core)
nil
user=> (foo "hoge")
hoge Hello, World!
nil
user=> 

この辺が使えればだいぶ捗るようになるはず。 デフォルトのマッピングが自分には合わないので、押しやすそうなマッピングに変更する(そのうち...)。

カーソルがある部分のドキュメントを検索したり、ソースを表示したり検索したり、他にもいろいろできる。 あとは:h vimclojure.txtを見て頑張るぞい!