vimの外部grepでackを使う

ackというperl製のgrepがいいという情報を聞いたのでvimの外部grepで使えるようにしてみた。
.vimrcはこんな感じ。

追記: ackが使えない場合のことも考慮しました。

" grep設定
if executable('ack')
    set grepprg=ack\ --nogroup
    set grepformat=%f:%l:%m
else
    set grepprg=grep\ -Hnd\ skip\ -r
    set grepformat=%f:%l:%m,%f:%l%m,%f\ \ %l%m
endif

ついでに拡張子を指定できるように独自コマンドも作ってみた。

" 拡張子指定grep
command! -complete=file -nargs=+ Grep call s:grep(<f-args>)
function! s:grep(pattern, directory, ...)
    let grepcmd = []
    call add(grepcmd, 'grep')
    if executable('ack')
        if a:0 && a:1 != ''
            call add(grepcmd, '--' . a:1)
        else
            call add(grepcmd, '--all')
        endif
    else
        if a:0 && a:1 != ''
            call add(grepcmd, '--include="*.' . a:1 . '"')
        endif
    endif
    call add(grepcmd, a:pattern)
    call add(grepcmd, a:directory)
    execute join(grepcmd, ' ')
endfunction

使い方は

Grep pattern directory perl

みたいな。

また上には書いてるけどackのオプションに --nogroup は付けなくても特に問題はないみたい。
理由は不明・・。