Elixir初心者がVimで開発環境を整えてみた


Elixir初心者でわかってないことだらけなので、より良い設定が見つかればあとから変更予定です。

Elixir のインストール手順はこの記事では省略します。

最終更新: 2015/08/24

## 2015/08/24: Vimプラグイン化します

この記事にまとめていた内容についてですが、細かく書いていくときりがないので、
環境構築のサポートを目的とした Vim プラグインを用意し始めました。

* https://github.com/liquidz/vivi.vim

基本的にはこのプラグインを入れれば、(主に自分が) いい感じに Elixir 開発できるようにしていくので、もしよろしければ使ってみてください。
ビビ可愛いよビビ。

## 使用するプラグイン

プラグインのインストールは [NeoBundle](https://www.google.co.jp/search?q=neobundle&ie=utf-8&oe=utf-8&hl=ja) なりなんなりで適当にインストールしてください。

* [vim-elixir](https://github.com/elixir-lang/vim-elixir)
* [vim-quickrun](https://github.com/thinca/vim-quickrun)
* [vim-watchdogs](https://github.com/osyo-manga/vim-watchdogs)
* [vim-yacd](https://github.com/liquidz/vim-yacd)
 * 拙作プラグインですが利用は任意。理由は後述します。
* [neosnippet](https://github.com/Shougo/neosnippet)
 * [neosnippet-snippets](https://github.com/Shougo/neosnippet-snippets)

## キーマッピング
**2015/08/23追記**

パイプ `|>` はよく使うわりに入力しづらい気がしているので、`>>` で入力できるようにしました。

* ftplugin/elixir.vim

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

## vim-elixir

* シンタックスハイライトやインデントなどをよしなにしてくれるので、何も考えずにインストールします。
* インストールするのみで設定は特になしです。

## vim-quickrun

言わずと知れた quickrun です。
デフォルトでスクリプトの実行には対応していますが、
`mix test` も quickrun で実行できるようにしたいのでその設定を追加します。

### quickrun で mix test

下記の例では `<Leader>t` で `mix test` を実行するようにしています。
`hook/cd/directory` に mix.exs があるディレクトリを指定するため拙作のプラグインを使っていますが、同じことができれば別プラグインでも個別に関数定義でも問題ありません。

なお `errorformat` は適当に書いたので、使っていて不満があればその都度変更する予定です。

* ftplugin/elixir.vim
 * **2015/08/23修正**: CompileError系も検知できるようにした

```vim
let g:quickrun_config.mix_test = {
    \ 'command'     : 'mix',
    \ 'exec'        : 'mix test',
    \ 'outputter'   : 'quickfix',
    \ 'errorformat' : '%E\ %#%n)\ %.%#,%C\ %#%f:%l,%Z%.%#stacktrace:,%C%m,%.%#(%.%#Error)\ %f:%l:\ %m,%-G%.%#',
    \ 'hook/cd/directory': yacd#get_root_dir(expand('%:p:h'))
    \ }

nnoremap <Leader>t :QuickRun mix_test<CR>
```

## vim-watchdogs

シンタックスチェッカーでは [Syntastic](https://github.com/scrooloose/syntastic) が Elixir をサポートしているようですが、
私は watchdogs 派なので、watchdogs でシンタックスチェックできるようにします。

### シンタックスチェックの設定

~~Syntastic が内部で `mix compile` を実行してその結果をチェックしていたので、それをパクります。~~
**2015/08/06修正**: `mix compile` だとテストコードのシンタックスチェックができなかったので `elixir` での実行結果をチェックするよう修正しました。

`hook/cd/directory` は `mix test` の箇所で説明したのと同様で、
`errorformat` も同様に適当に書いたものなので、不満がでてきたらあとで修正予定です。

* `g:quickrun_config` を設定しているファイル

```vim
let g:quickrun_config = {
    \   'watchdogs_checker/elixir': {
    \     'command'     : 'elixir',
    \     'exec'        : '%c %s',
    \     'errorformat' : '**\ (%.%#Error)\ %f:%l:\ %m,%-G%.%#',
    \     'hook/cd/directory': yacd#get_root_dir(expand('%:p:h'))
    \   },
    \   'elixir/watchdogs_checker': {
    \     'type' : 'watchdogs_checker/elixir',
    \   }
    \ }
```

## vim-yacd

vimscriptの勉強用に作ったプラグインです。

以下のように `root_names` を定義しておくと
上記の例のように `yacd#get_root_dir` 関数で mix.exs のある親ディレクトリを検索してくれます。

```vim
let g:yacd#root_names = ['mix.exs', '.git']
```

## neosnippet

**2015/08/23追記**

### mix.exs でのお約束事を書きやすくする

`mix new` で生成されるデフォルトのテンプレートでは、Hex.pm に publish するには情報が足りません。
ですが、それを毎回コピペするのでは非効率なので、snippet を作りました。
これはまだ作って試し始めたばかりなので、もっと良い方法がみつかれば変更したいと思ってます。

* snippet の置き場所を定義

```vim
let g:neosnippet#snippets_directory = $HOME . '/.vim/snippets'
```

* ~/.vim/snippets/elixir.snip

```neosnippet
snippet     project
abbr        project
    @url "https://github.com/FIXME/${1}"
    @description """
    FIXME
    """
    
    def project do
      [
        app:          :$1,
        version:      "0.0.1",
        elixir:       "~> 1.0",
        name:         "$1",
        source_url:   @url,
        description:  @description,
        package:      package,
        deps:         deps
      ]
    end

snippet     package
abbr        package
    defp package do
      [
        contributors: ["Your Name"],
        licenses:     ["MIT"],
        links:        %{"Github" => @url}
      ]
    end
```


## まとめ

ここまでの設定で実行、テスト、シンタックスチェックだけは実現できました。
それ以外については勉強を進める中で追加していき、この記事にも反映していけたらと思います。

こんな設定便利だよーというのがあれば教えていただけると幸いです。