« 2012年2月 | トップページ | 2012年4月 »

2012年3月

2012年3月30日 (金)

[vim]ハイライトサーチ(hlsearch)、検索パターンの再利用

ハイライトサーチを設定しているvimで二つ以上のファイルが別々のバッ ファに開いているとする。このとき、どれかのバッファで「:/(パターン)」 (前方検索)や「:?(パターン)」(後方検索)により検索する。ハイライトサー チが設定されているとヒットした部分が強調表示される。ヒット箇所を辿る には「n」(next)か「shift+n」を使う(shift+/が?になる)。

私は、vimの設定ファイル~/_vimrcに「set hlsearch」を書き込んでいるの でvim起動時にハイライト表示がオンになる。これを設定ファイルに書き込 まない場合は「:set hls」でハイライトサーチがオンになる。なお、ハイラ イトサーチを解除するには「:nohls」を使う。

ハイライトサーチがオンになっている状態で何れかのバッファで検索すると ヒットした箇所が強調表示される。このとき他のバッファを表示させてみ る。そのバッファに同じ検索パターンがあるなら、それが強調表示されてい ることに気付く。ヒットのあるバッファ(のノーマルモード)で「n」または 「shift+n」を使うとヒット箇所を渡り歩くことができる。(その際にミニ バッファに検索パターンが表示されることもある。なお、vimを再起動して も前回検索パターンを保持しているようだ。どこに保存しているのだろ う)。

(注)コマンド・検索履歴は~/_viminfoに書き込まれている。
「q:」「q/ 」「q?」を入力すると表示される、コマンド実行履歴、検索履 歴の表示機能が邪魔だ、という意見をたまに聞くことがありますが、 その 考えは非常にもったいない考えです。 コマンドラインウィンドウ上でのコ マンド履歴、検索履歴の扱い方を学び、Vimエディタによる作業効率を上げ ましょう。 (Windows, Mac)
このことはvimのヘルプファイルのvim/doc/cmdline.txtに書かれている。 vim上では「:help q/」などで読める。

或る一つのバッファにしか存在しないパターンを検索する。ヒットのない別 のバッファに移り、そのノーマルモードで「n」または「shift+n」を使うと 「下(上)まで検索したけれど該当個所はありません」というメッセージが表 示されて、そのあとに検索パターンが表示される。それは直近で他のバッ ファで使った検索パターンである。

検索パターンは、最終検索パターンレジスタに保存されて全バッファ共通に 使われる。どれかのバッファで検索すると、そのパターンがレジスタに保存 される。他のバッファに移ってすぐに「n」または「shift+n」を使うと前回 どこかのバッファで使った検索パターンがそのまま次の検索パターンとして 使われることになる。新しい検索を行なうと、そのときの検索パターンで、 レジスタが保持している前回の検索パターンが上書きされる。

ハイライトサーチをオンにしていると、何れかのバッファで検索したパター ンが他のバッファにもあれば、そのバッファでも強調表示されていることに 気付く。さて、ハイライトサーチがオフの場合の挙動はどうなるであろう か。この場合はヒットしたパターンと同じ箇所の頭にカーソルが移動する。 「n」または「shift+n」で順番にヒット箇所を移動する。他のバッファでも ヒットがあればその部分にカーソルが飛ぶことを確認できる。強調表示にな らないだけでヒット箇所にカーソルが移動してゆく。

vim/doc/options.txtによるとhlsearch(hslに省略可能)は、「前回の検索パ ターンが存在するとき、それにマッチするテキストを全て強調表示する。」 (When there is a previous search pattern, highlight all its matches.)とある。(この内容は「:help hls」で読める。)

前回の検索パターンは、最終検索パターン用レジスタに蓄えられる。それを 読み出すには「:echo @/」を使う。このことはvim/doc/change.txtに書かれ ている。それは「:help @/」で読むことができる。このレジスタには、コマ ンド ":let" で書き込むことができる。(例: > :let @/ = "the")

vimで複数のバッファを開いているとき最終検索パターンレジスタには前回 どれかのバッファで検索した際のパターンが入っている。つまり「@/」は バッファ毎ではなく全バッファ共通の(グローバルな)レジスタである。

へそ曲がりな使い方になるが、「:let @/="the"」としたあとで「n」または 「shift+n」を使うとヒットする箇所(the)を巡り歩くことができる。

検索パターンの保持は最終の一つに限られる。前回の検索パターンは次回の 検索で置き換わる。そして保持している検索パターンは全バッファに共通で ある。どれかのバッファで検索したのちに、新たに開いたバッファでも使わ れる。再度同じ検索パターンを指定することなく、直ちに「n」または 「shift+n」を使うことができる。

| | コメント (1) | トラックバック (0)

« 2012年2月 | トップページ | 2012年4月 »