NeoVim + Elixirで開発環境を設定してみた


最近はNeoVimでElixirを書いていて、ちょっとずつ色々試していったが、最近は大分落ち着いてきたので棚卸しも含めてまとめてみる。

## 前提

elixir.nvimがNeoVimに依存しているのでNeoVimを利用する。
[dein](https://github.com/Shougo/dein.vim),[deoplete](https://github.com/Shougo/deoplete.nvim)は必須。

## 使っているplugin達

* [vim-elixir](https://github.com/elixir-lang/vim-elixir)
* [elixir.nvim](https://github.com/awetzel/elixir.nvim)
* [vim-phoenix](https://github.com/avdgaag/vim-phoenix)
* [vim-slim](https://github.com/slim-template/vim-slim)
* [vim-watchdog](https://github.com/osyo-manga/vim-watchdogs)
* [neosnippet](https://github.com/Shougo/neosnippet.vim)

### vim-elixir

とりあえず定番。シンタックスハイライト、インデントを解決してくれるので何も気にせずにいれている。
パイプを書いた時のインデントが気になるので、他のpluginも検討してみたい。

### elixir.nvim

NeoVimに切り替えた要因はこのplugin。このplugin + deopleteで快適に補完できる。
いま見てみたら`vim-ref`と連携もできるようになっていて着実に進化しているのも嬉しい。

### vim-phoenix

model, controllerの移動が便利になるのと、EExのタグが`vim-surround`使って楽に入力できる。
でも、テンプレートにslim(slime)使ってしまっているので、正直最近はあまり使ってない。
また、色々見ていたら[phoenix.vim](https://github.com/c-brenn/phoenix.vim)なるものを発見したので、こちらも試してみてよければアップデートしてみたい。


### vim-slim

最近はtempleteにslim(slime)を使っているので、シンタックスハイライトに利用。

### vim-watchdog

設定は[こちら](http://qiita.com/uochan/items/50866be299d63ddc5133#%E3%82%B7%E3%83%B3%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B9%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%AE%E8%A8%AD%E5%AE%9A)を参考にさせていただいた。
↑の設定では`elixir`を利用していたが、PhoenixFrameworkを使っていると`use App.Web, :model`のところでエラーを拾ってしまって見づらい。そのため、自分は`mix compile`を利用している。
以前は`Syntastic`を利用していたが、コードが増えてくると保存のたびにかなり待たされるようになってしまったので、`vim-watchdog`に変更した。


### neosnippet

vim-phoenixでultisnips用のsnippetが定義されていたのが、自分はneosnippetを使っているので書き換えた。
一つだけPhoenixFrameworkでdebug用に`IEx.pry`を呼び出すためのsnippetを追加した。`IEx.pry`は多用しているので自分的には一番利用頻度が高い。

```
snippet   pipe
abbr      pipeline
options   head
   pipeline :${1:browser} do
     ${2}
   end

snippet   pipe
abbr      pipe_through
options   head
   pipe_through :${1:browser}

snippet   get
abbr      GET route
options   head
   get "${1:/}", ${2:Project}Controller, :${3:index}

snippet   post   
abbr      POST route
options   head
   post "${1:/}", ${2:Project}Controller, :${3:create}

snippet   put   
abbr      PUT route
options   head
   put "${1:/}", ${2:Project}Controller, :${3:update}

snippet   delete   
abbr      DELETE route
options   head
   delete "${1:/}", ${2:Project}Controller, :${3:destroy}

snippet   res   
abbr      resources route
options   head
   resources "/${1:projects}", ${2:Project}Controller

snippet   res        
abbr      resource route
options   head
   resource "/${1:project}", ${2:Project}Controller

snippet   scope     
abbr      routing scope
options   head
   scope "${1:/}", ${2:MyApp} do
     $0
   end

snippet   socket   
abbr      socket route
options   head
   socket "/${1:ws}", ${2:MyApp} do
     $0
   end

snippet   channel   
abbr      socket channel route
options   head
   channel "${1:notifications}", ${2:Notification}Channel

snippet   redirect         
abbr      redirect(conn, to:...)
options   head
   redirect(${1:${2:conn}, }to: ${3:${4:project}_path(${5:conn}, :${6:index})})

snippet   render         
abbr      render(conn, view, assigns)
options   head
   render ${1:conn}, "${2:view}", ${3:#:content}: ${0}

snippet   dbg
abbr      require IEx; IEx.pry
options   head
   require IEx; IEx.pry
```

## ctags

ctagsは[ここ](https://github.com/mmorearty/elixir-ctags/blob/master/.ctags)の設定をそのまま利用。
最初はあまり使ってなかったが、コードを読むときには重宝する（特にライブラリ読まなきゃいけない時とか・・・）。
tagsファイルにJavaScriptの定義も混ざってしまっているので、設定しなおしたい。

## その他

```
imap >> \|><Space>
```

Elixirのパイプ`|>`を`>`2回押しで入力できるようにするkey map。[こちら](http://qiita.com/uochan/items/50866be299d63ddc5133#%E3%82%AD%E3%83%BC%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0)を参考にさせていただいた。
今やこれなしではElixir書けません。と言っても過言ではないほど自分の生産効率を向上させている。
普通に打つとElixirのパイプ書きにくい・・

```
set foldmethod=indent
```

Elixirのコードは折り畳みうまくいかないなと思って調べたら[ここ](https://github.com/elixir-lang/vim-elixir/issues/88)に書いてあった。
コードを読む時間が増えてくると、必要な箇所だけ読みたくなってくるので、折り畳みされていると非常にコードを読むのが捗る。

## まとめ

書いていたらあれもこれもと入れたくなったのと、ここ直したかったんだとかが見つかって、自分の棚卸しができた。
以前ctags用のpluginを探したがなかなかしっくりくるものがなかった。もう一回色々試してみたい。