OpenGrokの使い方

# 各画面の説明
## トップページ

![image](https://qiita-image-store.s3.amazonaws.com/0/31974/b9b4aa06-09e8-ca89-892e-741d4ae1119c.png)

左のフィールドで検索対象ごとに検索キーを入力します。
右のコンボボックスで検索対象となるプロジェクトを指定します。

## 検索対象
検索対象は次の5つです。複数同時にキーを指定するとAND検索になります。

* Full Search  
    すべてのトークン(単語、文字列リテラル、識別子、数値)  
    シンボルに該当しない単語(キーワード、文字列、コメントなど)はここでしか検索できない
* Definition  
    シンボル(クラス、関数、変数、マクロ等の名前)の定義
* Symbol  
    シンボルの定義と参照  
    Definitionと異なり、シンボルを使っている場所にもヒットする
* File Path  
    ファイルやディレクトリ/フォルダの名前
* History  
    バージョン管理システムのコメント

OpenGrokはトークン単位で検索を行います。例えば、`print`は`println`にヒットしません。これはファイルパスであっても同様で、`foo`は`/foo/bar`にヒットしますが、`/foobar/baz`にはヒットしません。

トークンの一部分を検索するにはワイルドカードを使用します。

### プロジェクト

プロジェクトは複数指定できます。ここでプロジェクト名をダブルクリックするとプロジェクト内のディレクトリを閲覧できます。

## 検索結果

![image](https://qiita-image-store.s3.amazonaws.com/0/31974/621a5205-944e-f20f-d839-3be54f42e7c6.png)

ファイル名をクリックすると、ファイルの先頭へジャンプします。
右半分のヒットした行をクリックすると、その行へジャンプします。

ファイル名の左にあるショートカットリンクの意味は次の通りです。

* H: ファイルの履歴を表示します
* A: Annotate: 行ごとに最終更新者を表示します
* D: このファイルをダウンロードします

## ファイルの閲覧
![image](https://qiita-image-store.s3.amazonaws.com/0/31974/c90cd019-ef61-ec9b-fbe8-136c05bfcb9c.png)

* Home: トップに戻ります
* History: ファイルの履歴を表示します
* Annotate: 行ごとに最終更新者を表示します
* Line#: 行番号の表示を切り替えます
* Navigate: ナビゲーションウィンドウの表示を切り替えます
* Download: このファイルをダウンロードします

ナビゲーションウインドウでは、ファイル内にあるシンボルの定義へジャンプすることができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/31974/8fa75634-d262-39c4-cffd-445b5300a66c.png)

* 行番号をクリックするとその行にジャンプします。このとき、アドレスバーからその行のURLが取得できます
* シンボルをクリックするとそのシンボルの定義か参照を検索します

## 履歴の閲覧

プロジェクトをバージョン管理システムからインポートしている場合は、履歴をOpenGrok上で確認することができます。

Historyではファイルの変更履歴を確認できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/31974/950d29b1-4e9c-b8d9-b99d-affd6b4a1958.png)

リビジョン番号をクリックするとその時点での内容を確認できます。また、Compareボタンで、ラジオボタンで選択した2つのリビジョン間の差分を確認できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/31974/89872412-a887-47d9-16fe-9b22bbe0087b.png)

Annotateでは行ごとの最終更新リビジョンと更新したユーザーを確認できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/31974/fc653b1b-3b10-9d22-5e5b-5a682fffee10.png)

# 発展的な検索機能

この章はヘルプの翻訳です。

検索クエリはスペースで区切られた節の列です。節の前には`+`、`-`およびフィールド名を付けることができます。

* `+`を付けると、「その節がヒットする」ファイルを探します(省略可)
* `-`を付けると、「その節がヒットしない」ファイルを探します
* 以下の`フィールド名:`を付けると、その節を検索するフィールドを限定します(画面上の表記と名前が違います)
    * `full:` Full Search
    * `defs:` Definition
    * `refs:` Symbol
    * `path:` File Path
    * `hist:` History

Webフォームから検索する場合、入力するフィールドによってフィールド名のデフォルト値が決まります。

節は以下のものから成ります。

* 単語: その単語自体にヒットする
* 句: スペース区切りの単語列を" "で囲んだもの
* クエリーグループ: 検索クエリーを( )で囲んだもの

節には以下の論理演算が行えます。

* `AND` または `&&`
* `OR` または `||`
* `NOT` または `-`

AND、OR、NOTはすべて大文字で、AND、ORは中置記法の2項演算子、NOTは前置記法の単項演算子です。

## ワイルドカード

単語の検索にワイルドカードが使用できます。ただし、単語の先頭には使えません。

* `*` 任意の$n$文字 $(n \ge 0)$ を表す
* `?` 任意の1文字を表す

例えば、`print*`は`print`、`println`、`printf`等にヒットします。

ワイルドカードは単語を超えません。例えば、`foo*ar`は`foobar`にヒットしますが、`foo bar`にはヒットしません。

## 例
`setResourceMonitors`が定義されている場所を探す

```
defs:setResourceMonitors
```

`usr/src/cmd/cmd-inet/usr.sbin/`の下で`sprintf`を使っているファイルを探す

```
refs:sprintf path:usr/src/cmd/cmd-inet/usr.sbin
```

変数`Asign`へ代入している場所を探す

```
"Asign="
```

`pstack`をビルドするMakefileを探す

```
pstack path:Makefile
```

`Bill Joy`という句を探す

```
"Bill Joy"
```

`/usr/bin/perl`ではなく`/bin/perl`を指定しているperlファイルを探す

```
-"/usr/bin/perl" +"/bin/perl"
```

`foo`から始まる語を探す

```
foo*
```

ファイル名に". c"を含むファイルを探す

```
path:". c"
```

# Tips

## モジュールを絞り込む

パッケージや名前空間を限定する機能はありませんが、File Pathフィールドにモジュールのディレクトリ名を指定することで疑似的にモジュール名での絞り込みができます。

## オブジェクト(インスタンス)を作っている場所を探す

クラス`Klass`をインスタンス化している場所を探すには、Full Searchで次のように検索します。
(`new クラス名`でインスタンス化する言語の場合)

```:Klassをインスタンス化している場所を探す
"new Klass"
```

ダブルクォートが無いとただのAND検索になり、`Klass = func("new");` などにもヒットしてしまいます。

## 派生クラスを探す

```:Klassを派生している場所を探す(C++)
"public Klass"
```

# リンク

* [OpenGrok](http://opengrok.github.io/OpenGrok/)
* [OpenGrokの導入](http://qiita.com/wwwaltz/items/61a803ef868d55501632)
* [OpenGrokによるソースコード検索環境の構築](http://qiita.com/vmmhypervisor/items/23e9ea60863c15014836)
* OpenGrok設置例 http://src.illumos.org/source/  
     今回のスクリーンショットはこちらから取得しました。