選択範囲内を検索できないものかと調べていたら、素敵な設定があった。
以下の関数とキーマッピングを gvimrc に記述すれば、ビジュアルモードで選択した状態から / や ? で範囲内のみを対象とした検索が可能になる。
function! RangeSearch(direction) call inputsave() let g:srchstr = input(a:direction) call inputrestore() if strlen(g:srchstr) > 0 let g:srchstr = g:srchstr. \ '\%>'.(line("'<lt;")-1).'l'. \ '\%<lt;'.(line("'>")+1).'l' else let g:srchstr = '' endif endfunction " Each map should be on a single line vnoremap <lt;silent> / :<lt;C-U>call RangeSearch('/')<lt;CR>:if strlen(g:srchstr) > 0\|exec '/'.g:srchstr\|endif<lt;CR> vnoremap <lt;silent> ? :<lt;C-U>call RangeSearch('?')<lt;CR>:if strlen(g:srchstr) > 0\|exec '?'.g:srchstr\|endif<lt;CR>
Vim 7 からデフォルトでも検索できるが……
Vim 7 では、特別な設定をしなくても選択範囲内の検索ができる。が、以下のステップを踏まなければならない (hoge を検索する例)。
- ビジュアルモードで検索したい範囲を選択する
- ビジュアルモードを抜ける
- /\%Vhoge または /hoge\%V
範囲選択後に一度ビジュアルモードを抜けなければならないし、毎回 \%V をタイプするのは気が滅入るので、素直に設定ファイルをいじった方が良いと思う。 ちなみに、一度ビジュアルモードを抜けた後に、同じ範囲を選択をしなおすにはノーマルモードで gv とタイプする。