Vimにパッチが当てられるまでの間、Windowsでとりあえず外部grepを使えるようにする
mattn
jvgrepの問題、vimを直すしか方法ない
http://lingr.com/room/vim/archives/2013/12/05#message-17742024
vimがCreateProcessWを使えば解決
たしかパッチは出してあってtodoに入ってたと思う
とのことなので、それまでは我慢と工夫で乗り切るしかないのだ。
仕方ないので、Grepというコマンドを作った。ついでにターゲット無指定の時には現在バッファ周辺を検索対象にすることにして利便性を高めた。
function! s:grep_for_cmdprompt(cmd, argstr) "{{{ let args = split(a:argstr, '\%(\\\@<!\s\)\+') let i = 0 while match(args, '^-', i)!=-1 let i+=1 endwhile let dflbase = expand('%:p:h') let dflbase = dflbase==?expand('$HOME') ? expand('%') : dflbase.'/**/*' let opts = i==0 ? '' : join(args[:i-1]) let pat = has('win32') ? iconv(escape(args[i], '#%'), 'utf-8', 'cp932') : escape(args[i], '#%') let target = i+1>=len(args) ? dflbase : join(args[(i+1):]) let g:greped = a:cmd. ' '. opts. ' -8 '. pat. ' '. target silent exe g:greped endfunction "}}} command! -nargs=+ -complete=file Grep call s:grep_for_cmdprompt('grep', '<args>')
しかし外部grepだと、% # といった特殊文字が展開されてしまうのでエスケープしないといけないのが辛いところ。
vimgrepだとエスケープの必要がない。差別である。
どうにか利用時にエスケープしなくても済むようにしようとしたけれど無駄だった。
関連エントリ:最新版のjvgrepをコンパイルするにはgo言語とMercurialが必要だった - LeafCage備忘録