ビジュアルモードで選択した範囲内を検索する

選択範囲内を検索できないものかと調べていたら、素敵な設定があった。

以下の関数とキーマッピングを 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 を検索する例)。

  1. ビジュアルモードで検索したい範囲を選択する
  2. ビジュアルモードを抜ける
  3. /\%Vhoge または /hoge\%V

範囲選択後に一度ビジュアルモードを抜けなければならないし、毎回 \%V をタイプするのは気が滅入るので、素直に設定ファイルをいじった方が良いと思う。 ちなみに、一度ビジュアルモードを抜けた後に、同じ範囲を選択をしなおすにはノーマルモードで gv とタイプする。