検索はカーソル移動の一種

はじめに

ここでは検索コマンドの基本的な使い方について説明します
検索コマンドを使う目的はいろいろです

などの目的で使うと思います. ここでは それぞれについて最適な検索方法を示します. また,

などの場合にはどうすれば良いのかについても解説します

検索の基本

まず,「〜について書いた場所(の周囲)が見たい」と思って検索機能を使う時には

/(文字列)

のように打てば,カーソルの後方向に文字列を探しに行って,見つかればその文字列の 最初の文字の位置にカーソルを移動させます
たとえば /abc とすれば, カーソル以後で最も最初に見付かった "abc" という文字列の場所にカーソルを移動させます. 逆方向への(カーソル位置から 前方への)検索は

?(文字列)

という形式です

次々と見付かった場所にどんどん移動させたい場合は

n

を打つごとに,「最も最近検索で使った文字を探して」移動します
n を連打しすぎて「前の場所にもどりたい」場合は

N

を押せば逆方向に検索して移動できます

カーソル位置の単語で検索

* を押すと,カーソル位置の文字列(単語)を検索文字列として検索します
逆向き(前方への検索)は # です. わざわざ文字列を入力する手間が省けるので 非常に便利です. 特にプログラムやスクリプトのように 変数名や関数名などの覚えにくい 文字がファイル中に何度も出てくるようなテキストの場合には めちゃくちゃ使えます
検索の繰り返しは, 通常の検索と同様, n N が使えます

ただし,検索文字列は「単語の終わりまで」と決められています. 日本語の文章の場合は, ひらがな,カタカナ,漢字などの文字の種類の変わり目までとなります. もし, 検索文字列が自分の希望よりも長すぎた場合は いったん `` CONT-O などでカーソルの場所を(もし移動していれば)戻してから /CONT-P … つまり/だけを打ってから CTRL-P を押すと, さっきの自動で入力された文字列がよみがえるので, バックスペースで必要な長さに してから(Return)でOKです. 短すぎた場合は,同様に CTRL-P してから, 足りない分をキー入力するしかないと思います

ちなみに, CTRL-Pするとよく分かりますが, 検索文字列の前後は 「 \< 」 と 「 \> 」 という文字で挟まれています. これは「単語の先頭」「単語の末尾」という意味の 記号で,別文章で説明しますが「正規表現」という特別な符号の ようなものです. とりあえず消してしまっても たいした害は無いです

カーソル移動や範囲指定の手段として気軽に使おう

JVimでの検索機能は,単なる文字列を探す手段だけではありません. 通常の カーソル移動コマンドと同等に使えるので, コマンドの適用範囲を指定する 手段としても使えるのです. ですから d/abc ならば「カーソル位置から最初に"abc"という文字のある場所まで」 を削除しますし c?abc ならば 「カーソル位置から前方に"abc"が 見付かる場所」の変更コマンドとなります

このように使うようになると,「検索単語の最初の文字」への移動だけじゃなくて もう少し細かい単位でカーソルを飛ばしたくなってくることでしょう

/abc/e

とすると,「検索した"abc"の最後の文字 , つまり"c"の位置」に移動できます

/abcde/s+3

とすると「検索した"abcde"の最初の文字から3文字後,つまり"d"」に移動します
ちなみに s は"start", e は"end"の意味と考えると覚えやすいと思います
数値をつけると検索文字列の最初や最後の文字からの移動量となります. たとえば

/abc/s-2

ならば,「"abc"の"a"の文字よりも2文字分左の文字」へ

/abc/e+4

ならば,「"abc"の"c"よりも4文字分右」へ移動します

検索文字から前後の行への移動量も書けます
/abc/+3 とすれば「"abc"の見付かった行の3行後」へ ?abc?-5 とすれば「前方に"abc"の見付かった行の5行前」へ移動します

検索の中断

巨大なファイルを検索させた場合に,かなり時間がかかりそうなので中断させたい ことがあります. あるいは間違えた単語で検索を開始してしまうこともあるかと 思います. こういう時には CTRL-C を押せば, 即座に検索を中断して,次のコマンドが打てるようになります

カーソルが予期せぬ場所に移動してしまったら

検索文字列を間違えてしまったり,その他の原因で変な場所にカーソルを飛ばして しまった場合,元の位置をおぼえてなかったりして困ったことは無いでしょうか ?

別に検索コマンドに限った話じゃないですが `` と押すだけで, ジャンプする前の場所に戻れます. ちょっと見に行ってすぐ戻ってくることが できるので便利です. ファイル上の二箇所を行ったり来たりする時にも使えます

CONT-O も,過去にいたカーソル位置に戻るコマンドです. こっちは, ファイルを越えて戻ることもできます. しかも CONT-O を押すごとに, どんどん過去にいた場所にカーソルが戻せるので非常に便利だし, CONT-I を押せば, 逆に最近のカーソル位置に戻ってくることが可能なので使い勝手が良い です

過去に使った検索文字列で再び検索

「直前の」検索文字列ならば n N で再び検索ができますが, 何度も前に使った検索文字列で再び検索したくなった場合はどうしますか ? 再びキーボードから検索文字列を打ち込むのは面倒ですよね. こういう時は
/ または ? だけをまず打っておいてから CONT-P を押すごとに, 一回前,二回前,三回前… という具合に,過去に検索した文字列がよみがえってきます.「これだ」とおもったら, そのまま(Return)で検索開始です

ファイル全体を一括検索して一覧する

検索したい文字が見付かった場所にひとつづつ次々と移動したいのではなくて 「文字列が見付かった場所を一度に全部表示させたい」ということもありますよね

:g/abc/#

とすると,ファイル中で文字列"abc"が存在する行全部を行番号つきで一覧表示 します. 表示項目が多い時には多少画面がスクロールしますが, 一時的なものなので 心配は無用です. 表示を見たら何か次のコマンドを押したりすれば 正常に戻ります. また, このコマンドを打ってカーソル位置が変な場所に 移動してしまったらあわてずに `` CONT-O を打てば, 検索前のカーソル位置に戻ることができます. ちなみに g は"global" の略です.「全部を一度に」程度の意味ですね

複数のファイル内を一括検索

ここまでは「現在編集中のファイル内」での検索でしたが,ディレクトリ中の すべてのファイルを一括して検索したいこともあるでしょう. こういう時は, 外部の本物の"grep"コマンドを使うとよいでしょう. JVimが起動されている時ならば

:r!grep -n abc *

などとすれば "abc"という文字列を,ディレクトリ内のすべてのファイルについて 検索して,結果を編集中のファイルのカーソルのある場所に読み込みます. もちろん, 検索対象は "*"に限らず,自分の目的に合った指定ができますし, grep の様々なオプションも,そのまま使えます
ファイル上に結果が書き出されますが,uを押せば検索前の画面に戻れるので あわてないように

なお,「grepコマンドを使う前に,ディレクトリ名や,そこのファイル名を確認したい」 場合は :pwd でディレクトリ名の確認, :!ls でそこにある ファイルの一覧が見れるし, :cd (場所) で, ディレクトリの変更ができます

grepに -n をつけて検索していれば,検索結果の見に行きたい行にカーソルを 置いた状態で

gg

と打てば,実際のファイルを開いて該当する行を表示することができて便利です
表示していたgrep結果は, u と押せば検索前の状態に片付きます

必要な行だけ, どこかにわざと書いておけば,そのファイルの該当する行に いつでも gg コマンドで飛べますので,よく参照する行を特定の場所に書いて おいて便利に使うこともできますね

検索関連の設定

最後に,検索に関する設定オプションを説明します

:set ic

とすると,それ以降の検索ではアルファベットの大文字と小文字を区別せずに 検索するようになります. :set noic で元の(区別する)状態に戻れます
オプション名 ic ignorecase の略です. 長い名前なので普通は ic と 略して使います
さらに :set jignorecase または :set jic とすると日本語のひらがなとカタカナも 区別せずに検索するようになります. 解除は :set nojic です
なお, ic jic はどちらか一方でも設定されていれば大文字小文字を区別しない ので注意が必要です. 普段,設定する時は どちらか一方だけを使うようにすると 混乱が無くてよいと思われます

一時的に「大文字小文字を無視」させたい場合は, オプションを変更しなくても /(文字列)/i のように 検索文字列の後ろに "i"という文字を入れると, 設定に関係なくいつでも大文字小文字を無視した検索ができます

次に

:set wrapscan

とすると,後方検索の時に,ファイルの最後まで検索しても文字列が見付からなかった 場合に,再びファイルの先頭に戻って検索を開始するようになります
これも好みで設定するとよいと思います


前項目, 「文字の削除と変更コマンド」へ

目次へ

次項目, 「文字のコピーや移動の基本」へ