cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

Vimにパッチが当てられるまでの間、Windowsでとりあえず外部grepを使えるようにする

mattn

jvgrepの問題、vimを直すしか方法ない
vimがCreateProcessWを使えば解決
たしかパッチは出してあってtodoに入ってたと思う

http://lingr.com/room/vim/archives/2013/12/05#message-17742024

とのことなので、それまでは我慢と工夫で乗り切るしかないのだ。

仕方ないので、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備忘録