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 を解釈するように変更した。次回は、呼び出し部分を変更する。