VimでPerl（に限らないけど）を書くときにこれだけはやってほしい設定

他におすすめあれば教えてください。Perl始めたてな人に教えたいのに加えて、叩き台にして識者の意見をもらいたいという意味でも書いています。

# 1. 下準備

## まずはプラグイン管理ツールVundleを導入する

### Vundleをダウンロード

```sh
$ cd ~/.vim
$ git clone git://github.com/gmarik/vundle.git vundle
```

.vimrc にこのように記述

```vim:.vimrc
filetype plugin on

" vundleを使うためのおまじない
set rtp+=~/.vim/vundle/
call vundle#rc('~/.vim/bundle')

" 使うプラグインを指定
Bundle 'petdance/vim-perl'
Bundle 'hotchpotch/perldoc-vim'
Bundle 'Shougo/neocomplcache'
Bundle 'Shougo/neocomplcache-snippets-complete'
Bundle 'thinca/vim-quickrun'
```

### Bundle 'plugin name' で書いたプラグインをローカルにダウンロード

vimを開きなおして :BundleInstall と打てばダウンロードが走る。

~/.vim/bundle 以下にちゃんとインストールされていることを確認。

```sh
$ ls ~/.vim/bundle/
vim-perl/
perldoc-vim/
neocomplcache/
neocomplcache-snippets-complete/
vim-quickrun/
```

# 2. 補完の設定をする

先ほど入れた neocomplcache というプラグインで補完をするためにいろいろ設定。

.vimrc にこのように書く。とりあえず動く。カスタマイズしたい人はドキュメント ~/.vim/bundle/neocomplcache/README.md を読めばいろいろ分かる。

```vim:.vimrc
" Disable AutoComplPop.
let g:acp_enableAtStartup = 0
" Use neocomplcache.
let g:neocomplcache_enable_at_startup = 1
" Use underbar completion.
let g:neocomplcache_enable_underbar_completion = 1
" Set minimum syntax keyword length.
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*'

 " Use smartcase.
let g:neocomplcache_enable_smart_case = 1
" Use camel case completion.
let g:neocomplcache_enable_camel_case_completion = 1
" Select with <TAB>
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"

let g:neocomplcache_ctags_arguments_list = {
  \ 'perl' : '-R -h ".pm"'
  \ }

let g:neocomplcache_snippets_dir = "~/.vim/snippets"
" Define dictionary.
let g:neocomplcache_dictionary_filetype_lists = {
    \ 'default'    : '',
    \ 'perl'       : $HOME . '/.vim/dict/perl.dict'
    \ }

" Define keyword.
if !exists('g:neocomplcache_keyword_patterns')
  let g:neocomplcache_keyword_patterns = {}
endif
let g:neocomplcache_keyword_patterns['default'] = '\h\w*'

" for snippets
imap <expr><C-k> neocomplcache#sources#snippets_complete#expandable() ? "\<Plug>(neocomplcache_snippets_expand)" : "\<C-n>"
smap <C-k> <Plug>(neocomplcache_snippets_expand)
```

## 辞書ファイルを入れる

Perlの辞書ファイルを入れる。これでPerlの組み込み関数や構文で使う単語はすべて補完してくれるようになる。

```sh
$ mkdir ~/.vim/dict
$ cd ~/.vim/dict
$ wget https://raw.github.com/Cside/dotfiles/master/.vim/dict/perl.dict
```

## コードスニペットを作る

よく使うイディオム（？）を毎回すべて打つのはDRYに反するのでスニペットして登録してしまう。

```sh
$ mkdir ~/.vim/snippets
$ cd ~/.vim/snippets
$ wget https://raw.github.com/gist/2146105/464170751812997fc3b655cb547e2b5a929e9eb6/perl.snip
```

### スニペットを呼び出す

上で登録したスニペットのひとつを試しに呼び出してみる。Vimを開き直した後で、インサートモードで u と打った後に Ctrl + k すると、

```perl
    #!/usr/bin/env perl
    use 5.10.0;
    use strict;
    use warnings;
```

がinsertされる。

ほかにどのようなスニペットが使えるかは vim ~/.vim/snippets/perl.snip で確認してみる。そして必要に応じてガンガン自分で作っていく。

# 保存時にシンタックスエラーを検知するように

実行エラーになったとき、エラーメッセージの行数を確認してソースコードの該当行を探して…というのは人間の目でやるのは馬鹿げてますね。エラーを吐いている行を勝手に教えて欲しいもんです。

そこで Errormaerker.vim というのを使う。

```sh
$ sudo cpanm Project::Libs
$ cd ~/.vim
$ wget https://raw.github.com/Cside/dotfiles/master/.vim/vimparse.pl
$ chmod +x vimparse.pl
$ mkdir -p ftplugin/perl
$ cd ftplugin/perl
$ wget https://raw.github.com/Cside/dotfiles/master/.vim/ftplugin/perl/flyquickfixmake.vim
```

Vimで適当なPerlファイルを開き、わざとシンタックスエラーなプログラムを書いて保存してみる。エラー行にカーソルがフォーカスされるのを確認する。

# 3. その他のプラグインの解説

やべえ書くの飽きてきたｗ 後少しだ頑張れ俺ｗｗｗ

ここで使い方を解説するのはすべて先ほど入れたやつ。

## perldoc-vim

Vimの中でperldocを引ける。

Perlプログラムの中で、モジュール名（LWP::UserAgent みたいな）にカーソルをフォーカスした後 Shift + k すると、ウィンドウがもうひとつ開いて POD が表示される。

## quickrun.vim

編集->vimを抜けてコンソールで実行->シンタックスエラー->vimにもどって修正->vimを抜けてコンソールで実行->シンタックスエラー…と、Vimとコンソールを行ったり来たりするのはタイムロス。Vimの中でスクリプトを実行したい。

編集しているスクリプトをその場で実行できる。いちいちvimを抜けて $ perl script.pl する必要がなくなる。

.vimrc でキーバインドを設定する。僕は \ + r にしている。

```vim:.vimrc
nmap <Leader>r <plug>(quickrun)
```

これで、Perlスクリプトを編集中に \ + r するとその場で実行される。

# 4. オマケ

## $ とか @ をうつのだるい。指を遠くまでのばしたくない

```vim:.vimrc
inoremap <C-d> $
inoremap <C-a> @
```

で Ctrl + d をドル、 Ctrl + a をアットにしている。

## .psgi とか .t も Perlなシンタックスハイライトをしてほしい

```vim:.vimrc
autocmd BufNewFile,BufRead *.psgi   set filetype=perl
autocmd BufNewFile,BufRead *.t      set filetype=perl
```

## ほかにおすすめなプラグイン

☆：unite.vim, align.vim
◎：surroound.vim, unite-outline, eregex.vim

詳しくはぐぐってｗ

# 5. More?

* [vimプラグインでよりよいコーディングを | tech.kayac.com - KAYAC engineers' blog](http://tech.kayac.com/archive/vim-plugin-coding.html) （must read）
* https://github.com/Cside/dotfiles （僕のdotfiles）
* [僕がよく参考にしている .vimrc](https://github.com/zentooo/rc/blob/master/.vimrc)