watchdogs.vimとUnite.vimを布教する

[前回の記事](http://qiita.com/mihyaeru21/items/4fa284e1d3ae5093c70c)の続きで、口頭説明の補足資料として公開する。
Ubuntu環境でPerlを書く人向けのやつ。

今回はこの２つのプラグインについて紹介する。

- watchdogs.vim
- Unite.vim

## watchdogs.vim
### 概要

開いているファイルのシンタックスチェックができるプラグイン。
導入方法や詳しい使い方は、作者による[解説記事](http://d.hatena.ne.jp/osyo-manga/20120924/1348473304)が詳しい。
ここでは、ちょっと特殊なPerl向けの設定方法を紹介する。

個人的には、Perl以外には[Syntastic](https://github.com/scrooloose/syntastic)を使っている。
Perlは業務で使用しており規模が大きく、Syntasticの同期的なシンタックスチェックだとかなりストレスが溜まるため、非同期実行できるwatchdogs.vimを使用している。
(NeoVim向けに[Neomake](https://github.com/neomake/neomake)というプラグインが出ていて気になっている。)

### 入れるプラグイン

NeoBundle向け

```vim:~/.vimrc
NeoBundle 'Shougo/vimproc.vim', {
\ 'build' : {
\     'windows' : 'tools\\update-dll-mingw',
\     'cygwin'  : 'make -f make_cygwin.mak',
\     'mac'     : 'make',
\     'linux'   : 'make',
\     'unix'    : 'gmake',
\   },
\ }
NeoBundle 'thinca/vim-quickrun'
NeoBundle 'jceb/vim-hier'
NeoBundle 'dannyob/quickfixstatus'
NeoBundle 'osyo-manga/shabadou.vim'
NeoBundle 'osyo-manga/vim-watchdogs'
```

dein向け(toml形式)

```:~/.vim/dein.toml
[[plugins]]
repo = 'Shougo/vimproc'
hook_post_update = '''
  if dein#util#_is_windows()
    let cmd = 'tools\\update-dll-mingw'
  elseif dein#util#_is_cygwin()
    let cmd = 'make -f make_cygwin.mak'
  elseif executable('gmake')
    let cmd = 'gmake'
  else
    let cmd = 'make'
  endif
  let g:dein#plugin.build = cmd
'''

[[plugins]]
repo = 'thinca/vim-quickrun'

[[plugins]]
repo = 'jceb/vim-hier'

[[plugins]]
repo = 'dannyob/quickfixstatus'

[[plugins]]
repo = 'osyo-manga/shabadou.vim'

[[plugins]]
repo = 'osyo-manga/vim-watchdogs'
```

### 設定

Perlだけで動いて欲しいので、この設定を行う。

```vim:~/.vimrc
let g:watchdogs_check_BufWritePost_enables = {
\   'perl' : 1,
\ }
```

### 独自設定

普段の環境ではPerlを実行するときは、実行環境を揃えるためにプロジェクト下の`env.sh`的なやつをかませている。
`perl -wc filepath`としただけでは適切にチェックできず、`./env.sh perl -wc filepath`とする必要がある。
そのため、watchdogsのデフォルトの設定では正しくチェックが行えないので、次のような設定を加える。

```vim:~/.vimrc
let g:quickrun_config = {} " 別の場所で定義済みなら不要
let g:quickrun_config["watchdogs_checker/perl-with-env"] = {
\   "command"     : './env.sh',
\   "exec"        : "%c perl -wc %s:p",
\   "errorformat" : '%m\ at\ %f\ line\ %l%.%#',
\ }
let g:quickrun_config["perl/watchdogs_checker"] = {
\   "type" : "watchdogs_checker/perl-with-env",
\ }

call watchdogs#setup(g:quickrun_config)
```

### 動かしてみる

- ダメそうな実装で保存する
- 怒られる
- よっしゃ

## Unite.vim
### 概要

[Unite.vim](https://github.com/Shougo/unite.vim)は、`何かのリスト`から選択して`何かの操作`を実行するプラグイン。
例えば以下の様なことが、全く同じインタフェースで扱える。

- `ディレクトリ以下のすべてのファイル` から選択して `ファイルを開く`
- `最近開いたファイル` から選択して `ファイルを開く`
- `ファイルのすべての行` から選択して `行へ移動`
- `クラスのアウトライン` から選択して `メソッドへ移動`
- `grepやagの検索結果` から選択して `ファイルを開き、その行へ移動`

適当に文字を入力して曖昧にフィルタリングできることが極めて便利。
~~ぶっちゃけ、EmacsのHelmやコマンドラインツールのpecoのアレ~~

ここでデモ。

### 入れるプラグイン

NeoBundle向け

```vim:~/.vimrc
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/neomru.vim'
NeoBundle 'Shougo/unite-outline'
```

dein向け(toml形式)

```:~/.vim/dein.toml
[[plugins]]
repo = 'Shougo/unite.vim'

[[plugins]]
repo = 'Shougo/neomru.vim'

[[plugins]]
repo = 'Shougo/unite-outline'
```

### 設定

これだけ設定しておけば、とりあえずは十分そうなやつ。

```vim:~/.vimrc
let g:unite_enable_smart_case = 1
```

### 検索にagを使う設定

`grep`は遅いので`ag`で検索したい。

```vim:~/.vimrc
if executable('ag')
    let g:unite_source_grep_command       = 'ag'
    let g:unite_source_grep_default_opts  = '--nogroup --nocolor --column'
    let g:unite_source_grep_recursive_opt = ''
endif
```

### マッピングを晒す

自分が普段使っている設定の一部。

```vim:~/.vimrc
nnoremap [unite] <Nop>
nmap <Space>u [unite]
nnoremap [unite]f :<C-u>Unite file_rec/git -start-insert<CR>
nnoremap [unite]m :<C-u>Unite file_mru -start-insert<CR>
nnoremap [unite]l :<C-u>Unite line -start-insert<CR>
nnoremap [unite]o :<C-u>Unite outline -start-insert<CR>
nnoremap [unite]a :<C-u>Unite grep:. -start-insert<CR>
nnoremap [unite]r :<C-u>UniteResume -start-insert<CR>
```

このマッピングは、上から順に最初に上げたユースケースに(ほぼ)対応している。

- `ディレクトリ以下のすべてのファイル` から選択して `ファイルを開く`
- `最近開いたファイル` から選択して `ファイルを開く`
- `ファイルのすべての行` から選択して `行へ移動`
- `クラスのアウトライン` から選択して `メソッドへ移動`
- `grepやagの検索結果` から選択して `ファイルを開き、その行へ移動`
- (前回Uniteで開いたリストを再表示)

`ディレクトリ以下のすべてのファイル`は、本当は`file_rec`と指定したいところだが、ある程度の規模もプロジェクトでファイル数が多い場合(特に外部モジュールをプロジェクト以下に配置するパターン)に、実用的ではない速度になってしまう。
そのため、git管理下のファイルのみを対象とした`file_rec/git`を代わりに使用している。

### 動かしてみる

- 例示したユースケースを何度も実行する
- べんりっっ


## 終わりに

諸事情により、次があるのかはわからないけども今回はこれくらいにて。