Hack #104: Visual mode で選択したテキストを検索する
Posted at 2009/11/25ツイート
Hack #51: カーソル下のキーワードを検索する ではカーソル下のキーワードを検索する方法を紹介しましたが、場合によってはキーワードではないけれどバッファ中にあるテキストで検索したいこともあります。
Visual mode の * に機能を割り当てる
Visual mode での * は Normal mode と同様カーソル下の単語を検索して次の単語出現位置にカーソルを動かしますが、選択範囲の文字列で検索をしてくれた方がNormal modeでの動作と対比して直感的でしょう。このキーに検索を行う機能を割り当てることで、Visual mode で選択中のテキストを検索することができます。 割り当てる方法はいくつかありますが、ここではなるべくシンプルなものを紹介します。
vnoremap <silent> * "vy/\V<C-r>=substitute(escape(@v,'\/'),"\n",'\\n','g'
)<CR><CR>
この設定では選択中のテキストを取得するために v レジスタを使用しています。もっとちゃんとやるにはレジスタの中身の退避などが必要ですが、長くなってしまうのでここでは割愛します。
解説
ここではこの設定が一体何をしているのか、簡単にですが解説します。
"vy
選択範囲を v レジスタにヤンク(コピー)しています。
/\V
検索のためのCommand-line modeを開始して先頭に \V を入力しています。\V についてはHack #55: 正規表現のメタ文字の扱いを制御するを参照してください。
<C-r>=
Command-line mode でこのキーをタイプするとネストするように新しいプロンプトに切り替わり、ここで入力した式の結果を前のプロンプトに挿入することができます。 余談ですが、この機能自体はネストすることはできません。
escape(@v,'\/')
@v には先ほどヤンクした選択範囲のテキストが入っています。この文字列で検索したいのですが、\ と / はそのままでは別の意味になってしまうので escape() を用いてエスケープしています。
substitute(escape(@v, '\/'),"\n",'\\n','g'
)
さらに改行文字を検索で使えるリテラルに置換しています。これは複数行を検索したい場合に必要な処理です。
<CR><CR>
一つ目の <CR> で <C-r>= で開始したプロンプトを確定しています。二つ目の <CR> で検索を実行しています。
thincaもどる
blog comments powered by Disqus