Home > Vim Hacks > Hack #104: Visual mode で選択したテキストを検索する

Hack #104: Visual mode で選択したテキストを検索する

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

Comments:0

Comment Form
Remember personal info

Trackbacks:1

Trackback URL for this entry
http://vim-users.jp/2009/11/hack104/trackback/
Listed below are links to weblogs that reference
Hack #104: Visual mode で選択したテキストを検索する from Vim-users.jp
trackback from 永遠に未完成 09-11-25 (水) 21:12

[vim] visualstar.vim 書いた

Vim-users.jp – Hack #104: Visual mode で選択したテキストを検索する で Visual mode で * を使う方法を紹介したけど、いささかやっつけ感があるので、もう少しマシなものを書いてプラグイン化して…

Home > Vim Hacks > Hack #104: Visual mode で選択したテキストを検索する

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • プラグイン
  • vimrc
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top