これからVimを触る人向け！Vimの検索機能を駆使して調査と開発をスムーズに

前回の「[これからVimを触る人向け！今まで使っていたエディタのようにVimを使いはじめる。](http://qiita.com/kmszk/items/9be187a47d5806b113da)」の続きになります。こちらもあわせてご覧くださいm(_ _ )m

今回は開発や調査をする上でVimでプログラムのソースコードの検索を行っていく方法を紹介していきます。
Vimでソースコード検索ができるようになると、急にサーバーに入ってソースの調査をしなければいけない場合や普段の開発にもかなり有用です。

（※今回紹介するものはすべてVimのコマンドモードから実行可能なものです）

#複数ファイルで特定文字列の検索
プログラムを書いていると、特定のクラスがどこで定義されているのか、この定数がどこで定義されているのかなど調べなければいけない場合があるかと思います。そんな場合でもVimはデフォルトで複数ファイルの特定文字列の検索機能を提供しています。

| :vim(grep) 文字列 検索対象階層・ファイル &#124; cw |特定の文字列を検索対象階層・ファイル|
| --- | --- |
|(例):vim hoge ***/** &#124; cw|vimを開いた階層以下のファイルをhogeという文字列で検索|
|(例):vim abc test/*.py &#124; cw| 「test」階層以下の.pyの拡張子のファイルをabcという文字列で検索|

「**&#124; cw**」はなくても検索出来るのですが、この「**&#124; cw**」をつけることによって、検索結果をVimのQuickfixリスト（ファイル一覧）を開いて検索結果を一覧で表示してくれます。

![スクリーンショット 2015-06-07 23.19.40.png](https://qiita-image-store.s3.amazonaws.com/0/73446/35bf8c03-803e-20a3-7acd-1363da570e4b.png)

検索結果のリストのエリアは通常のウインドウ扱いです。
（Ctrl-w h,j,k,lで画面を移動して、ファイル名にカーソルを置いてEnterでオープン、
いらなくなったウインドウは:qで終了）

#『高速に』複数ファイルで特定文字列の検索
先ほど:vim(grep)を利用して複数ファイルで特定文字列の検索を行えるようになったかと思いますが、次は『**高速に**』複数ファイルで特定文字列の検索をする方法を紹介します。
と言うのも、実は:vimでの検索は結構遅く、ファイル数が増えると待ち時間も少しずつ伸びていきます。

|:grep 検索文字列 検索対象階層・ファイル|検索文字列を検索対象からgrepで検索|
| --- | --- |
|(例):grep hoge ***/**|Vimを開いた階層以下でhogeをgrep検索|
|:grep abc test/*.py| 「test」階層以下の.pyの拡張子のファイルをabcという文字列でgrep検索|

こちらのほうがかなり高速に検索が可能です。
となると、:vimではなくこちらの検索を使えばいいじゃないかと思われそうですが、実はこちらの:grep検索はVimで開きやすいようには出力してくれません。

![スクリーンショット 2015-06-07 23.21.32.png](https://qiita-image-store.s3.amazonaws.com/0/73446/06450810-d3a6-cc16-f986-a59dd8d5669e.png)

通常のgrepと同じ検索結果をVimを一旦抜けたような状態で表示してくれます。
そしてgrep検索の一番上の結果を開いてくれます。

では、grepした検索結果をどうやってVimに取り入れていくかというと、:grep検索結果ではパスを表示してくれますので、パスをマウスドラッグしてコピーして、

```vim
:e path/to/text/file.txt
```

のようにVimのコマンドに貼り付けてエディタで開けばよい感じです。

もう一回:grep検索の結果を見たい場合には、**Ctrl-z**でVimをバックグラウンドに回して抜けたところに結果が出力してありますので、一旦抜けてお目当てのファイルパスをコピーして、**fg**で戻り、**:e**コマンドに再度パスを突っ込んで開くという流れになってきます。

こちらはとりあえず「Vim上からgrep検索出来ますよ」くらいの位置づけかなと個人的に思っていますが、高速なので結構使いやすいです。

（※プラグインを用いたり、.vimrcの設定次第では:grep検索でもQuickfixのリストが使えるようになるとのこと。）


=================【追記】=================
[コメント](#comment-4d62e566c66db98a3da6)よりご指摘いただきまして、:grepで検索後

```vim
:copen
```
でQuickfixで検索結果一覧を開けるそうです！（:vimと同じ検索結果一覧です。）
[h141dev](http://qiita.com/h141dev)さん ありがとうございます！


#お手軽ファイル内検索
変数、関数検索のための便利な単語検索コマンドがあります。
こちらを利用する事でファイル内検索するために毎回単語を入力する必要がなくなります。

|（単語の上にカーソルを置き）* |カーソルが乗っている単語を検索|
| --- | --- |
| n | 次の検索候補 |
| N | 前の検索候補 | 
|zz|カーソルのある行を画面の中央へ|

**n**（**N**）で検索候補を移動していくうちにカーソルが画面の一番下にあってその周辺のソースをもっと見たいんだけど…という状態になることもあるかと思います。その場合には「**zz**」コマンドをコマンドで打つと、カーソルがある行を画面の真ん中に移動することができます。（**zz**コマンドは検索専用ではなくVimのコマンドモードでいつでも使えるコマンドです）

#関数ジャンプ

IDE使っている人は関数ジャンプがあるから使うという人も中にはいるのではないでしょうか。
実はVimにも関数ジャンプは用意されていますが、若干設定が必要になります。
設定した階層内であれば、関数ジャンプで移動がかなり楽になります。

今回は**ctags**というものを使って、Vimで関数ジャンプを利用できるようにします。

まずはctagsが環境にインストールされているか確認しましょう。
Vim を抜けてから

```bash
$ ctags --help
```
やら

```bash
$ which ctags
``` 
と打って、環境にインストールされているか確認してみましょう。

無い場合には

```bash
$ yum install ctags
```
yumなどでインストールしてしまいましょう。


次に開発しているプロジェクトのルートディレクトリに対して

```bash
$ ctags -f ~/.tags -R /path/to/project/ --exclude=.git --exclude=.svn
```

などと入力しましょう。
**--exclude**は除外条件の指定になりますので必要に応じて。
このコマンドでは、~/.tagファイルが作成されます。

**ctags**による関数ジャンプが利用可能になります。特にパスを指定しない場合にはプロジェクトのパスにtagsファイルが作成されます。この生成されたtagsファイルをVimで読み込めれば関数ジャンプを使えるようになります。

コマンドラインから

```vim
:set tags+=~/.tags
```

または.vimrcで

```vim
set tags+=~/.tags
```

で読み込んだあとに以下のコマンドで関数ジャンプを利用します。


|（関数を呼び出している関数名の上で）Ctrl-]|定義元へジャンプ|
| --- | --- |
|Ctrl-t|直前のタグへ|
|Ctrl-w ctrl-]|プレビューウインドウで定義元を開く|

![ctags.jpg](https://qiita-image-store.s3.amazonaws.com/0/73446/511b957e-3296-a932-506d-c9f600f0976b.jpeg)

**ctags**のもっと詳しい使い方を知りたい方は、Qiitaなどで専用の記事を探すことをお勧めいたしますm(_ _)m

#行番号指定移動
最後に基本中の基本ですが表示行番号指定の紹介です。
プログラムがエラーになった場合、大抵エラー行数が出る場合があるかと思います。
ファイルを行番号を狙って開くにはコマンドモードから、

|:e +（数字）対象ファイル | 指定の数字の行番号まで行移動 |
| --- | --- |
|(例):tabe +5 hello.js| hello.js を新しいタブで5行目から開く |

ちなみに行数表示はコマンドモードから

| :set nu | エディタ左に常に行数表示（.vimrcに設定可能） |
| --- | --- |
| Ctrl-g | カーソルの位置の行数と編集ファイル名をエディタ下部に表示 |

ファイルを開いてからの行番号指定の移動はコマンドモードで

|（数字）G | 開いてから指定の数字の行番号まで行移動 |
| --- | --- |

などで可能です。

#まとめ
今回はVimのファイル検索をメインに紹介しましたが、ファイル検索をひと通り覚えると有事の際の調査や通常の開発にもかなり有用です。

ここまでVimだけでできるようになると、だんだんと開発でIDEを開かなくてもよくなってくるのではないでしょうか？

自分は今は開発環境を完全にVimに移して、Vimだけでは難しいプロジェクト管理自体はSVN(都合でGitではなく)のブランチを切っていってそちらに一任しています。IDEでやっていた事がどんどんコマンド上で完結していき、なおかつIDEより高速ですので、暫くはこのままVimで開発していきたいと思います。