36 howm-mode.vim (2-14) GrepSearch と VimGrepSearch の統合

howm-mode.vim の s:GrepSearch() の第2引数の意味を変更することで VimGrepSearch と統合した。Vim7 以降なら Vim正規表現が使用できるようになった。

" grepを使用してメモファイルを全文検索する.
"
" 固定文字列・正規表現 ( Vim ) の場合は
"  :vimgrep > g:howm_grepprg
" 正規表現 ( grep ) の場合は
"  g:howm_grepprg
" という優先順位で使用する.
"
" g:howm_grepprg の既定値は GNU grep ( windows では cygwin の GNU grep )
"
" searchWordType: searchWord の種類
"  0: 固定文字列
"  1: 正規表現 ( grep )
"  2: 正規表現 ( Vim )
function! s:GrepSearch(searchWord, searchWordType)
  redraw!
  echo s:prefix_howm.s:msg_wait_search
  let searchWord = a:searchWord
  let retval = ""
  let searchPath = s:HowmExpand(g:howm_dir)
  " 検索語の中に大文字が入っていなかったら大文字小文字を区別しない.
  let bIgnore = searchWord !~ '\C[A-Z]'

  " :vimgrep が使用可能 && ( 固定文字列 || 正規表現(Vim) )
  if (v:version >= 700 && has('quickfix')) && (a:searchWordType == 0 || a:searchWordType == 2)
    " TODO: HInr のうち I に対応できていない
    " TODO: &lazyredraw に意味があるか確認する
    " TODO: filename が若干違う
    if a:searchWordType == 0 | let searchWord = '\V' . escape(searchWord, '\/') | endif
    if bIgnore | let searchWord = '\C' . searchWord | endif
    let save_lazyredraw = &lazyredraw
    let &lazyredraw = 1
    let save_qflist = deepcopy(getqflist())
    silent! execute 'vimgrep /'. searchWord .'/gj '. searchPath .'**/*.*'
    let retval = join(map(getqflist(), "fnamemodify(bufname(v:val['bufnr']),':p:.:gs?\\?/?').':'.v:val['lnum'].':'.v:val['text']"), "\n")
    call setqflist(save_qflist)
    let &lazyredraw = save_lazyredraw
    return retval
  elseif a:searchWordType == 2
    " :vimgrep 以外で正規表現(Vim)は扱えないためエラー
    " TODO: エラーメッセージ
    return retval
  elseif g:howm_grepprg == ""
    if &encoding != g:howm_fileencoding
      let searchWord = iconv(searchWord, &encoding, g:howm_fileencoding)
    endif
    let grepopt = ''
    if a:searchWordType == 1
      let grepopt = grepopt.'E'
    else
      let grepopt = grepopt.'F'
    endif
    if bIgnore
      let grepopt = grepopt.'i'
    endif
    let retval = retval.GrepSearch(searchWord, searchPath, grepopt)
    let retval = iconv(retval, g:howm_fileencoding, &encoding)
  elseif !executable(g:howm_grepprg)
    call HowmDebugLog('GrepSearch:Can^t Execute g:howm_grepprg='.g:howm_grepprg)
    let errmsg = s:errmsg_inexecutable
    let errmsg = substitute(errmsg, '%prg%', g:howm_grepprg, 'g')
    let errmsg = substitute(errmsg, '%var%', 'howm_grepprg', 'g')
    redraw!
    echomsg s:prefix_howm.errmsg
    return ''
  else
    if has("win32")
      let searchPath = '"'.searchPath.'"'
    endif
    let grepcmd = 'g:howm_grepcmd'
    if a:searchWordType == 1
      let grepcmd = grepcmd.'_regexp'
    else
      let grepcmd = grepcmd.'_fix'
    endif
    if bIgnore
      let grepcmd = grepcmd.'_ignore'
    endif
    call HowmDebugLog('GrepSearch:GrepCmd'.grepcmd)
    let retval = retval.HowmExecuteSearchPrg({grepcmd}, g:howm_grepprg, searchPath, searchWord, &encoding, g:howm_fileencoding)
  endif
  redraw!
  echo s:prefix_howm.s:msg_wait_search.s:msg_done
  call HowmDebugLog('FindSearch:Retval='.retval)
  return retval
endfunction

変更点は、前半の条件分岐と searchWordType 。searchWordType は以前は bRegexp で 0 or 1 だった。2 を解釈するように変更した。次回は、呼び出し部分を変更する。